From 3512822e2f5923ed1823cf94b42172157fddd7e3 Mon Sep 17 00:00:00 2001 From: millert <> Date: Mon, 5 May 2003 22:13:03 +0000 Subject: Add support for command line args in rshprog, e.g. "ssh -C". --- src/lib/libc/net/rcmdsh.3 | 9 +++++--- src/lib/libc/net/rcmdsh.c | 55 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 11 deletions(-) (limited to 'src/lib') diff --git a/src/lib/libc/net/rcmdsh.3 b/src/lib/libc/net/rcmdsh.3 index e0c59efb85..e993d2c9d5 100644 --- a/src/lib/libc/net/rcmdsh.3 +++ b/src/lib/libc/net/rcmdsh.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: rcmdsh.3,v 1.8 2000/12/24 00:30:56 aaron Exp $ +.\" $OpenBSD: rcmdsh.3,v 1.9 2003/05/05 22:13:03 millert Exp $ .\" .\" Copyright (c) 1983, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd September 1, 1996 +.Dd May 5, 2003 .Dt RCMDSH 3 .Os .Sh NAME @@ -46,10 +46,13 @@ The .Fn rcmdsh function is used by normal users to execute a command on a remote machine using an authentication scheme based on reserved port numbers using -.Xr rshd 8 +.Xr rsh 1 or the value of .Fa rshprog (if non-null). +.Fa rshprog +may be a fully-qualified path, a non-qualified command, or a command containing +space-separated command line arguments. .Pp The .Fn rcmdsh diff --git a/src/lib/libc/net/rcmdsh.c b/src/lib/libc/net/rcmdsh.c index a1c7e7d6b8..2a2a5d77fe 100644 --- a/src/lib/libc/net/rcmdsh.c +++ b/src/lib/libc/net/rcmdsh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcmdsh.c,v 1.7 2002/03/12 00:05:44 millert Exp $ */ +/* $OpenBSD: rcmdsh.c,v 1.8 2003/05/05 22:13:03 millert Exp $ */ /* * Copyright (c) 2001, MagniComp @@ -34,7 +34,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: rcmdsh.c,v 1.7 2002/03/12 00:05:44 millert Exp $"; +static char *rcsid = "$OpenBSD: rcmdsh.c,v 1.8 2003/05/05 22:13:03 millert Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -44,6 +44,7 @@ static char *rcsid = "$OpenBSD: rcmdsh.c,v 1.7 2002/03/12 00:05:44 millert Exp $ #include #include #include +#include #include #include #include @@ -127,19 +128,57 @@ rcmdsh(ahost, rport, locuser, remuser, cmd, rshprog) * are the same, avoid running remote shell for efficiency. */ if (!strcmp(*ahost, "localhost") && !strcmp(locuser, remuser)) { + char *argv[4]; 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); - } else { + argv[0] = p ? p + 1 : rshprog; + argv[1] = "-c"; + argv[2] = (char *)cmd; + argv[3] = NULL; + execvp(rshprog, argv); + } else if ((p = strchr(rshprog, ' ')) == NULL) { + /* simple case */ + char *argv[6]; p = strrchr(rshprog, '/'); - execlp(rshprog, p ? p+1 : rshprog, *ahost, "-l", - remuser, cmd, (char *) NULL); + argv[0] = p ? p + 1 : rshprog; + argv[1] = "-l"; + argv[2] = (char *)remuser; + argv[3] = *ahost; + argv[4] = (char *)cmd; + argv[5] = NULL; + execvp(rshprog, argv); + } else { + /* must pull args out of rshprog and dyn alloc argv */ + char **argv, **ap; + int n; + for (n = 7; (p = strchr(++p, ' ')) != NULL; n++) + continue; + rshprog = strdup(rshprog); + ap = argv = malloc(sizeof(char *) * n); + if (rshprog == NULL || argv == NULL) { + perror("rcmdsh"); + _exit(255); + } + while ((p = strsep(&rshprog, " ")) != NULL) { + if (*p == '\0') + continue; + *ap++ = p; + } + if (ap != argv) /* all spaces?!? */ + rshprog = argv[0]; + if ((p = strrchr(argv[0], '/')) != NULL) + argv[0] = p + 1; + *ap++ = "-l"; + *ap++ = (char *)remuser; + *ap++ = *ahost; + *ap++ = (char *)cmd; + *ap++ = NULL; + execvp(rshprog, argv); } - (void) fprintf(stderr, "rcmdsh: execlp %s failed: %s\n", + (void) fprintf(stderr, "rcmdsh: execvp %s failed: %s\n", rshprog, strerror(errno)); _exit(255); } else { -- cgit v1.2.3-55-g6feb