Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Oct 2001 11:24:04 +0300
From:      Ruslan Ermilov <ru@FreeBSD.org>
To:        Warner Losh <imp@FreeBSD.org>
Cc:        audit@FreeBSD.org
Subject:   Re: cvs commit: src/lib/libc/net rcmdsh.3 rcmdsh.c Makefile.inc rcmd.c
Message-ID:  <20011023112404.A54039@sunbay.com>
In-Reply-To: <20011023112215.C43285@sunbay.com>; from ru@FreeBSD.org on Tue, Oct 23, 2001 at 11:22:15AM %2B0300
References:  <200110230622.f9N6MF973431@freefall.freebsd.org> <20011023112215.C43285@sunbay.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--1yeeQ81UyVL57Vl7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Doh, forgot to attach the patch, sorry.  :-(

On Tue, Oct 23, 2001 at 11:22:15AM +0300, Ruslan Ermilov wrote:
> On Mon, Oct 22, 2001 at 11:22:15PM -0700, Warner Losh wrote:
> > imp         2001/10/22 23:22:15 PDT
> > 
> >   Modified files:
> >     lib/libc/net         Makefile.inc rcmd.c 
> >   Added files:
> >     lib/libc/net         rcmdsh.3 rcmdsh.c 
> >   Log:
> >   Allow users to specify a command to use as remote command instead of
> >   using rcmd directly.  This has been in my tree for a long time, but we
> >   may need to sync with OpenBSD before MFC.
> >   
> >   Obtained from: openbsd
> >   PR: 15830
> >   
> >   MFC after: 2 months
> >   
> >   Revision  Changes    Path
> >   1.43      +3 -3      src/lib/libc/net/Makefile.inc
> >   1.32      +21 -5     src/lib/libc/net/rcmd.c
> >   1.1       +105 -0    src/lib/libc/net/rcmdsh.3 (new)
> >   1.1       +130 -0    src/lib/libc/net/rcmdsh.c (new)
> > 
> Warner,
> 
> The attached patch:
> 
> 1.  Puts missing prototype for rcmd() in <unistd.h>.
> 2.  Cleans up the manpage.
> 3.  Applies style(9) to rcmdsh.c.
> 
> Note that the type of "rshprog" was changed from "char *"
> to "const char *" to satisfy WARNS=2.
> 
> 
> Cheers,
> -- 
> Ruslan Ermilov		Oracle Developer/DBA,
> ru@sunbay.com		Sunbay Software AG,
> ru@FreeBSD.org		FreeBSD committer,
> +380.652.512.251	Simferopol, Ukraine
> 
> http://www.FreeBSD.org	The Power To Serve
> http://www.oracle.com	Enabling The Information Age

-- 
Ruslan Ermilov		Oracle Developer/DBA,
ru@sunbay.com		Sunbay Software AG,
ru@FreeBSD.org		FreeBSD committer,
+380.652.512.251	Simferopol, Ukraine

http://www.FreeBSD.org	The Power To Serve
http://www.oracle.com	Enabling The Information Age

--1yeeQ81UyVL57Vl7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=p

Index: include/unistd.h
===================================================================
RCS file: /home/ncvs/src/include/unistd.h,v
retrieving revision 1.43
diff -u -p -r1.43 unistd.h
--- include/unistd.h	2001/09/21 22:50:39	1.43
+++ include/unistd.h	2001/10/23 08:19:37
@@ -173,6 +173,8 @@ int	 rcmd __P((char **, int, const char 
 		const char *, const char *, int *));
 int	 rcmd_af __P((char **, int, const char *,
 		const char *, const char *, int *, int));
+int	 rcmdsh __P((char **, int, const char *,
+		const char *, const char *, const char *));
 char	*re_comp __P((const char *));
 int	 re_exec __P((const char *));
 int	 readlink __P((const char *, char *, int));
Index: lib/libc/net/rcmdsh.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/net/rcmdsh.3,v
retrieving revision 1.1
diff -u -p -r1.1 rcmdsh.3
--- lib/libc/net/rcmdsh.3	2001/10/23 06:22:15	1.1
+++ lib/libc/net/rcmdsh.3	2001/10/23 08:19:37
@@ -40,9 +40,16 @@
 .Nm rcmdsh
 .Nd return a stream to a remote command without superuser
 .Sh SYNOPSIS
-.Fd #include <unistd.h>
+.In unistd.h
 .Ft int
-.Fn rcmdsh "char **ahost" "int inport" "const char *locuser" "const char *remuser" "const char *cmd" "char *rshprog"
+.Fo rcmdsh
+.Fa "char **ahost"
+.Fa "int inport"
+.Fa "const char *locuser"
+.Fa "const char *remuser"
+.Fa "const char *cmd"
+.Fa "const char *rshprog"
+.Fc
 .Sh DESCRIPTION
 The
 .Fn rcmdsh
@@ -53,7 +60,8 @@ on reserved port numbers using
 .Xr rshd 8
 or the value of
 .Fa rshprog
-(if non-null).
+(if
+.No non- Ns Dv NULL ) .
 .Pp
 The
 .Fn rcmdsh
@@ -68,27 +76,28 @@ Otherwise
 is set to the standard name of the host
 and a connection is established to a server
 residing at the well-known Internet port
-.Li shell/tcp
+.Dq Li shell/tcp
 (or whatever port is used by
-.Fa rshprog
-).  The parameter
+.Fa rshprog ) .
+The parameter
 .Fa inport
 is ignored; it is only included to provide an interface similar to
 .Xr rcmd 3 .
 .Pp
 If the connection succeeds,
 a socket in the
-.Tn UNIX
+.Ux
 domain of type
 .Dv SOCK_STREAM
 is returned to the caller, and given to the remote
-command as stdin and stdout, and stderr.
-.Sh DIAGNOSTICS
+command as stdin, stdout, and stderr.
+.Sh RETURN VALUES
 The
 .Fn rcmdsh
 function
 returns a valid socket descriptor on success.
-It returns \-1 on error and prints a diagnostic message on the standard error.
+Otherwise, \-1 is returned
+and a diagnostic message is printed on the standard error.
 .Sh SEE ALSO
 .Xr rsh 1 ,
 .Xr socketpair 2 ,
@@ -97,9 +106,11 @@ It returns \-1 on error and prints a dia
 .Sh BUGS
 If
 .Xr rsh 1
-gets an error a file descriptor is still returned instead of \-1.
+encounters an error, a file descriptor is still returned instead of \-1.
 .Sh HISTORY
 The
 .Fn rcmdsh
 function first appeared in
-.Ox 2.0 .
+.Ox 2.0 ,
+and made its way into
+.Fx 5.0 .
Index: lib/libc/net/rcmdsh.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/net/rcmdsh.c,v
retrieving revision 1.1
diff -u -p -r1.1 rcmdsh.c
--- lib/libc/net/rcmdsh.c	2001/10/23 06:22:15	1.1
+++ lib/libc/net/rcmdsh.c	2001/10/23 08:19:37
@@ -1,30 +1,27 @@
-/*	$OpenBSD: rcmdsh.c,v 1.5 1998/04/25 16:23:58 millert Exp $	*/ 
+/*	$OpenBSD: rcmdsh.c,v 1.5 1998/04/25 16:23:58 millert Exp $	*/
 
 /*
- * This is an rcmd() replacement originally by 
+ * This is an rcmd() replacement originally by
  * Chris Siebenmann <cks@utcc.utoronto.ca>.
- *
- * $FreeBSD: src/lib/libc/net/rcmdsh.c,v 1.1 2001/10/23 06:22:15 imp Exp $
  */
 
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$FreeBSD: src/lib/libc/net/rcmdsh.c,v 1.1 2001/10/23 06:22:15 imp Exp $"
-#endif /* LIBC_SCCS and not lint */
-
-#include      <sys/types.h>
-#include      <sys/socket.h>
-#include      <sys/wait.h>
-#include      <signal.h>
-#include      <errno.h>
-#include      <netdb.h>
-#include      <stdio.h>
-#include      <string.h>
-#include      <pwd.h>
-#include      <paths.h>
-#include      <unistd.h>
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/lib/libc/net/rcmdsh.c,v 1.1 2001/10/23 06:22:15 imp Exp $");
 
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+
+#include <errno.h>
+#include <netdb.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
 #ifndef _PATH_RSH
-#define _PATH_RSH "/usr/bin/rsh"
+#define	_PATH_RSH	"/usr/bin/rsh"
 #endif
 
 /*
@@ -36,9 +33,8 @@ static char *rcsid = "$FreeBSD: src/lib/
 int
 rcmdsh(ahost, rport, locuser, remuser, cmd, rshprog)
 	char **ahost;
-	int rport;
-	const char *locuser, *remuser, *cmd;
-	char *rshprog;
+	int rport __unused;
+	const char *locuser, *remuser, *cmd, *rshprog;
 {
 	struct hostent *hp;
 	int cpid, sp[2];
@@ -51,41 +47,41 @@ rcmdsh(ahost, rport, locuser, remuser, c
 
 	/* locuser must exist on this host. */
 	if ((pw = getpwnam(locuser)) == NULL) {
-		(void) fprintf(stderr, "rcmdsh: unknown user: %s\n", locuser);
-		return(-1);
+		(void)fprintf(stderr, "rcmdsh: unknown user: %s\n", locuser);
+		return (-1);
 	}
 
 	/* Validate remote hostname. */
 	if (strcmp(*ahost, "localhost") != 0) {
 		if ((hp = gethostbyname(*ahost)) == NULL) {
 			herror(*ahost);
-			return(-1);
+			return (-1);
 		}
 		*ahost = hp->h_name;
 	}
 
 	/* Get a socketpair we'll use for stdin and stdout. */
-	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, sp) < 0) {
+	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, sp) == -1) {
 		perror("rcmdsh: socketpair");
-		return(-1);
+		return (-1);
 	}
 
 	cpid = fork();
-	if (cpid < 0) {
+	if (cpid == -1) {
 		perror("rcmdsh: fork failed");
-		return(-1);
+		return (-1);
 	} else if (cpid == 0) {
 		/*
 		 * Child.  We use sp[1] to be stdin/stdout, and close sp[0].
 		 */
-		(void) close(sp[0]);
-		if (dup2(sp[1], 0) < 0 || dup2(0, 1) < 0) {
+		(void)close(sp[0]);
+		if (dup2(sp[1], 0) == -1 || dup2(0, 1) == -1) {
 			perror("rcmdsh: dup2 failed");
 			_exit(255);
 		}
 		/* Fork again to lose parent. */
 		cpid = fork();
-		if (cpid < 0) {
+		if (cpid == -1) {
 			perror("rcmdsh: fork to lose parent failed");
 			_exit(255);
 		}
@@ -93,38 +89,39 @@ rcmdsh(ahost, rport, locuser, remuser, c
 			_exit(0);
 
 		/* In grandchild here.  Become local user for rshprog. */
-		if (setuid(pw->pw_uid)) {
-			(void) fprintf(stderr, "rcmdsh: setuid(%u): %s\n",
-				       pw->pw_uid, strerror(errno));
+		if (setuid(pw->pw_uid) == -1) {
+			(void)fprintf(stderr, "rcmdsh: setuid(%u): %s\n",
+			    pw->pw_uid, strerror(errno));
 			_exit(255);
 		}
 
 		/*
-		 * If remote host is "localhost" and local and remote user
+		 * If remote host is "localhost" and local and remote users
 		 * are the same, avoid running remote shell for efficiency.
 		 */
-		if (!strcmp(*ahost, "localhost") && !strcmp(locuser, remuser)) {
+		if (strcmp(*ahost, "localhost") == 0 &&
+		    strcmp(locuser, remuser) == 0) {
 			if (pw->pw_shell[0] == '\0')
 				rshprog = _PATH_BSHELL;
 			else
 				rshprog = pw->pw_shell;
 			p = strrchr(rshprog, '/');
-			execlp(rshprog, p ? p+1 : rshprog, "-c", cmd,
-			       (char *) NULL);
+			execlp(rshprog, p ? p + 1 : rshprog, "-c", cmd,
+			    (char *)NULL);
 		} else {
 			p = strrchr(rshprog, '/');
-			execlp(rshprog, p ? p+1 : rshprog, *ahost, "-l",
-			       remuser, cmd, (char *) NULL);
+			execlp(rshprog, p ? p + 1 : rshprog, *ahost, "-l",
+			    remuser, cmd, (char *)NULL);
 		}
-		(void) fprintf(stderr, "rcmdsh: execlp %s failed: %s\n",
-			       rshprog, strerror(errno));
+		(void)fprintf(stderr, "rcmdsh: execlp %s failed: %s\n",
+		    rshprog, strerror(errno));
 		_exit(255);
 	} else {
 		/* Parent. close sp[1], return sp[0]. */
-		(void) close(sp[1]);
+		(void)close(sp[1]);
 		/* Reap child. */
-		(void) wait(NULL);
-		return(sp[0]);
+		(void)wait(NULL);
+		return (sp[0]);
 	}
 	/* NOTREACHED */
 }

--1yeeQ81UyVL57Vl7--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011023112404.A54039>