diff options
author | Matt Johnston <matt@ucc.asn.au> | 2007-02-09 10:43:16 +0000 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2007-02-09 10:43:16 +0000 |
commit | f5ad5c15531a8288222aeafa5b28f30298b3497f (patch) | |
tree | 63a0e1f29db3403d6b86d82486629a1a9ba5f870 /svr-chansession.c | |
parent | cda7af7ca2fe9fb8d848e7891a528e63531a4e8d (diff) |
Improve behaviour when flushing out after a process has exited.
--HG--
branch : channel-fix
extra : convert_revision : e73ee8f7ae404a9355685c30828a0ad4524031bc
Diffstat (limited to 'svr-chansession.c')
-rw-r--r-- | svr-chansession.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/svr-chansession.c b/svr-chansession.c index a45e7a6..23cac85 100644 --- a/svr-chansession.c +++ b/svr-chansession.c @@ -120,9 +120,21 @@ static void sesssigchild_handler(int UNUSED(dummy)) { /* we use this to determine how pid exited */ exit->exitsignal = -1; } + + /* Make sure that the main select() loop wakes up */ + while (1) { + /* EAGAIN means the pipe's full, so don't need to write anything */ + /* isserver is just a random byte to write */ + if (write(ses.signal_pipe[1], &ses.isserver, 1) == 1 || errno == EAGAIN) { + break; + } + if (errno == EINTR) { + continue; + } + dropbear_exit("error writing signal pipe"); + } } - sa_chld.sa_handler = sesssigchild_handler; sa_chld.sa_flags = SA_NOCLDSTOP; sigaction(SIGCHLD, &sa_chld, NULL); @@ -244,16 +256,17 @@ static void closechansess(struct Channel *channel) { unsigned int i; struct logininfo *li; - chansess = (struct ChanSess*)channel->typedata; + TRACE(("enter closechansess")) - send_exitsignalstatus(channel); + chansess = (struct ChanSess*)channel->typedata; - TRACE(("enter closechansess")) if (chansess == NULL) { TRACE(("leave closechansess: chansess == NULL")) return; } + send_exitsignalstatus(channel); + m_free(chansess->cmd); m_free(chansess->term); |