summaryrefslogtreecommitdiffhomepage
path: root/svr-chansession.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2007-02-09 10:43:16 +0000
committerMatt Johnston <matt@ucc.asn.au>2007-02-09 10:43:16 +0000
commitf5ad5c15531a8288222aeafa5b28f30298b3497f (patch)
tree63a0e1f29db3403d6b86d82486629a1a9ba5f870 /svr-chansession.c
parentcda7af7ca2fe9fb8d848e7891a528e63531a4e8d (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.c21
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);