diff options
author | dm <dm@cvs.openbsd.org> | 1996-02-03 12:13:04 +0000 |
---|---|---|
committer | dm <dm@cvs.openbsd.org> | 1996-02-03 12:13:04 +0000 |
commit | f34705a30c83ef27acf58b47c75c736e6858247a (patch) | |
tree | 2121eb2901c910af7604845f5538c2fc26d01ac3 /usr.bin/oldrdist/main.c | |
parent | fdb8a9c5e300099e2c65b848550471fb1d9f0cd4 (diff) |
rdist 6.1.1
Diffstat (limited to 'usr.bin/oldrdist/main.c')
-rw-r--r-- | usr.bin/oldrdist/main.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/usr.bin/oldrdist/main.c b/usr.bin/oldrdist/main.c new file mode 100644 index 00000000000..fd487b0b484 --- /dev/null +++ b/usr.bin/oldrdist/main.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 1983, 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. 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. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1983, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +/* from: static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/9/93"; */ +static char *rcsid = "$Id: main.c,v 1.1 1996/02/03 12:12:00 dm Exp $"; +#endif /* not lint */ + +#include "defs.h" + +#define NHOSTS 100 + +/* + * Remote distribution program. + */ + +char *distfile = NULL; +#define _RDIST_TMP "/rdistXXXXXX" +char tempfile[sizeof _PATH_TMP + sizeof _RDIST_TMP + 1]; +char *tempname; + +int debug; /* debugging flag */ +int nflag; /* NOP flag, just print commands without executing */ +int qflag; /* Quiet. Don't print messages */ +int options; /* global options */ +int iamremote; /* act as remote server for transfering files */ + +FILE *fin = NULL; /* input file pointer */ +int rem = -1; /* file descriptor to remote source/sink process */ +char host[32]; /* host name */ +int nerrs; /* number of errors while sending/receiving */ +char user[10]; /* user's name */ +char homedir[128]; /* user's home directory */ +int userid; /* user's user ID */ +int groupid; /* user's group ID */ + +struct passwd *pw; /* pointer to static area used by getpwent */ +struct group *gr; /* pointer to static area used by getgrent */ + +static void usage __P((void)); +static void docmdargs __P((int, char *[])); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + register char *arg; + int cmdargs = 0; + char *dhosts[NHOSTS], **hp = dhosts; + + pw = getpwuid(userid = getuid()); + if (pw == NULL) { + fprintf(stderr, "%s: Who are you?\n", argv[0]); + exit(1); + } + strcpy(user, pw->pw_name); + strcpy(homedir, pw->pw_dir); + groupid = pw->pw_gid; + gethostname(host, sizeof(host)); + strcpy(tempfile, _PATH_TMP); + strcat(tempfile, _RDIST_TMP); + if ((tempname = rindex(tempfile, '/')) != 0) + tempname++; + else + tempname = tempfile; + + while (--argc > 0) { + if ((arg = *++argv)[0] != '-') + break; + if (!strcmp(arg, "-Server")) + iamremote++; + else while (*++arg) + switch (*arg) { + case 'f': + if (--argc <= 0) + usage(); + distfile = *++argv; + if (distfile[0] == '-' && distfile[1] == '\0') + fin = stdin; + break; + + case 'm': + if (--argc <= 0) + usage(); + if (hp >= &dhosts[NHOSTS-2]) { + fprintf(stderr, "rdist: too many destination hosts\n"); + exit(1); + } + *hp++ = *++argv; + break; + + case 'd': + if (--argc <= 0) + usage(); + define(*++argv); + break; + + case 'D': + debug++; + break; + + case 'c': + cmdargs++; + break; + + case 'n': + if (options & VERIFY) { + printf("rdist: -n overrides -v\n"); + options &= ~VERIFY; + } + nflag++; + break; + + case 'q': + qflag++; + break; + + case 'b': + options |= COMPARE; + break; + + case 'R': + options |= REMOVE; + break; + + case 'v': + if (nflag) { + printf("rdist: -n overrides -v\n"); + break; + } + options |= VERIFY; + break; + + case 'w': + options |= WHOLE; + break; + + case 'y': + options |= YOUNGER; + break; + + case 'h': + options |= FOLLOW; + break; + + case 'i': + options |= IGNLNKS; + break; + + default: + usage(); + } + } + *hp = NULL; + + seteuid(userid); + mktemp(tempfile); + + if (iamremote) { + server(); + exit(nerrs != 0); + } + + if (cmdargs) + docmdargs(argc, argv); + else { + if (fin == NULL) { + if(distfile == NULL) { + if((fin = fopen("distfile","r")) == NULL) + fin = fopen("Distfile", "r"); + } else + fin = fopen(distfile, "r"); + if(fin == NULL) { + perror(distfile ? distfile : "distfile"); + exit(1); + } + } + yyparse(); + if (nerrs == 0) + docmds(dhosts, argc, argv); + } + + exit(nerrs != 0); +} + +static void +usage() +{ + printf("Usage: rdist [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n"); + printf("or: rdist [-nqbhirvwyD] -c source [...] machine[:dest]\n"); + exit(1); +} + +/* + * rcp like interface for distributing files. + */ +static void +docmdargs(nargs, args) + int nargs; + char *args[]; +{ + register struct namelist *nl, *prev; + register char *cp; + struct namelist *files, *hosts; + struct subcmd *cmds; + char *dest; + static struct namelist tnl = { NULL, NULL }; + int i; + + if (nargs < 2) + usage(); + + prev = NULL; + for (i = 0; i < nargs - 1; i++) { + nl = makenl(args[i]); + if (prev == NULL) + files = prev = nl; + else { + prev->n_next = nl; + prev = nl; + } + } + + cp = args[i]; + if ((dest = index(cp, ':')) != NULL) + *dest++ = '\0'; + tnl.n_name = cp; + hosts = expand(&tnl, E_ALL); + if (nerrs) + exit(1); + + if (dest == NULL || *dest == '\0') + cmds = NULL; + else { + cmds = makesubcmd(INSTALL); + cmds->sc_options = options; + cmds->sc_name = dest; + } + + if (debug) { + printf("docmdargs()\nfiles = "); + prnames(files); + printf("hosts = "); + prnames(hosts); + } + insert(NULL, files, hosts, cmds); + docmds(NULL, 0, NULL); +} + +/* + * Print a list of NAME blocks (mostly for debugging). + */ +void +prnames(nl) + register struct namelist *nl; +{ + printf("( "); + while (nl != NULL) { + printf("%s ", nl->n_name); + nl = nl->n_next; + } + printf(")\n"); +} + +#if __STDC__ +#include <stdarg.h> +#else +#include <varargs.h> +#endif + +void +#if __STDC__ +warn(const char *fmt, ...) +#else +warn(fmt, va_alist) + char *fmt; + va_dcl +#endif +{ + extern int yylineno; + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif + (void)fprintf(stderr, "rdist: line %d: Warning: ", yylineno); + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, "\n"); + va_end(ap); +} |