date and time created 83/09/07 13:20:12 by ralph
authorRalph Campbell <ralph@ucbvax.Berkeley.EDU>
Thu, 8 Sep 1983 04:20:12 +0000 (20:20 -0800)
committerRalph Campbell <ralph@ucbvax.Berkeley.EDU>
Thu, 8 Sep 1983 04:20:12 +0000 (20:20 -0800)
SCCS-vsn: usr.bin/rdist/main.c 4.1

usr/src/usr.bin/rdist/main.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/rdist/main.c b/usr/src/usr.bin/rdist/main.c
new file mode 100644 (file)
index 0000000..80c52ae
--- /dev/null
@@ -0,0 +1,153 @@
+#ifndef lint
+static char *sccsid = "@(#)main.c      4.1 (Berkeley) 83/09/07";
+#endif
+
+#include "defs.h"
+
+/*
+ * Remote distribution program.
+ */
+
+char   *distfile = "distfile";
+char   *tmpfile = "/tmp/rdistXXXXXX";
+
+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    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 */
+int    rem = 0;        /* file descriptor to remote source/sink process */
+char   host[32];       /* host name */
+int    errs;           /* 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    usergid;        /* user's group ID */
+
+int    cleanup();
+int    lostconn();
+
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       register char *arg;
+       register struct passwd *pw;
+
+       setpwent();
+       pw = getpwuid(userid = getuid());
+       endpwent();
+       if (pw == NULL) {
+               fprintf(stderr, "rdist: Who are you?\n");
+               exit(1);
+       }
+       strcpy(user, pw->pw_name);
+       strcpy(homedir, pw->pw_dir);
+       usergid = pw->pw_gid;
+       gethostname(host, sizeof(host));
+
+       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 'd':
+                               debug++;
+                               break;
+
+                       case 'n':
+                               nflag++;
+                               break;
+
+                       case 'q':
+                               qflag++;
+                               break;
+
+                       case 'v':
+                               vflag++;
+                               break;
+
+                       case 'y':
+                               yflag++;
+                               break;
+
+                       default:
+                               usage();
+                       }
+       }
+       signal(SIGPIPE, lostconn);
+       if (iamremote) {
+               server();
+               exit(errs);
+       }
+       filec = argc;
+       filev = argv;
+
+       if (fin == NULL && (fin = fopen(distfile, "r")) == NULL) {
+               perror(distfile);
+               exit(1);
+       }
+       mktemp(tmpfile);
+       signal(SIGHUP, cleanup);
+       signal(SIGINT, cleanup);
+       signal(SIGQUIT, cleanup);
+       signal(SIGTERM, cleanup);
+
+       yyparse();
+       exit(errs);
+}
+
+usage()
+{
+       printf("Usage: rdist [-f distfile] [-n] [-q] [-y] [-d] [file ...]\n");
+       exit(1);
+}
+
+/*
+ * Remove temporary files and do any cleanup operations before exiting.
+ */
+cleanup()
+{
+       (void) unlink(tmpfile);
+       exit(1);
+}
+
+/*
+ * Print a list of NAME blocks (mostly for debugging).
+ */
+prnames(bp)
+       register struct block *bp;
+{
+       printf("( ");
+       while (bp != NULL) {
+               printf("%s ", bp->b_name);
+               bp = bp->b_next;
+       }
+       printf(")\n");
+}
+
+/*VARARGS*/
+warn(fmt, a1, a2,a3)
+       char *fmt;
+{
+       extern int yylineno;
+
+       fprintf(stderr, "rdist: line %d: Warning: ", yylineno);
+       fprintf(stderr, fmt, a1, a2, a3);
+       fputc('\n', stderr);
+}