diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2014-03-19 14:44:18 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2014-03-19 14:44:18 +0000 |
commit | 18be1f9e7c7fb63836be11d5a3fb971edf91c88e (patch) | |
tree | 1da7db81de6fab7721823c5ba25eb4f31812e0ff | |
parent | f784fd2a2008d9df9e39680a9d9c91555a5e5d8c (diff) |
Thulsa Doom says "Infidel Defilers. They shall all drown in lakes of blood."
-rw-r--r-- | bin/rcp/Makefile | 7 | ||||
-rw-r--r-- | bin/rcp/extern.h | 60 | ||||
-rw-r--r-- | bin/rcp/pathnames.h | 38 | ||||
-rw-r--r-- | bin/rcp/rcp.1 | 134 | ||||
-rw-r--r-- | bin/rcp/rcp.c | 922 | ||||
-rw-r--r-- | bin/rcp/util.c | 240 |
6 files changed, 0 insertions, 1401 deletions
diff --git a/bin/rcp/Makefile b/bin/rcp/Makefile deleted file mode 100644 index ec1b8e99a23..00000000000 --- a/bin/rcp/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $OpenBSD: Makefile,v 1.13 2010/11/11 17:40:55 miod Exp $ - -PROG= rcp -SRCS= rcp.c util.c -#INSTALLFLAGS=-fschg - -.include <bsd.prog.mk> diff --git a/bin/rcp/extern.h b/bin/rcp/extern.h deleted file mode 100644 index 8e870efe62d..00000000000 --- a/bin/rcp/extern.h +++ /dev/null @@ -1,60 +0,0 @@ -/* $OpenBSD: extern.h,v 1.7 2007/11/29 07:39:09 chl Exp $ */ -/* $NetBSD: extern.h,v 1.2 1995/03/21 08:19:01 cgd Exp $ */ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)extern.h 8.1 (Berkeley) 5/31/93 - */ - -typedef struct { - int cnt; - char *buf; -} BUF; - -extern int iamremote; -extern char *__progname; - -typedef struct arglist arglist; -struct arglist { - char **list; - u_int num; - u_int nalloc; -}; -void addargs(arglist *, char *, ...) - __attribute__((format(printf, 2, 3))); -void freeargs(arglist *); - -BUF *allocbuf(BUF *, int, int); -char *colon(char *); -void lostconn(int); -void nospace(void); -int okname(char *); -void run_err(const char *, ...); -void verifydir(char *); -int do_local_cmd(arglist *, uid_t, gid_t); diff --git a/bin/rcp/pathnames.h b/bin/rcp/pathnames.h deleted file mode 100644 index 5f05275bb69..00000000000 --- a/bin/rcp/pathnames.h +++ /dev/null @@ -1,38 +0,0 @@ -/* $OpenBSD: pathnames.h,v 1.4 2014/03/16 05:30:13 deraadt Exp $ */ -/* $NetBSD: pathnames.h,v 1.5 1995/03/21 08:19:03 cgd Exp $ */ - -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)pathnames.h 8.1 (Berkeley) 5/31/93 - */ - -#include <paths.h> - -#define _PATH_CP "/bin/cp" -#define _PATH_OLD_RSH "/usr/bin/rsh" diff --git a/bin/rcp/rcp.1 b/bin/rcp/rcp.1 deleted file mode 100644 index 75d52b9518e..00000000000 --- a/bin/rcp/rcp.1 +++ /dev/null @@ -1,134 +0,0 @@ -.\" $OpenBSD: rcp.1,v 1.19 2010/09/19 20:55:25 jmc Exp $ -.\" $NetBSD: rcp.1,v 1.6 1995/07/25 19:37:25 jtc Exp $ -.\" -.\" Copyright (c) 1983, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)rcp.1 8.1 (Berkeley) 5/31/93 -.\" -.Dd $Mdocdate: September 19 2010 $ -.Dt RCP 1 -.Os -.Sh NAME -.Nm rcp -.Nd remote file copy -.Sh SYNOPSIS -.Nm rcp -.Op Fl p -.Ar file1 file2 -.Nm rcp -.Op Fl pr -.Ar file ... directory -.Sh DESCRIPTION -The -.Nm -utility copies files between machines. -Each -.Ar file -or -.Ar directory -argument is either a remote file name of the -form -.Dq rname@rhost:path , -or a local file name (containing no -.Ql \&: -characters, -or a -.Ql / -before any -.Ql \&: -characters). -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl p -Causes -.Nm -to attempt to preserve (duplicate) in its copies the modification -times and modes of the source files, ignoring the -.Ar umask . -By default, the mode and owner of -.Ar file2 -are preserved if it already existed; otherwise the mode of the source file -modified by the -.Xr umask 2 -on the destination host is used. -.It Fl r -If any of the source files are directories, -.Nm -copies each subtree rooted at that name; in this case -the destination must be a directory. -.El -.Pp -If -.Ar path -is not a full path name, it is interpreted relative to -the login directory of the specified user -.Ar ruser -on -.Ar rhost , -or your current user name if no other remote user name is specified. -A -.Ar path -on a remote host may be quoted (using \e, ", or \(aa) -so that the metacharacters are interpreted remotely. -.Pp -.Nm -does not prompt for passwords; it performs remote execution -via -.Xr rsh 1 , -and requires the same authorization. -.Pp -.Nm -handles third party copies, where neither source nor target files -are on the current machine. -.Sh SEE ALSO -.Xr cp 1 , -.Xr ftp 1 , -.Xr rsh 1 -.Sh HISTORY -The -.Nm -utility appeared in -.Bx 4.2 . -.Sh BUGS -Doesn't detect all cases where the target of a copy might -be a file in cases where only a directory should be legal. -.Pp -Is confused by any output generated by commands in a -.Pa \&.login , -.Pa \&.profile , -or -.Pa \&.cshrc -file on the remote host. -.Pp -The destination user and hostname may have to be specified as -.Dq rhost.rname -when the destination machine is running the -.Bx 4.2 -version of -.Nm rcp . diff --git a/bin/rcp/rcp.c b/bin/rcp/rcp.c deleted file mode 100644 index 6faa7159306..00000000000 --- a/bin/rcp/rcp.c +++ /dev/null @@ -1,922 +0,0 @@ -/* $OpenBSD: rcp.c,v 1.55 2014/03/16 05:30:13 deraadt Exp $ */ -/* $NetBSD: rcp.c,v 1.9 1995/03/21 08:19:06 cgd Exp $ */ - -/* - * Copyright (c) 1983, 1990, 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> - -#include <ctype.h> -#include <dirent.h> -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <pwd.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "pathnames.h" -#include "extern.h" - -#ifdef KERBEROS -#include <des.h> -#include <kerberosIV/krb.h> - -char dst_realm_buf[REALM_SZ]; -char *dest_realm = NULL; -int use_kerberos = 1; -CREDENTIALS cred; -Key_schedule schedule; -extern char *krb_realmofhost(); -int doencrypt = 0; -#define OPTIONS "dfKk:prtx" -#else -#define OPTIONS "dfprt" -#endif - -struct passwd *pwd; -u_short port; -uid_t userid; -gid_t groupid; -int errs, rem; -int pflag, iamremote, iamrecursive, targetshouldbedirectory; - -#define CMDNEEDS 64 -char cmd[CMDNEEDS]; /* must hold "rcp -r -p -d\0" */ - -#ifdef KERBEROS -int kerberos(char **, char *, char *, char *); -void oldw(const char *, ...); -/* XXX from ../../usr.bin/rlogin/krcmd.c */ -int krcmd(char **, u_short, char *, char *, int *, char *); -int krcmd_mutual(char **, u_short, char *, char *, int *, - char *, CREDENTIALS *, Key_schedule); -#endif -int response(void); -void rsource(char *, struct stat *); -void sink(int, char *[]); -void source(int, char *[]); -void tolocal(int, char *[]); -void toremote(char *, int, char *[]); -int do_times(int fd, const struct stat *sb); -void usage(void); - -int -main(int argc, char *argv[]) -{ - struct servent *sp; - int ch, fflag, tflag; - char *targ, *shell; - - fflag = tflag = 0; - while ((ch = getopt(argc, argv, OPTIONS)) != -1) - switch(ch) { /* User-visible flags. */ - case 'K': -#ifdef KERBEROS - use_kerberos = 0; -#endif - break; -#ifdef KERBEROS - case 'k': - dest_realm = dst_realm_buf; - strlcpy(dst_realm_buf, optarg, sizeof(dst_realm_buf)); - break; - case 'x': - doencrypt = 1; - /* des_set_key(cred.session, schedule); */ - break; -#endif - case 'p': - pflag = 1; - break; - case 'r': - iamrecursive = 1; - break; - /* Server options. */ - case 'd': - targetshouldbedirectory = 1; - break; - case 'f': /* "from" */ - iamremote = 1; - fflag = 1; - break; - case 't': /* "to" */ - iamremote = 1; - tflag = 1; - break; - default: - usage(); - } - argc -= optind; - argv += optind; - -#ifdef KERBEROS - if (use_kerberos) { - shell = doencrypt ? "ekshell" : "kshell"; - if ((sp = getservbyname(shell, "tcp")) == NULL) { - use_kerberos = 0; - oldw("can't get entry for %s/tcp service", shell); - sp = getservbyname(shell = "shell", "tcp"); - } - } else - sp = getservbyname(shell = "shell", "tcp"); -#else - sp = getservbyname(shell = "shell", "tcp"); -#endif - if (sp == NULL) - errx(1, "%s/tcp: unknown service", shell); - port = sp->s_port; - - if ((pwd = getpwuid(userid = getuid())) == NULL) - errx(1, "unknown user %u", userid); - groupid = pwd->pw_gid; - - unsetenv("RSH"); /* Force the use of /usr/bin/rsh */ - - rem = STDIN_FILENO; /* XXX */ - - if (fflag) { /* Follow "protocol", send data. */ - (void)response(); - (void)setresgid(groupid, groupid, groupid); - (void)setgroups(1, &groupid); - (void)setresuid(userid, userid, userid); - source(argc, argv); - exit(errs != 0); - } - - if (tflag) { /* Receive data. */ - (void)setresgid(groupid, groupid, groupid); - (void)setgroups(1, &groupid); - (void)setresuid(userid, userid, userid); - sink(argc, argv); - exit(errs != 0); - } - - if (argc < 2) - usage(); - if (argc > 2) - targetshouldbedirectory = 1; - - rem = -1; - /* Command to be executed on remote system using "rsh". */ -#ifdef KERBEROS - (void)snprintf(cmd, sizeof(cmd), - "rcp%s%s%s%s", iamrecursive ? " -r" : "", - (doencrypt && use_kerberos ? " -x" : ""), - pflag ? " -p" : "", targetshouldbedirectory ? " -d" : ""); -#else - (void)snprintf(cmd, sizeof(cmd), "rcp%s%s%s", - iamrecursive ? " -r" : "", pflag ? " -p" : "", - targetshouldbedirectory ? " -d" : ""); -#endif - - (void)signal(SIGPIPE, lostconn); - - if ((targ = colon(argv[argc - 1]))) /* Dest is remote host. */ - toremote(targ, argc, argv); - else { - tolocal(argc, argv); /* Dest is local host. */ - if (targetshouldbedirectory) - verifydir(argv[argc - 1]); - } - exit(errs != 0); -} - -void -toremote(char *targ, int argc, char *argv[]) -{ - int i, tos; - char *bp, *host, *src, *suser, *thost, *tuser, *user, *arg; - arglist alist; - - memset(&alist, '\0', sizeof(alist)); - alist.list = NULL; - - if ((user = strdup(pwd->pw_name)) == NULL) - err(1, "strdup"); - - *targ++ = 0; - if (*targ == 0) - targ = "."; - - arg = strdup(argv[argc - 1]); - if (!arg) - err(1, "strdup"); - if ((thost = strchr(arg, '@'))) { - /* user@host */ - *thost++ = 0; - tuser = arg; - if (*tuser == '\0') - tuser = NULL; - else if (!okname(tuser)) - exit(1); - } else { - thost = arg; - tuser = NULL; - } - - for (i = 0; i < argc - 1; i++) { - src = colon(argv[i]); - if (src) { /* remote to remote */ - freeargs(&alist); - addargs(&alist, "%s", _PATH_OLD_RSH); - addargs(&alist, "%s", "-n"); - - *src++ = 0; - if (*src == 0) - src = "."; - - host = strchr(argv[i], '@'); - if (host) { - *host++ = 0; - suser = argv[i]; - if (*suser == '\0') - suser = user; - else if (!okname(suser)) - continue; - - addargs(&alist, "-l"); - addargs(&alist, "%s", suser); - } else - host = argv[1]; - addargs(&alist, "%s", host); - addargs(&alist, "%s", cmd); - addargs(&alist, "%s", src); - addargs(&alist, "%s%s%s:%s", - tuser ? tuser : "", tuser ? "@" : "", - thost, targ); - do_local_cmd(&alist, userid, groupid); - } else { /* local to remote */ - if (rem == -1) { - if (asprintf(&bp, "%s -t %s", cmd, targ) == -1) - err(1, NULL); - host = thost; -#ifdef KERBEROS - if (use_kerberos) - rem = kerberos(&host, bp, user, - tuser ? tuser : pwd->pw_name); - else -#endif - rem = rcmd(&host, port, user, - tuser ? tuser : user, bp, 0); - if (rem < 0) - exit(1); - tos = IPTOS_THROUGHPUT; - if (setsockopt(rem, IPPROTO_IP, IP_TOS, - &tos, sizeof(int)) < 0 && - errno != ENOPROTOOPT) - warn("TOS (ignored)"); - if (response() < 0) - exit(1); - (void)free(bp); - (void)setresgid(groupid, groupid, groupid); - (void)setgroups(1, &groupid); - (void)setresuid(userid, userid, userid); - } - source(1, argv+i); - } - } - free(user); - free(arg); -} - -void -tolocal(int argc, char *argv[]) -{ - int i, tos; - char *bp, *host, *src, *suser, *user; - arglist alist; - - memset(&alist, '\0', sizeof(alist)); - alist.list = NULL; - - if ((user = strdup(pwd->pw_name)) == NULL) - err(1, "strdup"); - - for (i = 0; i < argc - 1; i++) { - if (!(src = colon(argv[i]))) { /* Local to local. */ - freeargs(&alist); - addargs(&alist, "%s", _PATH_CP); - if (iamrecursive) - addargs(&alist, "-R"); - if (pflag) - addargs(&alist, "-p"); - addargs(&alist, "%s", argv[i]); - addargs(&alist, "%s", argv[argc-1]); - if (do_local_cmd(&alist, userid, groupid)) - ++errs; - continue; - } - *src++ = 0; - if (*src == 0) - src = "."; - if ((host = strchr(argv[i], '@')) == NULL) { - host = argv[i]; - suser = user; - } else { - *host++ = 0; - suser = argv[i]; - if (*suser == '\0') - suser = user; - else if (!okname(suser)) - continue; - } - if (asprintf(&bp, "%s -f %s", cmd, src) == -1) - err(1, NULL); - rem = -#ifdef KERBEROS - use_kerberos ? - kerberos(&host, bp, user, suser) : -#endif - rcmd(&host, port, user, suser, bp, 0); - (void)free(bp); - if (rem < 0) { - ++errs; - continue; - } - (void)seteuid(userid); - tos = IPTOS_THROUGHPUT; - if (setsockopt(rem, IPPROTO_IP, IP_TOS, &tos, sizeof(int)) < 0 - && errno != ENOPROTOOPT) - warn("TOS (ignored)"); - sink(1, argv + argc - 1); - (void)seteuid(0); - (void)close(rem); - rem = -1; - } - free(user); -} - -int -do_times(int fd, const struct stat *sb) -{ - /* strlen(2^64) == 20; strlen(10^6) == 7 */ - char buf[(20 + 7 + 2) * 2 + 2]; - - (void)snprintf(buf, sizeof(buf), "T%llu 0 %llu 0\n", - (unsigned long long) (sb->st_mtime < 0 ? 0 : sb->st_mtime), - (unsigned long long) (sb->st_atime < 0 ? 0 : sb->st_atime)); - (void)write(fd, buf, strlen(buf)); - return (response()); -} - -void -source(int argc, char *argv[]) -{ - struct stat stb; - static BUF buffer; - BUF *bp; - off_t i; - int amt, fd = -1, haderr, indx, result; - char *last, *name, buf[BUFSIZ]; - int len; - - for (indx = 0; indx < argc; ++indx) { - name = argv[indx]; - len = strlen(name); - while (len > 1 && name[len-1] == '/') - name[--len] = '\0'; - if (strchr(name, '\n') != NULL) { - run_err("%s: skipping, filename contains a newline", - name); - goto next; - } - if ((fd = open(name, O_RDONLY, 0)) < 0) - goto syserr; - if (fstat(fd, &stb)) { -syserr: - run_err("%s: %s", name, strerror(errno)); - goto next; - } - switch (stb.st_mode & S_IFMT) { - case S_IFREG: - break; - case S_IFDIR: - if (iamrecursive) { - rsource(name, &stb); - goto next; - } - /* FALLTHROUGH */ - default: - run_err("%s: not a regular file", name); - goto next; - } - if ((last = strrchr(name, '/')) == NULL) - last = name; - else - ++last; - if (pflag) { - if (do_times(rem, &stb) < 0) - goto next; - } -#define MODEMASK (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) - (void)snprintf(buf, sizeof(buf), "C%04o %qd %s\n", - stb.st_mode & MODEMASK, stb.st_size, last); - (void)write(rem, buf, strlen(buf)); - if (response() < 0) - goto next; - if ((bp = allocbuf(&buffer, fd, BUFSIZ)) == NULL) { -next: if (fd != -1) { - (void)close(fd); - fd = -1; - } - continue; - } - - /* Keep writing after an error so that we stay sync'd up. */ - for (haderr = i = 0; i < stb.st_size; i += bp->cnt) { - amt = bp->cnt; - if (i + amt > stb.st_size) - amt = stb.st_size - i; - if (!haderr) { - result = read(fd, bp->buf, amt); - if (result != amt) - haderr = result >= 0 ? EIO : errno; - } - if (haderr) - (void)write(rem, bp->buf, amt); - else { - result = write(rem, bp->buf, amt); - if (result != amt) - haderr = result >= 0 ? EIO : errno; - } - } - if (fd != -1) { - if (close(fd) && !haderr) - haderr = errno; - fd = -1; - } - if (!haderr) - (void)write(rem, "", 1); - else - run_err("%s: %s", name, strerror(haderr)); - (void)response(); - } -} - -void -rsource(char *name, struct stat *statp) -{ - DIR *dirp; - struct dirent *dp; - char *last, *vect[1], path[MAXPATHLEN]; - - if (!(dirp = opendir(name))) { - run_err("%s: %s", name, strerror(errno)); - return; - } - last = strrchr(name, '/'); - if (last == NULL) - last = name; - else - last++; - if (pflag) { - if (do_times(rem, statp) < 0) { - closedir(dirp); - return; - } - } - (void)snprintf(path, sizeof(path), - "D%04o %d %s\n", statp->st_mode & MODEMASK, 0, last); - (void)write(rem, path, strlen(path)); - if (response() < 0) { - closedir(dirp); - return; - } - while ((dp = readdir(dirp)) != NULL) { - if (dp->d_ino == 0) - continue; - if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) - continue; - if (strlen(name) + 1 + strlen(dp->d_name) >= MAXPATHLEN - 1) { - run_err("%s/%s: name too long", name, dp->d_name); - continue; - } - (void)snprintf(path, sizeof(path), "%s/%s", name, dp->d_name); - vect[0] = path; - source(1, vect); - } - (void)closedir(dirp); - (void)write(rem, "E\n", 2); - (void)response(); -} - -void -sink(int argc, char *argv[]) -{ - static BUF buffer; - struct stat stb; - struct timeval tv[2]; - enum { YES, NO, DISPLAYED } wrerr; - BUF *bp; - off_t i, j, size; - unsigned long long ull; - int amt, count, exists, first, mask, mode, ofd, omode; - int setimes, targisdir, wrerrno = 0; - char ch, *cp, *np, *targ, *why, *vect[1], buf[BUFSIZ]; - -#define atime tv[0] -#define mtime tv[1] -#define SCREWUP(str) { why = str; goto screwup; } - - setimes = targisdir = 0; - mask = umask(0); - if (!pflag) - (void)umask(mask); - if (argc != 1) { - run_err("ambiguous target"); - exit(1); - } - targ = *argv; - if (targetshouldbedirectory) - verifydir(targ); - (void)write(rem, "", 1); - if (stat(targ, &stb) == 0 && S_ISDIR(stb.st_mode)) - targisdir = 1; - for (first = 1;; first = 0) { - cp = buf; - if (read(rem, cp, 1) <= 0) - return; - if (*cp++ == '\n') - SCREWUP("unexpected <newline>"); - do { - if (read(rem, &ch, sizeof(ch)) != sizeof(ch)) - SCREWUP("lost connection"); - *cp++ = ch; - } while (cp < &buf[BUFSIZ - 1] && ch != '\n'); - *cp = 0; - - if (buf[0] == '\01' || buf[0] == '\02') { - if (iamremote == 0) - (void)write(STDERR_FILENO, - buf + 1, strlen(buf + 1)); - if (buf[0] == '\02') - exit(1); - ++errs; - continue; - } - if (buf[0] == 'E') { - (void)write(rem, "", 1); - return; - } - - if (ch == '\n') - *--cp = 0; - - cp = buf; - if (*cp == 'T') { - setimes++; - cp++; - if (!isdigit((unsigned char)*cp)) - SCREWUP("mtime.sec not present"); - ull = strtoull(cp, &cp, 10); - if (!cp || *cp++ != ' ') - SCREWUP("mtime.sec not delimited"); - if ((time_t)ull < 0 || (time_t)ull != ull) - setimes = 0; /* out of range */ - mtime.tv_sec = ull; - mtime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != ' ' || mtime.tv_usec < 0 || - mtime.tv_usec > 999999) - SCREWUP("mtime.usec not delimited"); - if (!isdigit((unsigned char)*cp)) - SCREWUP("atime.sec not present"); - ull = strtoull(cp, &cp, 10); - if (!cp || *cp++ != ' ') - SCREWUP("atime.sec not delimited"); - if ((time_t)ull < 0 || (time_t)ull != ull) - setimes = 0; /* out of range */ - atime.tv_sec = ull; - atime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != '\0' || atime.tv_usec < 0 || - atime.tv_usec > 999999) - SCREWUP("atime.usec not delimited"); - (void)write(rem, "", 1); - continue; - } - if (*cp != 'C' && *cp != 'D') { - /* - * Check for the case "rcp remote:foo\* local:bar". - * In this case, the line "No match." can be returned - * by the shell before the rcp command on the remote is - * executed so the ^Aerror_message convention isn't - * followed. - */ - if (first) { - run_err("%s", cp); - exit(1); - } - SCREWUP("expected control record"); - } - mode = 0; - for (++cp; cp < buf + 5; cp++) { - if (*cp < '0' || *cp > '7') - SCREWUP("bad mode"); - mode = (mode << 3) | (*cp - '0'); - } - if (*cp++ != ' ') - SCREWUP("mode not delimited"); - - for (size = 0; isdigit((unsigned char)*cp);) - size = size * 10 + (*cp++ - '0'); - if (*cp++ != ' ') - SCREWUP("size not delimited"); - if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) { - run_err("error: unexpected filename: %s", cp); - exit(1); - } - if (targisdir) { - static char *namebuf; - static int cursize; - size_t need; - - need = strlen(targ) + strlen(cp) + 250; - if (need > cursize) { - if (!(namebuf = malloc(need))) - run_err("%s", strerror(errno)); - } - (void)snprintf(namebuf, need, "%s%s%s", targ, - *targ ? "/" : "", cp); - np = namebuf; - } else - np = targ; - exists = stat(np, &stb) == 0; - if (buf[0] == 'D') { - int mod_flag = pflag; - if (!iamrecursive) - SCREWUP("received directory without -r"); - if (exists) { - if (!S_ISDIR(stb.st_mode)) { - errno = ENOTDIR; - goto bad; - } - if (pflag) - (void)chmod(np, mode); - } else { - /* Handle copying from a read-only directory */ - mod_flag = 1; - if (mkdir(np, mode | S_IRWXU) < 0) - goto bad; - } - vect[0] = np; - sink(1, vect); - if (setimes) { - setimes = 0; - if (utimes(np, tv) < 0) - run_err("%s: set times: %s", - np, strerror(errno)); - } - if (mod_flag) - (void)chmod(np, mode); - continue; - } - omode = mode; - mode |= S_IWUSR; - if ((ofd = open(np, O_WRONLY|O_CREAT, mode)) < 0) { -bad: run_err("%s: %s", np, strerror(errno)); - continue; - } - (void)write(rem, "", 1); - if ((bp = allocbuf(&buffer, ofd, BUFSIZ)) == NULL) { - (void)close(ofd); - continue; - } - cp = bp->buf; - wrerr = NO; - for (count = i = 0; i < size; i += BUFSIZ) { - amt = BUFSIZ; - if (i + amt > size) - amt = size - i; - count += amt; - do { - j = read(rem, cp, amt); - if (j <= 0) { - run_err("%s", j ? strerror(errno) : - "dropped connection"); - exit(1); - } - amt -= j; - cp += j; - } while (amt > 0); - if (count == bp->cnt) { - /* Keep reading so we stay sync'd up. */ - if (wrerr == NO) { - j = write(ofd, bp->buf, count); - if (j != count) { - wrerr = YES; - wrerrno = j >= 0 ? EIO : errno; - } - } - count = 0; - cp = bp->buf; - } - } - if (count != 0 && wrerr == NO && - (j = write(ofd, bp->buf, count)) != count) { - wrerr = YES; - wrerrno = j >= 0 ? EIO : errno; - } - if (wrerr == NO && ftruncate(ofd, size) != 0) { - run_err("%s: truncate: %s", np, strerror(errno)); - wrerr = DISPLAYED; - } - if (pflag) { - if (exists || omode != mode) - if (fchmod(ofd, omode)) { - run_err("%s: set mode: %s", - np, strerror(errno)); - wrerr = DISPLAYED; - } - } else { - if (!exists && omode != mode) - if (fchmod(ofd, omode & ~mask)) { - run_err("%s: set mode: %s", - np, strerror(errno)); - wrerr = DISPLAYED; - } - } - (void)close(ofd); - (void)response(); - if (setimes && wrerr == NO) { - setimes = 0; - if (utimes(np, tv) < 0) { - run_err("%s: set times: %s", - np, strerror(errno)); - wrerr = DISPLAYED; - } - } - switch(wrerr) { - case YES: - run_err("%s: %s", np, strerror(wrerrno)); - break; - case NO: - (void)write(rem, "", 1); - break; - case DISPLAYED: - break; - } - } -screwup: - run_err("protocol error: %s", why); - exit(1); -} - -#ifdef KERBEROS -int -kerberos(char **host, char *bp, char *locuser, char *user) -{ - struct servent *sp; - -again: - if (use_kerberos) { - rem = KSUCCESS; - errno = 0; - if (dest_realm == NULL) - dest_realm = krb_realmofhost(*host); - rem = - doencrypt ? - krcmd_mutual(host, - port, user, bp, 0, dest_realm, &cred, schedule) : - krcmd(host, port, user, bp, 0, dest_realm); - - if (rem < 0) { - use_kerberos = 0; - if ((sp = getservbyname("shell", "tcp")) == NULL) - errx(1, "unknown service shell/tcp"); - if (errno == ECONNREFUSED) - oldw("remote host doesn't support Kerberos"); - else if (errno == ENOENT) - oldw("can't provide Kerberos authentication data"); - port = sp->s_port; - goto again; - } - } else { - if (doencrypt) - errx(1, - "the -x option requires Kerberos authentication"); - rem = rcmd(host, port, locuser, user, bp, 0); - } - return (rem); -} -#endif /* KERBEROS */ - -int -response(void) -{ - char ch, *cp, resp, rbuf[BUFSIZ]; - - if (read(rem, &resp, sizeof(resp)) != sizeof(resp)) - lostconn(0); - - cp = rbuf; - switch(resp) { - case 0: /* ok */ - return (0); - default: - *cp++ = resp; - /* FALLTHROUGH */ - case 1: /* error, followed by error msg */ - case 2: /* fatal error, "" */ - do { - if (read(rem, &ch, sizeof(ch)) != sizeof(ch)) - lostconn(0); - *cp++ = ch; - } while (cp < &rbuf[BUFSIZ] && ch != '\n'); - - if (!iamremote) - (void)write(STDERR_FILENO, rbuf, cp - rbuf); - ++errs; - if (resp == 1) - return (-1); - exit(1); - } - /* NOTREACHED */ -} - -void -usage(void) -{ - (void)fprintf(stderr, - "usage: %s [-p] file1 file2\n" - " %s [-pr] file ... directory\n", - __progname, __progname); - exit(1); -} - -#include <stdarg.h> - -#ifdef KERBEROS -void -oldw(const char *fmt, ...) -{ - char realm[REALM_SZ]; - va_list ap; - - if (krb_get_lrealm(realm, 1) != KSUCCESS) - return; - va_start(ap, fmt); - (void)fprintf(stderr, "rcp: "); - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, ", using standard rcp\n"); - va_end(ap); -} -#endif - -void -run_err(const char *fmt, ...) -{ - static FILE *fp; - va_list ap; - - ++errs; - if (fp == NULL && !(fp = fdopen(rem, "w"))) - return; - (void)fprintf(fp, "%c", 0x01); - (void)fprintf(fp, "rcp: "); - va_start(ap, fmt); - (void)vfprintf(fp, fmt, ap); - va_end(ap); - (void)fprintf(fp, "\n"); - (void)fflush(fp); - - if (!iamremote) { - va_start(ap, fmt); - vwarnx(fmt, ap); - va_end(ap); - } -} diff --git a/bin/rcp/util.c b/bin/rcp/util.c deleted file mode 100644 index 6c0320a20c2..00000000000 --- a/bin/rcp/util.c +++ /dev/null @@ -1,240 +0,0 @@ -/* $OpenBSD: util.c,v 1.20 2013/11/20 20:53:55 deraadt Exp $ */ -/* $NetBSD: util.c,v 1.2 1995/03/21 08:19:08 cgd Exp $ */ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <sys/wait.h> - -#include <ctype.h> -#include <err.h> -#include <errno.h> -#include <paths.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdarg.h> - -#include "extern.h" - -static pid_t do_cmd_pid = -1; /* PID of subprocess during do_local_cmd() */ - -char * -colon(char *cp) -{ - for (; *cp; ++cp) { - if (*cp == ':') - return (cp); - if (*cp == '/') - return (0); - } - return (0); -} - -void -verifydir(char *cp) -{ - struct stat stb; - - if (!stat(cp, &stb)) { - if (S_ISDIR(stb.st_mode)) - return; - errno = ENOTDIR; - } - run_err("%s: %s", cp, strerror(errno)); - exit(1); -} - -int -okname(char *cp0) -{ - int c; - char *cp; - - cp = cp0; - do { - c = *cp; - if (c & 0200) - goto bad; - if (!isalpha((unsigned char)c) && - !isdigit((unsigned char)c) && c != '_' && c != '-') - goto bad; - } while (*++cp); - return (1); - -bad: warnx("%s: invalid user name", cp0); - return (0); -} - -BUF * -allocbuf(BUF *bp, int fd, int blksize) -{ - struct stat stb; - size_t size; - char *p; - - if (fstat(fd, &stb) < 0) { - run_err("fstat: %s", strerror(errno)); - return (0); - } - size = roundup(stb.st_blksize, blksize); - if (size == 0) - size = blksize; - if (bp->cnt >= size) - return (bp); - if ((p = realloc(bp->buf, size)) == NULL) { - free(bp->buf); - bp->buf = NULL; - bp->cnt = 0; - run_err("%s", strerror(errno)); - return (0); - } - memset(p, 0, size); - bp->buf = p; - bp->cnt = size; - return (bp); -} - -/* ARGSUSED */ -void -lostconn(int signo) -{ - extern char *__progname; - char buf[1024]; - - if (!iamremote) { - strlcpy(buf, __progname, sizeof buf); - strlcat(buf, ": lost connection\n", sizeof buf); - write(STDERR_FILENO, buf, strlen(buf)); - } - _exit(1); -} - - -static void -killchild(int signo) -{ - if (do_cmd_pid > 1) { - kill(do_cmd_pid, signo ? signo : SIGTERM); - waitpid(do_cmd_pid, NULL, 0); - } - - if (signo) - _exit(1); - exit(1); -} - -int -do_local_cmd(arglist *a, uid_t userid, gid_t groupid) -{ - int status; - pid_t pid; - - if (a->num == 0) - errx(1, "do_local_cmd: no arguments"); - - if ((pid = fork()) == -1) - err(1, "do_local_cmd: fork"); - - if (pid == 0) { - setresgid(groupid, groupid, groupid); - setgroups(1, &groupid); - setresuid(userid, userid, userid); - execvp(a->list[0], a->list); - perror(a->list[0]); - exit(1); - } - - do_cmd_pid = pid; - signal(SIGTERM, killchild); - signal(SIGINT, killchild); - signal(SIGHUP, killchild); - - while (waitpid(pid, &status, 0) == -1) - if (errno != EINTR) - err(1, "do_local_cmd: waitpid"); - - do_cmd_pid = -1; - - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) - return (-1); - - signal(SIGTERM, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGHUP, SIG_DFL); - - return (0); -} - -/* function to assist building execv() arguments */ -void -addargs(arglist *args, char *fmt, ...) -{ - va_list ap; - char *cp; - u_int nalloc; - int r; - - va_start(ap, fmt); - r = vasprintf(&cp, fmt, ap); - va_end(ap); - if (r == -1) - errx(1, "addargs: argument too long"); - - nalloc = args->nalloc; - if (args->list == NULL) { - nalloc = 32; - args->num = 0; - } else if (args->num+2 >= nalloc) - nalloc *= 2; - - if ((args->list = realloc(args->list, nalloc * sizeof(char *))) == NULL) - errx(1, "addargs: realloc failed"); - args->nalloc = nalloc; - args->list[args->num++] = cp; - args->list[args->num] = NULL; -} - -void -freeargs(arglist *args) -{ - u_int i; - - if (args->list != NULL) { - for (i = 0; i < args->num; i++) - free(args->list[i]); - free(args->list); - args->nalloc = args->num = 0; - args->list = NULL; - } -} |