--- /sys/src/cmd/ssh2/netssh.c +++ /sys/src/cmd/ssh2/netssh.c @@ -1364,6 +1364,15 @@ } 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, toks[0]); + add_byte(p, 0); + if(ntok > 1) + add_uint32(p, strtol(toks[1], nil, 10)); + else + add_uint32(p, 0); } else respexit(c, r, buf, "bad request command"); n = finish_packet(p); --- /sys/src/cmd/ssh2/sshsession.c +++ /sys/src/cmd/ssh2/sshsession.c @@ -444,11 +444,30 @@ return q; } +static long +exitstatus(char *s) +{ + long n; + char *p; + + if(s == nil || *s == '\0') + return 0; + s = strchr(s, ':'); + if(s == nil) + return 1; + n = strtol(s+1, &p, 10); + if(p == s+1) + return 1; + return n; +} + void runcmd(int reqfd, int datafd, char *svc, char *cmd, char *arg1, char *arg2) { char *p; - int fd, cmdpid, child; + Waitmsg *w; + int fd, cmdpid; + ulong status; cmdpid = rfork(RFPROC|RFMEM|RFNOTEG|RFFDG|RFENVG); switch (cmdpid) { @@ -483,10 +502,18 @@ default: close(datafd); fprint(errfd, "waiting for child %d\n", cmdpid); - while ((child = waitpid()) != cmdpid && child != -1) - fprint(errfd, "child %d passed\n", child); - if (child == -1) + while ((w = wait()) != nil && w->pid != cmdpid){ + fprint(errfd, "child %d passed\n", w->pid); + free(w); + } + if (w == nil) fprint(errfd, "wait failed: %r\n"); + else { + status = exitstatus(w->msg); + fprint(errfd, "child %d exits(%s) status %lud\n", w->pid, w->msg, status); + fprint(reqfd, "exit-status %lud", status); + free(w); + } syslog(0, "ssh", "server closing ssh session for %s", uname); fprint(errfd, "closing connection\n");