summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/net/rcmdsh.335
-rw-r--r--lib/libc/net/rcmdsh.c89
2 files changed, 66 insertions, 58 deletions
diff --git a/lib/libc/net/rcmdsh.3 b/lib/libc/net/rcmdsh.3
index 120157e..104df48 100644
--- a/lib/libc/net/rcmdsh.3
+++ b/lib/libc/net/rcmdsh.3
@@ -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 diagnostic message on the standard error.
.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 .
diff --git a/lib/libc/net/rcmdsh.c b/lib/libc/net/rcmdsh.c
index 6ead7d1..d61c882 100644
--- a/lib/libc/net/rcmdsh.c
+++ b/lib/libc/net/rcmdsh.c
@@ -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$
*/
-#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$FreeBSD$"
-#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
-#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/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$"
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, cmd, rshprog)
/* 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, cmd, rshprog)
_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 */
}
OpenPOWER on IntegriCloud