Module Name: src Committed By: tls Date: Sun Aug 10 06:58:50 UTC 2014
Modified Files: src/usr.bin/rsh [tls-earlyentropy]: rsh.c Log Message: Rebase. To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.33.18.1 src/usr.bin/rsh/rsh.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/rsh/rsh.c diff -u src/usr.bin/rsh/rsh.c:1.33 src/usr.bin/rsh/rsh.c:1.33.18.1 --- src/usr.bin/rsh/rsh.c:1.33 Mon Aug 29 14:22:46 2011 +++ src/usr.bin/rsh/rsh.c Sun Aug 10 06:58:49 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rsh.c,v 1.33 2011/08/29 14:22:46 joerg Exp $ */ +/* $NetBSD: rsh.c,v 1.33.18.1 2014/08/10 06:58:49 tls Exp $ */ /*- * Copyright (c) 1983, 1990, 1993, 1994 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19 #if 0 static char sccsid[] = "@(#)rsh.c 8.4 (Berkeley) 4/29/95"; #else -__RCSID("$NetBSD: rsh.c,v 1.33 2011/08/29 14:22:46 joerg Exp $"); +__RCSID("$NetBSD: rsh.c,v 1.33.18.1 2014/08/10 06:58:49 tls Exp $"); #endif #endif /* not lint */ @@ -76,7 +76,9 @@ int remerr; static int sigs[] = { SIGINT, SIGTERM, SIGQUIT }; static char *copyargs(char **); +#ifndef IN_RCMD static void sendsig(int); +#endif static int checkfd(struct pollfd *, int); static void talk(int, sigset_t *, pid_t, int); __dead static void usage(void); @@ -265,6 +267,7 @@ main(int argc, char **argv) (void)sigprocmask(SIG_BLOCK, &nset, &oset); +#ifndef IN_RCMD for (i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++) { struct sigaction sa; @@ -273,6 +276,7 @@ main(int argc, char **argv) (void)sigaction(sigs[i], &sa, NULL); } } +#endif if (!nflag) { pid = fork(); @@ -282,13 +286,8 @@ main(int argc, char **argv) else pid = -1; -#if defined(KERBEROS) && defined(CRYPT) - if (!doencrypt) -#endif - { - (void)ioctl(remerr, FIONBIO, &one); - (void)ioctl(rem, FIONBIO, &one); - } + (void)ioctl(remerr, FIONBIO, &one); + (void)ioctl(rem, FIONBIO, &one); talk(nflag, &oset, pid, rem); @@ -305,17 +304,12 @@ checkfd(struct pollfd *fdp, int outfd) if (fdp->revents & (POLLNVAL|POLLERR|POLLHUP)) return -1; - + if ((fdp->revents & POLLIN) == 0) return 0; errno = 0; -#if defined(KERBEROS) && defined(CRYPT) - if (doencrypt) - nr = des_read(fdp->fd, buf, sizeof buf); - else -#endif - nr = read(fdp->fd, buf, sizeof buf); + nr = read(fdp->fd, buf, sizeof buf); if (nr <= 0) { if (errno != EAGAIN) @@ -339,7 +333,7 @@ static void talk(int nflag, sigset_t *oset, __pid_t pid, int rem) { int nr, nw, nfds; - struct pollfd fds[2], *fdp = &fds[0]; + struct pollfd fds[3], *fdp = &fds[0]; char *bp, buf[BUFSIZ]; if (!nflag && pid == 0) { @@ -380,12 +374,7 @@ rewrite: if (poll(fdp, 1, INFTIM) == -1 if ((fdp->revents & POLLOUT) == 0) goto rewrite; -#if defined(KERBEROS) && defined(CRYPT) - if (doencrypt) - nw = des_write(rem, bp, nr); - else -#endif - nw = write(rem, bp, nr); + nw = write(rem, bp, nr); if (nw < 0) { if (errno == EAGAIN) @@ -400,39 +389,57 @@ done: exit(0); } - (void)sigprocmask(SIG_SETMASK, oset, NULL); - fds[0].events = fds[1].events = POLLIN|POLLNVAL|POLLERR|POLLHUP; - fds[0].fd = remerr; - fds[1].fd = rem; +#ifdef IN_RCMD fdp = &fds[0]; + nfds = 3; + fds[0].events = POLLIN|POLLNVAL|POLLERR|POLLHUP; + fds[0].fd = 2; +#else + (void)sigprocmask(SIG_SETMASK, oset, NULL); + fdp = &fds[1]; nfds = 2; + fds[0].events = 0; +#endif + fds[1].events = fds[2].events = POLLIN|POLLNVAL|POLLERR|POLLHUP; + fds[1].fd = remerr; + fds[2].fd = rem; do { if (poll(fdp, nfds, INFTIM) == -1) { if (errno != EINTR) err(1, "poll"); continue; } - if (fds[0].events != 0 && checkfd(&fds[0], 2) == -1) { + if ((fds[1].events != 0 && checkfd(&fds[1], 2) == -1) +#ifdef IN_RCMD + || (fds[0].events != 0 && checkfd(&fds[0], remerr) == -1) +#endif + ) { + nfds--; + fds[1].events = 0; +#ifdef IN_RCMD nfds--; fds[0].events = 0; - fdp = &fds[1]; +#endif + fdp = &fds[2]; } - if (fds[1].events != 0 && checkfd(&fds[1], 1) == -1) { + if (fds[2].events != 0 && checkfd(&fds[2], 1) == -1) { nfds--; - fds[1].events = 0; + fds[2].events = 0; } } while (nfds); } +#ifndef IN_RCMD static void sendsig(int sig) { char signo; signo = sig; - (void)write(remerr, &signo, 1); + (void)write(remerr, &signo, 1); } +#endif static char *