X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvlogin.c;h=dc47f9334dd7979ac75022452eab2ee8c65ec3e7;hb=61a61f4696647f0890685c999d5ecf21d98ad304;hp=70a8aed9a9742b93c62f911ddd776b5de2e7f50f;hpb=0a085a83576911f849c718e0e7a3d6d4865145d6;p=util-vserver.git diff --git a/src/vlogin.c b/src/vlogin.c index 70a8aed..dc47f93 100644 --- a/src/vlogin.c +++ b/src/vlogin.c @@ -38,6 +38,7 @@ #include #include #include +#include #define ENSC_WRAPPERS_PREFIX "vlogin: " #define ENSC_WRAPPERS_IOCTL 1 @@ -124,7 +125,7 @@ terminal_redraw(void) } /* copy terminal activities */ -static void +static ssize_t terminal_copy(int src, int dst) { char buf[64]; @@ -137,10 +138,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 */ @@ -194,11 +197,11 @@ signal_handler(int sig) } -void do_vlogin(int argc, char *argv[], int ind) +void do_vlogin(int UNUSED argc, char *argv[], int ind) { int slave; pid_t pid; - int n, i; + int n; fd_set rfds; if (!isatty(0) || !isatty(1)) { @@ -250,12 +253,7 @@ void do_vlogin(int argc, char *argv[], int ind) t.pid = pid; /* set process title for ps */ - n = strlen(argv[0]); - - for (i = 0; i < argc; i++) - memset(argv[i], '\0', strlen(argv[i])); - - strncpy(argv[0], "login", n); + prctl(PR_SET_NAME, (unsigned long) "login"); /* we want a redraw */ terminal_redraw(); @@ -276,11 +274,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 */