Mercurial > dropbear
diff svr-chansession.c @ 1625:79eef94ccea9
Split ChanType closehandler() and cleanup() so that dbclient doesn't
lose exit status messages
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Wed, 14 Nov 2018 22:57:56 +0800 |
parents | 47f36d8565cf |
children | 592a18dac250 |
line wrap: on
line diff
--- a/svr-chansession.c Wed Nov 14 22:52:04 2018 +0800 +++ b/svr-chansession.c Wed Nov 14 22:57:56 2018 +0800 @@ -51,6 +51,7 @@ static void addchildpid(struct ChanSess *chansess, pid_t pid); static void sesssigchild_handler(int val); static void closechansess(const struct Channel *channel); +static void cleanupchansess(const struct Channel *channel); static int newchansess(struct Channel *channel); static void chansessionrequest(struct Channel *channel); static int sesscheckclose(const struct Channel *channel); @@ -69,6 +70,7 @@ sesscheckclose, /* checkclosehandler */ chansessionrequest, /* reqhandler */ closechansess, /* closehandler */ + cleanupchansess /* cleanup */ }; /* required to clear environment */ @@ -91,7 +93,7 @@ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { unsigned int i; struct exitinfo *ex = NULL; - TRACE(("sigchld handler: pid %d", pid)) + TRACE(("svr_chansess_checksignal : pid %d", pid)) ex = NULL; /* find the corresponding chansess */ @@ -285,8 +287,25 @@ return li; } +/* send exit status message before the channel is closed */ +static void closechansess(const struct Channel *channel) { + struct ChanSess *chansess; + + TRACE(("enter closechansess")) + + chansess = (struct ChanSess*)channel->typedata; + + if (chansess == NULL) { + TRACE(("leave closechansess: chansess == NULL")) + return; + } + + send_exitsignalstatus(channel); + TRACE(("leave closechansess")) +} + /* clean a session channel */ -static void closechansess(const struct Channel *channel) { +static void cleanupchansess(const struct Channel *channel) { struct ChanSess *chansess; unsigned int i; @@ -301,8 +320,6 @@ return; } - send_exitsignalstatus(channel); - m_free(chansess->cmd); m_free(chansess->term);