remove gpib, ib
[unix-history] / usr / src / usr.bin / rdist / main.c
index 80c52ae..78520e4 100644 (file)
@@ -1,54 +1,53 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)main.c      4.1 (Berkeley) 83/09/07";
+static char *sccsid = "@(#)main.c      4.15 (Berkeley) 85/05/16";
 #endif
 
 #include "defs.h"
 
 #endif
 
 #include "defs.h"
 
+#define NHOSTS 100
+
 /*
  * Remote distribution program.
  */
 
 /*
  * Remote distribution program.
  */
 
-char   *distfile = "distfile";
-char   *tmpfile = "/tmp/rdistXXXXXX";
+char   *distfile = NULL;
+char   tmpfile[] = "/tmp/rdistXXXXXX";
+char   *tmpname = &tmpfile[5];
 
 int    debug;          /* debugging flag */
 int    nflag;          /* NOP flag, just print commands without executing */
 int    qflag;          /* Quiet. Don't print messages */
 
 int    debug;          /* debugging flag */
 int    nflag;          /* NOP flag, just print commands without executing */
 int    qflag;          /* Quiet. Don't print messages */
-int    vflag;          /* verify only */
-int    yflag;          /* update iff remote younger than master */
+int    options;        /* global options */
 int    iamremote;      /* act as remote server for transfering files */
 
 int    iamremote;      /* act as remote server for transfering files */
 
-int    filec;          /* number of files to update */
-char   **filev;        /* list of files/directories to update */
 FILE   *fin = NULL;    /* input file pointer */
 FILE   *fin = NULL;    /* input file pointer */
-int    rem = 0;        /* file descriptor to remote source/sink process */
+int    rem = -1;       /* file descriptor to remote source/sink process */
 char   host[32];       /* host name */
 char   host[32];       /* host name */
-int    errs;           /* number of errors while sending/receiving */
+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 */
 char   user[10];       /* user's name */
 char   homedir[128];   /* user's home directory */
 int    userid;         /* user's user ID */
-int    usergid;        /* user's group ID */
+int    groupid;        /* user's group ID */
 
 
-int    cleanup();
-int    lostconn();
+struct passwd *pw;     /* pointer to static area used by getpwent */
+struct group *gr;      /* pointer to static area used by getgrent */
 
 main(argc, argv)
        int argc;
        char *argv[];
 {
        register char *arg;
 
 main(argc, argv)
        int argc;
        char *argv[];
 {
        register char *arg;
-       register struct passwd *pw;
+       int cmdargs = 0;
+       char *dhosts[NHOSTS], **hp = dhosts;
 
 
-       setpwent();
        pw = getpwuid(userid = getuid());
        pw = getpwuid(userid = getuid());
-       endpwent();
        if (pw == NULL) {
        if (pw == NULL) {
-               fprintf(stderr, "rdist: Who are you?\n");
+               fprintf(stderr, "%s: Who are you?\n", argv[0]);
                exit(1);
        }
        strcpy(user, pw->pw_name);
        strcpy(homedir, pw->pw_dir);
                exit(1);
        }
        strcpy(user, pw->pw_name);
        strcpy(homedir, pw->pw_dir);
-       usergid = pw->pw_gid;
+       groupid = pw->pw_gid;
        gethostname(host, sizeof(host));
 
        while (--argc > 0) {
        gethostname(host, sizeof(host));
 
        while (--argc > 0) {
@@ -66,11 +65,35 @@ main(argc, argv)
                                        fin = stdin;
                                break;
 
                                        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':
                        case 'd':
+                               if (--argc <= 0)
+                                       usage();
+                               define(*++argv);
+                               break;
+
+                       case 'D':
                                debug++;
                                break;
 
                                debug++;
                                break;
 
+                       case 'c':
+                               cmdargs++;
+                               break;
+
                        case 'n':
                        case 'n':
+                               if (options & VERIFY) {
+                                       printf("rdist: -n overrides -v\n");
+                                       options &= ~VERIFY;
+                               }
                                nflag++;
                                break;
 
                                nflag++;
                                break;
 
@@ -78,65 +101,146 @@ main(argc, argv)
                                qflag++;
                                break;
 
                                qflag++;
                                break;
 
+                       case 'b':
+                               options |= COMPARE;
+                               break;
+
+                       case 'R':
+                               options |= REMOVE;
+                               break;
+
                        case 'v':
                        case 'v':
-                               vflag++;
+                               if (nflag) {
+                                       printf("rdist: -n overrides -v\n");
+                                       break;
+                               }
+                               options |= VERIFY;
+                               break;
+
+                       case 'w':
+                               options |= WHOLE;
                                break;
 
                        case 'y':
                                break;
 
                        case 'y':
-                               yflag++;
+                               options |= YOUNGER;
+                               break;
+
+                       case 'h':
+                               options |= FOLLOW;
+                               break;
+
+                       case 'i':
+                               options |= IGNLNKS;
                                break;
 
                        default:
                                usage();
                        }
        }
                                break;
 
                        default:
                                usage();
                        }
        }
-       signal(SIGPIPE, lostconn);
+       *hp = NULL;
+
+       setreuid(0, userid);
+       mktemp(tmpfile);
+
        if (iamremote) {
                server();
        if (iamremote) {
                server();
-               exit(errs);
+               exit(nerrs != 0);
        }
        }
-       filec = argc;
-       filev = argv;
 
 
-       if (fin == NULL && (fin = fopen(distfile, "r")) == NULL) {
-               perror(distfile);
-               exit(1);
+       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);
        }
        }
-       mktemp(tmpfile);
-       signal(SIGHUP, cleanup);
-       signal(SIGINT, cleanup);
-       signal(SIGQUIT, cleanup);
-       signal(SIGTERM, cleanup);
 
 
-       yyparse();
-       exit(errs);
+       exit(nerrs != 0);
 }
 
 usage()
 {
 }
 
 usage()
 {
-       printf("Usage: rdist [-f distfile] [-n] [-q] [-y] [-d] [file ...]\n");
+       printf("Usage: rdist [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n");
+       printf("or: rdist [-nqbhirvwyD] -c source [...] machine[:dest]\n");
        exit(1);
 }
 
 /*
        exit(1);
 }
 
 /*
- * Remove temporary files and do any cleanup operations before exiting.
+ * rcp like interface for distributing files.
  */
  */
-cleanup()
+docmdargs(nargs, args)
+       int nargs;
+       char *args[];
 {
 {
-       (void) unlink(tmpfile);
-       exit(1);
+       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).
  */
 }
 
 /*
  * Print a list of NAME blocks (mostly for debugging).
  */
-prnames(bp)
-       register struct block *bp;
+prnames(nl)
+       register struct namelist *nl;
 {
        printf("( ");
 {
        printf("( ");
-       while (bp != NULL) {
-               printf("%s ", bp->b_name);
-               bp = bp->b_next;
+       while (nl != NULL) {
+               printf("%s ", nl->n_name);
+               nl = nl->n_next;
        }
        printf(")\n");
 }
        }
        printf(")\n");
 }