convert to use getarg

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9798 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
2001-04-21 16:03:10 +00:00
parent 67a7eab44e
commit 396aa1eb2a

View File

@@ -32,9 +32,9 @@
*/ */
#include "rcp_locl.h" #include "rcp_locl.h"
#include <getarg.h>
#define RSH_PROGRAM "rsh" #define RSH_PROGRAM "rsh"
#define OPTIONS "5dfFKpP:rtxz"
struct passwd *pwd; struct passwd *pwd;
uid_t userid; uid_t userid;
@@ -53,61 +53,57 @@ void sink (int, char *[]);
void source (int, char *[]); void source (int, char *[]);
void tolocal (int, char *[]); void tolocal (int, char *[]);
void toremote (char *, int, char *[]); void toremote (char *, int, char *[]);
void usage (void);
int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout); int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout);
int static int fflag, tflag;
main(argc, argv)
int argc; static int version_flag, help_flag;
char *argv[];
{ struct getargs args[] = {
int ch, fflag, tflag; { NULL, '5', arg_flag, &usekrb5, "use Kerberos 5 authentication" },
char *targ; { NULL, 'F', arg_flag, &forwardtkt, "forward credentials" },
{ NULL, 'K', arg_flag, &usebroken, "use BSD authentication" },
{ NULL, 'P', arg_string, &port, "non-default port", "port" },
{ NULL, 'p', arg_flag, &pflag, "preserve file permissions" },
{ NULL, 'r', arg_flag, &iamrecursive, "recursive mode" },
{ NULL, 'x', arg_flag, &doencrypt, "use encryption" },
{ NULL, 'z', arg_flag, &noencrypt, "don't encrypt" },
{ NULL, 'd', arg_flag, &targetshouldbedirectory },
{ NULL, 'f', arg_flag, &fflag },
{ NULL, 't', arg_flag, &tflag },
{ "version", 0, arg_flag, &version_flag },
{ "help", 0, arg_flag, &help_flag }
};
static void
usage (int ret)
{
arg_printusage (args,
sizeof(args) / sizeof(args[0]),
NULL,
"file1 file2|file... directory");
exit (ret);
}
int
main(int argc, char **argv)
{
char *targ;
int optind = 0;
if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv,
&optind))
usage (1);
if(help_flag)
usage(0);
if (version_flag) {
print_version (NULL);
return 0;
}
iamremote = (fflag || tflag);
fflag = tflag = 0;
while ((ch = getopt(argc, argv, OPTIONS)) != -1)
switch(ch) { /* User-visible flags. */
case '5':
usekrb5 = 1;
break;
case 'K':
usebroken = 1;
break;
case 'P':
port = optarg;
break;
case 'F':
forwardtkt = 1;
break;
case 'p':
pflag = 1;
break;
case 'r':
iamrecursive = 1;
break;
case 'x':
doencrypt = 1;
break;
case 'z':
noencrypt = 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;
case '?':
default:
usage();
}
argc -= optind; argc -= optind;
argv += optind; argv += optind;
@@ -118,29 +114,29 @@ main(argc, argv)
remout = STDOUT_FILENO; remout = STDOUT_FILENO;
if (fflag) { /* Follow "protocol", send data. */ if (fflag) { /* Follow "protocol", send data. */
(void)response(); response();
(void)setuid(userid); setuid(userid);
source(argc, argv); source(argc, argv);
exit(errs); exit(errs);
} }
if (tflag) { /* Receive data. */ if (tflag) { /* Receive data. */
(void)setuid(userid); setuid(userid);
sink(argc, argv); sink(argc, argv);
exit(errs); exit(errs);
} }
if (argc < 2) if (argc < 2)
usage(); usage(1);
if (argc > 2) if (argc > 2)
targetshouldbedirectory = 1; targetshouldbedirectory = 1;
remin = remout = -1; remin = remout = -1;
/* Command to be executed on remote system using "rsh". */ /* Command to be executed on remote system using "rsh". */
(void) sprintf(cmd, "rcp%s%s%s", iamrecursive ? " -r" : "", sprintf(cmd, "rcp%s%s%s", iamrecursive ? " -r" : "",
pflag ? " -p" : "", targetshouldbedirectory ? " -d" : ""); pflag ? " -p" : "", targetshouldbedirectory ? " -d" : "");
(void)signal(SIGPIPE, lostconn); signal(SIGPIPE, lostconn);
if ((targ = colon(argv[argc - 1]))) /* Dest is remote host. */ if ((targ = colon(argv[argc - 1]))) /* Dest is remote host. */
toremote(targ, argc, argv); toremote(targ, argc, argv);
@@ -153,9 +149,7 @@ main(argc, argv)
} }
void void
toremote(targ, argc, argv) toremote(char *targ, int argc, char **argv)
char *targ, *argv[];
int argc;
{ {
int i, len; int i, len;
char *bp, *host, *src, *suser, *thost, *tuser; char *bp, *host, *src, *suser, *thost, *tuser;
@@ -196,25 +190,25 @@ toremote(targ, argc, argv)
suser = pwd->pw_name; suser = pwd->pw_name;
else if (!okname(suser)) else if (!okname(suser))
continue; continue;
(void)snprintf(bp, len, snprintf(bp, len,
"%s %s -l %s -n %s %s '%s%s%s:%s'", "%s %s -l %s -n %s %s '%s%s%s:%s'",
_PATH_RSH, host, suser, cmd, src, _PATH_RSH, host, suser, cmd, src,
tuser ? tuser : "", tuser ? "@" : "", tuser ? tuser : "", tuser ? "@" : "",
thost, targ); thost, targ);
} else } else
(void)snprintf(bp, len, snprintf(bp, len,
"exec %s %s -n %s %s '%s%s%s:%s'", "exec %s %s -n %s %s '%s%s%s:%s'",
_PATH_RSH, argv[i], cmd, src, _PATH_RSH, argv[i], cmd, src,
tuser ? tuser : "", tuser ? "@" : "", tuser ? tuser : "", tuser ? "@" : "",
thost, targ); thost, targ);
(void)susystem(bp, userid); susystem(bp, userid);
(void)free(bp); free(bp);
} else { /* local to remote */ } else { /* local to remote */
if (remin == -1) { if (remin == -1) {
len = strlen(targ) + CMDNEEDS + 20; len = strlen(targ) + CMDNEEDS + 20;
if (!(bp = malloc(len))) if (!(bp = malloc(len)))
err(1, "malloc"); err(1, "malloc");
(void)snprintf(bp, len, "%s -t %s", cmd, targ); snprintf(bp, len, "%s -t %s", cmd, targ);
host = thost; host = thost;
if (do_cmd(host, tuser, bp, &remin, &remout) < 0) if (do_cmd(host, tuser, bp, &remin, &remout) < 0)
@@ -222,8 +216,8 @@ toremote(targ, argc, argv)
if (response() < 0) if (response() < 0)
exit(1); exit(1);
(void)free(bp); free(bp);
(void)setuid(userid); setuid(userid);
} }
source(1, argv+i); source(1, argv+i);
} }
@@ -231,9 +225,7 @@ toremote(targ, argc, argv)
} }
void void
tolocal(argc, argv) tolocal(int argc, char **argv)
int argc;
char *argv[];
{ {
int i, len; int i, len;
char *bp, *host, *src, *suser; char *bp, *host, *src, *suser;
@@ -244,12 +236,12 @@ tolocal(argc, argv)
strlen(argv[argc - 1]) + 20; strlen(argv[argc - 1]) + 20;
if (!(bp = malloc(len))) if (!(bp = malloc(len)))
err(1, "malloc"); err(1, "malloc");
(void)snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,
iamrecursive ? " -PR" : "", pflag ? " -p" : "", iamrecursive ? " -PR" : "", pflag ? " -p" : "",
argv[i], argv[argc - 1]); argv[i], argv[argc - 1]);
if (susystem(bp, userid)) if (susystem(bp, userid))
++errs; ++errs;
(void)free(bp); free(bp);
continue; continue;
} }
*src++ = 0; *src++ = 0;
@@ -269,16 +261,16 @@ tolocal(argc, argv)
len = strlen(src) + CMDNEEDS + 20; len = strlen(src) + CMDNEEDS + 20;
if ((bp = malloc(len)) == NULL) if ((bp = malloc(len)) == NULL)
err(1, "malloc"); err(1, "malloc");
(void)snprintf(bp, len, "%s -f %s", cmd, src); snprintf(bp, len, "%s -f %s", cmd, src);
if (do_cmd(host, suser, bp, &remin, &remout) < 0) { if (do_cmd(host, suser, bp, &remin, &remout) < 0) {
(void)free(bp); free(bp);
++errs; ++errs;
continue; continue;
} }
(void)free(bp); free(bp);
sink(1, argv + argc - 1); sink(1, argv + argc - 1);
(void)seteuid(0); seteuid(0);
(void)close(remin); close(remin);
remin = remout = -1; remin = remout = -1;
} }
} }
@@ -300,9 +292,7 @@ sizestr(off_t size)
void void
source(argc, argv) source(int argc, char **argv)
int argc;
char *argv[];
{ {
struct stat stb; struct stat stb;
static BUF buffer; static BUF buffer;
@@ -341,21 +331,21 @@ syserr: run_err("%s: %s", name, strerror(errno));
* Make it compatible with possible future * Make it compatible with possible future
* versions expecting microseconds. * versions expecting microseconds.
*/ */
(void)snprintf(buf, sizeof(buf), "T%ld 0 %ld 0\n", snprintf(buf, sizeof(buf), "T%ld 0 %ld 0\n",
(long)stb.st_mtime, (long)stb.st_mtime,
(long)stb.st_atime); (long)stb.st_atime);
(void)write(remout, buf, strlen(buf)); write(remout, buf, strlen(buf));
if (response() < 0) if (response() < 0)
goto next; goto next;
} }
#define MODEMASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) #define MODEMASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)
snprintf(buf, sizeof(buf), "C%04o %s %s\n", snprintf(buf, sizeof(buf), "C%04o %s %s\n",
stb.st_mode & MODEMASK, sizestr(stb.st_size), last); stb.st_mode & MODEMASK, sizestr(stb.st_size), last);
(void)write(remout, buf, strlen(buf)); write(remout, buf, strlen(buf));
if (response() < 0) if (response() < 0)
goto next; goto next;
if ((bp = allocbuf(&buffer, fd, BUFSIZ)) == NULL) { if ((bp = allocbuf(&buffer, fd, BUFSIZ)) == NULL) {
next: (void)close(fd); next: close(fd);
continue; continue;
} }
@@ -370,7 +360,7 @@ next: (void)close(fd);
haderr = result >= 0 ? EIO : errno; haderr = result >= 0 ? EIO : errno;
} }
if (haderr) if (haderr)
(void)write(remout, bp->buf, amt); write(remout, bp->buf, amt);
else { else {
result = write(remout, bp->buf, amt); result = write(remout, bp->buf, amt);
if (result != amt) if (result != amt)
@@ -380,17 +370,15 @@ next: (void)close(fd);
if (close(fd) && !haderr) if (close(fd) && !haderr)
haderr = errno; haderr = errno;
if (!haderr) if (!haderr)
(void)write(remout, "", 1); write(remout, "", 1);
else else
run_err("%s: %s", name, strerror(haderr)); run_err("%s: %s", name, strerror(haderr));
(void)response(); response();
} }
} }
void void
rsource(name, statp) rsource(char *name, struct stat *statp)
char *name;
struct stat *statp;
{ {
DIR *dirp; DIR *dirp;
struct dirent *dp; struct dirent *dp;
@@ -406,18 +394,18 @@ rsource(name, statp)
else else
last++; last++;
if (pflag) { if (pflag) {
(void)snprintf(path, sizeof(path), "T%ld 0 %ld 0\n", snprintf(path, sizeof(path), "T%ld 0 %ld 0\n",
(long)statp->st_mtime, (long)statp->st_mtime,
(long)statp->st_atime); (long)statp->st_atime);
(void)write(remout, path, strlen(path)); write(remout, path, strlen(path));
if (response() < 0) { if (response() < 0) {
closedir(dirp); closedir(dirp);
return; return;
} }
} }
(void)snprintf(path, sizeof(path), snprintf(path, sizeof(path),
"D%04o %d %s\n", statp->st_mode & MODEMASK, 0, last); "D%04o %d %s\n", statp->st_mode & MODEMASK, 0, last);
(void)write(remout, path, strlen(path)); write(remout, path, strlen(path));
if (response() < 0) { if (response() < 0) {
closedir(dirp); closedir(dirp);
return; return;
@@ -431,19 +419,17 @@ rsource(name, statp)
run_err("%s/%s: name too long", name, dp->d_name); run_err("%s/%s: name too long", name, dp->d_name);
continue; continue;
} }
(void)snprintf(path, sizeof(path), "%s/%s", name, dp->d_name); snprintf(path, sizeof(path), "%s/%s", name, dp->d_name);
vect[0] = path; vect[0] = path;
source(1, vect); source(1, vect);
} }
(void)closedir(dirp); closedir(dirp);
(void)write(remout, "E\n", 2); write(remout, "E\n", 2);
(void)response(); response();
} }
void void
sink(argc, argv) sink(int argc, char **argv)
int argc;
char *argv[];
{ {
static BUF buffer; static BUF buffer;
struct stat stb; struct stat stb;
@@ -462,7 +448,7 @@ sink(argc, argv)
setimes = targisdir = 0; setimes = targisdir = 0;
mask = umask(0); mask = umask(0);
if (!pflag) if (!pflag)
(void)umask(mask); umask(mask);
if (argc != 1) { if (argc != 1) {
run_err("ambiguous target"); run_err("ambiguous target");
exit(1); exit(1);
@@ -470,7 +456,7 @@ sink(argc, argv)
targ = *argv; targ = *argv;
if (targetshouldbedirectory) if (targetshouldbedirectory)
verifydir(targ); verifydir(targ);
(void)write(remout, "", 1); write(remout, "", 1);
if (stat(targ, &stb) == 0 && S_ISDIR(stb.st_mode)) if (stat(targ, &stb) == 0 && S_ISDIR(stb.st_mode))
targisdir = 1; targisdir = 1;
for (first = 1;; first = 0) { for (first = 1;; first = 0) {
@@ -488,7 +474,7 @@ sink(argc, argv)
if (buf[0] == '\01' || buf[0] == '\02') { if (buf[0] == '\01' || buf[0] == '\02') {
if (iamremote == 0) if (iamremote == 0)
(void)write(STDERR_FILENO, write(STDERR_FILENO,
buf + 1, strlen(buf + 1)); buf + 1, strlen(buf + 1));
if (buf[0] == '\02') if (buf[0] == '\02')
exit(1); exit(1);
@@ -496,7 +482,7 @@ sink(argc, argv)
continue; continue;
} }
if (buf[0] == 'E') { if (buf[0] == 'E') {
(void)write(remout, "", 1); write(remout, "", 1);
return; return;
} }
@@ -519,7 +505,7 @@ sink(argc, argv)
atime.tv_usec = strtol(cp, &cp, 10); atime.tv_usec = strtol(cp, &cp, 10);
if (!cp || *cp++ != '\0') if (!cp || *cp++ != '\0')
SCREWUP("atime.usec not delimited"); SCREWUP("atime.usec not delimited");
(void)write(remout, "", 1); write(remout, "", 1);
continue; continue;
} }
if (*cp != 'C' && *cp != 'D') { if (*cp != 'C' && *cp != 'D') {
@@ -559,7 +545,7 @@ sink(argc, argv)
if (!(namebuf = malloc(need))) if (!(namebuf = malloc(need)))
run_err("%s", strerror(errno)); run_err("%s", strerror(errno));
} }
(void)snprintf(namebuf, need, "%s%s%s", targ, snprintf(namebuf, need, "%s%s%s", targ,
*targ ? "/" : "", cp); *targ ? "/" : "", cp);
np = namebuf; np = namebuf;
} else } else
@@ -573,7 +559,7 @@ sink(argc, argv)
goto bad; goto bad;
} }
if (pflag) if (pflag)
(void)chmod(np, mode); chmod(np, mode);
} else { } else {
/* Handle copying from a read-only directory */ /* Handle copying from a read-only directory */
mod_flag = 1; mod_flag = 1;
@@ -589,7 +575,7 @@ sink(argc, argv)
np, strerror(errno)); np, strerror(errno));
} }
if (mod_flag) if (mod_flag)
(void)chmod(np, mode); chmod(np, mode);
continue; continue;
} }
omode = mode; omode = mode;
@@ -598,9 +584,9 @@ sink(argc, argv)
bad: run_err("%s: %s", np, strerror(errno)); bad: run_err("%s: %s", np, strerror(errno));
continue; continue;
} }
(void)write(remout, "", 1); write(remout, "", 1);
if ((bp = allocbuf(&buffer, ofd, BUFSIZ)) == NULL) { if ((bp = allocbuf(&buffer, ofd, BUFSIZ)) == NULL) {
(void)close(ofd); close(ofd);
continue; continue;
} }
cp = bp->buf; cp = bp->buf;
@@ -650,8 +636,8 @@ bad: run_err("%s: %s", np, strerror(errno));
run_err("%s: set mode: %s", run_err("%s: set mode: %s",
np, strerror(errno)); np, strerror(errno));
} }
(void)close(ofd); close(ofd);
(void)response(); response();
if (setimes && wrerr == NO) { if (setimes && wrerr == NO) {
setimes = 0; setimes = 0;
if (utimes(np, tv) < 0) { if (utimes(np, tv) < 0) {
@@ -665,7 +651,7 @@ bad: run_err("%s: %s", np, strerror(errno));
run_err("%s: %s", np, strerror(wrerrno)); run_err("%s: %s", np, strerror(wrerrno));
break; break;
case NO: case NO:
(void)write(remout, "", 1); write(remout, "", 1);
break; break;
case DISPLAYED: case DISPLAYED:
break; break;
@@ -677,7 +663,7 @@ screwup:
} }
int int
response() response(void)
{ {
char ch, *cp, resp, rbuf[BUFSIZ]; char ch, *cp, resp, rbuf[BUFSIZ];
@@ -700,7 +686,7 @@ response()
} while (cp < &rbuf[BUFSIZ] && ch != '\n'); } while (cp < &rbuf[BUFSIZ] && ch != '\n');
if (!iamremote) if (!iamremote)
(void)write(STDERR_FILENO, rbuf, cp - rbuf); write(STDERR_FILENO, rbuf, cp - rbuf);
++errs; ++errs;
if (resp == 1) if (resp == 1)
return (-1); return (-1);
@@ -709,15 +695,6 @@ response()
/* NOTREACHED */ /* NOTREACHED */
} }
void
usage()
{
(void)fprintf(stderr, "%s\n%s\n",
"usage: rcp [-5FKpx] [-P port] f1 f2",
" rcp [-5FKprx] [-P port] f1 ... fn directory");
exit(1);
}
#include <stdarg.h> #include <stdarg.h>
void void
@@ -730,11 +707,11 @@ run_err(const char *fmt, ...)
++errs; ++errs;
if (fp == NULL && !(fp = fdopen(remout, "w"))) if (fp == NULL && !(fp = fdopen(remout, "w")))
return; return;
(void)fprintf(fp, "%c", 0x01); fprintf(fp, "%c", 0x01);
(void)fprintf(fp, "rcp: "); fprintf(fp, "rcp: ");
(void)vfprintf(fp, fmt, ap); vfprintf(fp, fmt, ap);
(void)fprintf(fp, "\n"); fprintf(fp, "\n");
(void)fflush(fp); fflush(fp);
if (!iamremote) if (!iamremote)
vwarnx(fmt, ap); vwarnx(fmt, ap);