Module Name:    src
Committed By:   enami
Date:           Wed Nov 26 23:44:21 UTC 2014

Modified Files:
        src/lib/libc/net: rcmd.c
        src/usr.bin/rsh: rsh.c

Log Message:
Changes done in rsh.c rev. 1.35 was incomplete.  As chuq pointed
in private mail, it broke rcp(1).

To achieve the documented behavior and to fix long standing incorrect
rsh(1) behavior which I've tried to fix in rev. 1.35, rcmd(1) should have
two operation mode; whether it should relay signal information on
auxiliary channel or not, depending on the argument `fd2p' passed to rcmd(3).
So, make rcmd(1) behave differntly depending on the environment variable and
set it when necessary in rcmd(3) according to how auxiliary channel
is set up by rcmd(3).


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 src/lib/libc/net/rcmd.c
cvs rdiff -u -r1.37 -r1.38 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/lib/libc/net/rcmd.c
diff -u src/lib/libc/net/rcmd.c:1.70 src/lib/libc/net/rcmd.c:1.71
--- src/lib/libc/net/rcmd.c:1.70	Thu Sep 18 13:58:20 2014
+++ src/lib/libc/net/rcmd.c	Wed Nov 26 23:44:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rcmd.c,v 1.70 2014/09/18 13:58:20 christos Exp $	*/
+/*	$NetBSD: rcmd.c,v 1.71 2014/11/26 23:44:21 enami Exp $	*/
 
 /*
  * Copyright (c) 1983, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)rcmd.c	8.3 (Berkeley) 3/26/94";
 #else
-__RCSID("$NetBSD: rcmd.c,v 1.70 2014/09/18 13:58:20 christos Exp $");
+__RCSID("$NetBSD: rcmd.c,v 1.71 2014/11/26 23:44:21 enami Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -464,6 +464,9 @@ rshrcmd(int af, char **ahost, u_int32_t 
 			const char *program;
 			program = strrchr(rshcmd, '/');
 			program = program ? program + 1 : rshcmd;
+			if (fd2p)
+				/* ask rcmd to relay signal information */
+				setenv("RCMD_RELAY_SIGNAL", "YES", 1);
 			switch (af) {
 			case AF_INET:
 				execlp(rshcmd, program, "-4", "-l", remuser,

Index: src/usr.bin/rsh/rsh.c
diff -u src/usr.bin/rsh/rsh.c:1.37 src/usr.bin/rsh/rsh.c:1.38
--- src/usr.bin/rsh/rsh.c:1.37	Thu Oct 30 06:13:50 2014
+++ src/usr.bin/rsh/rsh.c	Wed Nov 26 23:44:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rsh.c,v 1.37 2014/10/30 06:13:50 dholland Exp $	*/
+/*	$NetBSD: rsh.c,v 1.38 2014/11/26 23:44:21 enami 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.37 2014/10/30 06:13:50 dholland Exp $");
+__RCSID("$NetBSD: rsh.c,v 1.38 2014/11/26 23:44:21 enami Exp $");
 #endif
 #endif /* not lint */
 
@@ -76,9 +76,7 @@ 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);
@@ -87,6 +85,7 @@ int	 orcmd(char **, int, const char *,
     const char *, const char *, int *);
 int	 orcmd_af(char **, int, const char *,
     const char *, const char *, int *, int);
+static int	relay_signal;
 #endif
 
 int
@@ -98,7 +97,7 @@ main(int argc, char **argv)
 	struct protoent *proto;
 
 #ifdef IN_RCMD
-	char	*locuser = 0, *loop;
+	char	*locuser = 0, *loop, *relay;
 #endif /* IN_RCMD */
 	int argoff, asrsh, ch, dflag, nflag, one, rem;
 	size_t i;
@@ -133,6 +132,8 @@ main(int argc, char **argv)
 	}
 
 #ifdef IN_RCMD
+	if ((relay = getenv("RCMD_RELAY_SIGNAL")) && strcmp(relay, "YES") == 0)
+		relay_signal = 1;
 	if ((loop = getenv("RCMD_LOOP")) && strcmp(loop, "YES") == 0)
 		warnx("rcmd appears to be looping!");
 
@@ -152,7 +153,7 @@ main(int argc, char **argv)
 	if ((name = strdup(pw->pw_name)) == NULL)
 		err(1, "malloc");
 	while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
-		switch(ch) {
+		switch (ch) {
 		case '4':
 			family = AF_INET;
 			break;
@@ -268,16 +269,17 @@ 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;
+#ifdef IN_RCMD
+	if (!relay_signal)
+#endif
+		for (i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++) {
+			struct sigaction sa;
 
-		if (sa.sa_handler != SIG_IGN) {
-			sa.sa_handler = sendsig;
-			(void)sigaction(sigs[i], &sa, NULL);
+			if (sa.sa_handler != SIG_IGN) {
+				sa.sa_handler = sendsig;
+				(void)sigaction(sigs[i], &sa, NULL);
+			}
 		}
-	}
-#endif
 
 	if (!nflag) {
 		pid = fork();
@@ -390,17 +392,18 @@ done:
 		exit(0);
 	}
 
-#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;
+#ifdef IN_RCMD
+	if (relay_signal) {
+		fdp = &fds[0];
+		nfds = 3;
+		fds[0].events = POLLIN|POLLNVAL|POLLERR|POLLHUP;
+		fds[0].fd = 2;
+	} else
 #endif
+		(void)sigprocmask(SIG_SETMASK, oset, NULL);
 	fds[1].events = fds[2].events = POLLIN|POLLNVAL|POLLERR|POLLHUP;
 	fds[1].fd = remerr;
 	fds[2].fd = rem;
@@ -418,8 +421,10 @@ done:
 			nfds--;
 			fds[1].events = 0;
 #ifdef IN_RCMD
-			nfds--;
-			fds[0].events = 0;
+			if (relay_signal) {
+				nfds--;
+				fds[0].events = 0;
+			}
 #endif
 			fdp = &fds[2];
 		}
@@ -431,7 +436,6 @@ done:
 	while (nfds);
 }
 
-#ifndef IN_RCMD
 static void
 sendsig(int sig)
 {
@@ -440,8 +444,6 @@ sendsig(int sig)
 	signo = sig;
 	(void)write(remerr, &signo, 1);
 }
-#endif
-
 
 static char *
 copyargs(char **argv)

Reply via email to