X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvlogin.c;h=9466ad85a3380bd00a40671fd614983595681a0b;hb=b1dbdec10c0cadc46a58889d738c8ab1c92a07e9;hp=70a8aed9a9742b93c62f911ddd776b5de2e7f50f;hpb=0a085a83576911f849c718e0e7a3d6d4865145d6;p=util-vserver.git diff --git a/src/vlogin.c b/src/vlogin.c index 70a8aed..9466ad8 100644 --- a/src/vlogin.c +++ b/src/vlogin.c @@ -124,7 +124,7 @@ terminal_redraw(void) } /* copy terminal activities */ -static void +static ssize_t terminal_copy(int src, int dst) { char buf[64]; @@ -137,10 +137,12 @@ terminal_copy(int src, int dst) terminal_kill(SIGTERM); exit(1); } else if (len == -1) - return; + return -1; /* write activity to user */ EwriteAll(dst, buf, len); + + return len; } /* shuffle all output, and reset the terminal */ @@ -276,11 +278,21 @@ void do_vlogin(int argc, char *argv[], int ind) exit(wrapper_exit_code); } - if (FD_ISSET(STDIN_FILENO, &rfds)) - terminal_copy(STDIN_FILENO, t.fd); + if (FD_ISSET(STDIN_FILENO, &rfds)) { + /* EOF */ + if (terminal_copy(STDIN_FILENO, t.fd) == 0) { + terminal_kill(SIGHUP); + exit(0); + } + } - if (FD_ISSET(t.fd, &rfds)) - terminal_copy(t.fd, STDOUT_FILENO); + if (FD_ISSET(t.fd, &rfds)) { + /* EOF */ + if (terminal_copy(t.fd, STDOUT_FILENO) == 0) { + terminal_kill(SIGHUP); + exit(0); + } + } } /* never get here, signal handler exits */