ssh2: from steve stallion. The exit-status request message is needed to script externally. Reference: /n/atom/patch/applied2013/ssh2exit Date: Fri Sep 27 21:27:35 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/ssh2/sshtun.c Fri Sep 27 21:27:35 2013 +++ /sys/src/cmd/ssh2/sshtun.c Fri Sep 27 21:27:35 2013 @@ -1308,6 +1308,13 @@ add_string(p, cmd); free(cmd); } + else if (strcmp(toks[0], "exit-status") == 0) { + add_byte(p, SSH_MSG_CHANNEL_REQUEST); + add_uint32(p, ch->otherid); + add_string(p, "exit-status"); + add_byte(p, 0); + add_uint32(p, atoi(toks[1])); /* exit_status */ + } else { r->aux = 0; respond(r, "invalid request command"); --- /sys/src/cmd/ssh2/sshsession.c Fri Sep 27 21:27:35 2013 +++ /sys/src/cmd/ssh2/sshsession.c Fri Sep 27 21:27:35 2013 @@ -381,7 +381,8 @@ runcmd(int reqfd, int datafd, char *svc, char *cmd, char *arg1, char *arg2) { char *p; - int fd, cmdpid, child; + int fd, cmdpid; + Waitmsg *w; cmdpid = rfork(RFPROC|RFMEM|RFNOTEG|RFFDG); switch (cmdpid) { @@ -413,13 +414,17 @@ close(datafd); while (1) { fprint(errfd, "waiting for child %d\n", cmdpid); - child = waitpid(); - fprint(errfd, "child %d passed\n", child); - if (child == cmdpid || child == -1) + w = wait(); + fprint(errfd, "child %d passed\n", w->pid); + if (w->pid == cmdpid || w->pid == -1) break; + free(w); } - if (child == -1) + if (w->pid == -1) fprint(errfd, "wait failed: %r\n"); + else + fprint(reqfd, "exit-status %d", w->msg[0]); + free(w); if (slfd > 0) fprint(slfd, "closing ssh session for %s\n", uname); else