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>