- Put missing prototype for rcmd() in <unistd.h>.

- Clean up the manpage.
- style(9) rcmdsh.c.

Committed from:	BSDCon/EU 2k+1 terminal room
This commit is contained in:
ru 2001-11-09 15:19:25 +00:00
parent 433f544c6d
commit 77df879d01
3 changed files with 68 additions and 58 deletions

View File

@ -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));

View File

@ -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 .

View File

@ -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 */
}