X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fvlogin.c;h=ca75719bfc90f1a97ad9ccb4c61e36b83176a1cd;hb=a741f6faf2baae1e823d334012f6a09e6a1bda51;hp=f42bfd3f668625bcf64632cd97b404ce861468fd;hpb=3b34449070c0846fdc49436d1edd5916512f1644;p=util-vserver.git diff --git a/src/vlogin.c b/src/vlogin.c index f42bfd3..ca75719 100644 --- a/src/vlogin.c +++ b/src/vlogin.c @@ -1,4 +1,4 @@ -// $Id: vlogin.c 2325 2006-09-21 19:42:31Z dhozac $ +// $Id: vlogin.c 2525 2007-04-08 00:40:16Z dhozac $ // Copyright (C) 2006 Benedikt Böhm // Based on vserver-utils' vlogin program. @@ -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 */