--- rsh.c.orig	Mon Aug 14 17:18:04 2000
+++ rsh.c	Tue Aug 15 18:36:25 2000
@@ -65,10 +65,10 @@
 /*
  * rsh - remote shell
  */
-static int rfd2;
+static int rfd2, sflag;
 static char *copyargs(char **);
 static void sendsig(int);
-static void talk(int nflag, long omask, int pid, int rem);
+static void talk(int nflag, long omask, int pid, int rem, int sflag);
 static void usage(void);
 
 int
@@ -86,7 +86,7 @@
 	saved_environ = __environ;
 	__environ = &null;
 
-	argoff = asrsh = dflag = nflag = 0;
+	argoff = asrsh = dflag = nflag = sflag = 0;
 	one = 1;
 	host = user = NULL;
 
@@ -104,9 +104,12 @@
 		argoff = 1;
 	}
 
-#define	OPTIONS	"+8KLdel:nw"
+#define	OPTIONS	"+8KLdesl:nw"
 	while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != EOF)
 		switch(ch) {
+		case 's':
+			sflag = 1;
+			break;
 		case 'K':
 			break;
 		case 'L':	/* -8Lew are ignored to allow rlogin aliases */
@@ -166,7 +169,10 @@
 #ifdef FSUID_HACK
 	setfsuid(getuid());
 #endif
-	rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, &rfd2);
+	if (sflag)
+		rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, NULL);
+	else
+		rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, &rfd2);
 #ifdef FSUID_HACK
 	setfsuid(geteuid());
 #endif
@@ -174,7 +180,7 @@
 	if (rem < 0)
 		exit(1);
 
-	if (rfd2 < 0) {
+	if (!sflag && rfd2 < 0) {
 		fprintf(stderr, "rsh: can't establish stderr.\n");
 		exit(1);
 	}
@@ -186,8 +192,8 @@
 		    sizeof(one)) < 0)
 			fprintf(stderr, "rsh: setsockopt: %s.\n",
 			    strerror(errno));
-		if (setsockopt(rfd2, SOL_SOCKET, SO_DEBUG, &one,
-		    sizeof(one)) < 0)
+		if (!sflag && (setsockopt(rfd2, SOL_SOCKET, SO_DEBUG, &one,
+		    sizeof(one)) < 0))
 			fprintf(stderr, "rsh: setsockopt: %s.\n",
 			    strerror(errno));
 	}
@@ -210,11 +216,12 @@
 	}
 
 	{
-		ioctl(rfd2, FIONBIO, &one);
+		if (!sflag)
+			ioctl(rfd2, FIONBIO, &one);
 		ioctl(rem, FIONBIO, &one);
 	}
 
-	talk(nflag, omask, pid, rem);
+	talk(nflag, omask, pid, rem, sflag);
 
 	if (!nflag)
 		kill(pid, SIGKILL);
@@ -222,7 +229,7 @@
 }
 
 static void
-talk(int nflag, long omask, int pid, int rem)
+talk(int nflag, long omask, int pid, int rem, int sflag)
 {
 	register int cc, wc;
 	register char *bp;
@@ -233,7 +240,8 @@
 	FD_ZERO(&rembits);
 
 	if (!nflag && pid == 0) {
-		close(rfd2);
+		if (!sflag)
+			close(rfd2);
 
 reread:		errno = 0;
 		if ((cc = read(0, buf, sizeof buf)) <= 0)
@@ -268,15 +276,16 @@
 		exit(0);
 	}
 
-	rfd2_ok = rem_ok = 1;
+	rfd2_ok = !sflag;
+	rem_ok = 1;
 	sigsetmask(omask);
 	while (rfd2_ok || rem_ok) {
 		FD_ZERO(&readfrom);
-		if (rfd2_ok)
+		if (!sflag && rfd2_ok)
 			FD_SET(rfd2, &readfrom);
 		if (rem_ok)
 			FD_SET(rem, &readfrom);
-		if (select(rfd2 > rem ? rfd2+1 : rem+1, 
+		if (select(!sflag && (rfd2 > rem) ? rfd2+1 : rem+1, 
 			   &readfrom, 0, 0, 0) < 0) {
 			if (errno != EINTR) {
 				fprintf(stderr,
@@ -285,7 +294,7 @@
 			}
 			continue;
 		}
-		if (FD_ISSET(rfd2, &readfrom)) {
+		if (!sflag && FD_ISSET(rfd2, &readfrom)) {
 			errno = 0;
 				cc = read(rfd2, buf, sizeof buf);
 			if (cc > 0)
@@ -308,6 +317,7 @@
 sendsig(int signo)
 {
 	char x = (char) signo;
+	if (!sflag)
 		write(rfd2, &x, 1);
 }
 
@@ -339,7 +349,7 @@
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: rsh [-nd%s]%s[-l login] host [command]\n",
+	    "usage: rsh [-nsd%s]%s[-l login] host [command]\n",
 	    "", " ");
 	exit(1);
 }
