BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / uucp / uux.c
index 375fe56..f3f1eac 100644 (file)
@@ -1,8 +1,10 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)uux.c      5.6 (Berkeley) 1/24/86";
+static char sccsid[] = "@(#)uux.c      5.14    (Berkeley) 10/27/88";
 #endif
 
 #include "uucp.h"
 #endif
 
 #include "uucp.h"
+#include <sys/stat.h>
+#include <sysexits.h>
 
 #define NOSYSPART 0
 #define HASSYSPART 1
 
 #define NOSYSPART 0
 #define HASSYSPART 1
@@ -27,7 +29,8 @@ register char *p; for (p = d; *p != '\0';)\
 struct timeb Now;
 
 main(argc, argv)
 struct timeb Now;
 
 main(argc, argv)
-char *argv[];
+int argc;
+char **argv;
 {
        char cfile[NAMESIZE];   /* send commands for files from here */
        char dfile[NAMESIZE];   /* used for all data files from here */
 {
        char cfile[NAMESIZE];   /* send commands for files from here */
        char dfile[NAMESIZE];   /* used for all data files from here */
@@ -48,6 +51,8 @@ char *argv[];
        int pipein = 0;
        int startjob = 1;
        char Grade = 'A';
        int pipein = 0;
        int startjob = 1;
        char Grade = 'A';
+       long Gradedelta = 100000000L;   /* "huge number" */
+       long size = 0L;
        char path[MAXFULLNAME];
        char cmd[2*BUFSIZ];
        char *ap, *cmdp;
        char path[MAXFULLNAME];
        char cmd[2*BUFSIZ];
        char *ap, *cmdp;
@@ -58,13 +63,15 @@ char *argv[];
        FILE *fprx, *fpc, *fpd, *fp;
        extern char *getprm(), *lastpart();
        extern FILE *ufopen();
        FILE *fprx, *fpc, *fpd, *fp;
        extern char *getprm(), *lastpart();
        extern FILE *ufopen();
-       int uid, ret;
+       int uid, ret, c;
        char redir = '\0';
        int nonoti = 0;
        int nonzero = 0;
        int link_failed;
        char *ReturnTo = NULL;
        extern int LocalOnly;
        char redir = '\0';
        int nonoti = 0;
        int nonzero = 0;
        int link_failed;
        char *ReturnTo = NULL;
        extern int LocalOnly;
+       extern char *optarg;
+       extern int optind;
 
        strcpy(Progname, "uux");
        uucpname(Myname);
 
        strcpy(Progname, "uux");
        uucpname(Myname);
@@ -74,10 +81,12 @@ char *argv[];
 #ifdef VMS
        arg_fix(argc, argv);
 #endif
 #ifdef VMS
        arg_fix(argc, argv);
 #endif
-       while (argc>1 && argv[1][0] == '-') {
-               switch(argv[1][1]){
+       while (((c = getopt(argc, argv, "-prclCg:x:nzLa:")) != EOF) ||
+           (optind < argc && (c = *argv[optind]) == '-' && ++optind))
+               switch (c) {
+               case '-':
+                       /* FALLTHROUGH */
                case 'p':
                case 'p':
-               case '\0':
                        pipein = 1;
                        break;
                case 'r':
                        pipein = 1;
                        break;
                case 'r':
@@ -96,11 +105,12 @@ char *argv[];
                        Linkit = 0;
                        break;
                case 'g':
                        Linkit = 0;
                        break;
                case 'g':
-                       Grade = argv[1][2];
+                       Grade = *optarg;
+                       Gradedelta = atol(optarg+1);
                        break;
                case 'x':
                        chkdebug();
                        break;
                case 'x':
                        chkdebug();
-                       Debug = atoi(&argv[1][2]);
+                       Debug = atoi(optarg);
                        if (Debug <= 0)
                                Debug = 1;
                        break;
                        if (Debug <= 0)
                                Debug = 1;
                        break;
@@ -114,16 +124,15 @@ char *argv[];
                        LocalOnly++;
                        break;
                case 'a':
                        LocalOnly++;
                        break;
                case 'a':
-                       ReturnTo = &argv[1][2];
+                       ReturnTo = optarg;
                        if (prefix(Myname, ReturnTo) && ReturnTo[strlen(Myname)]                                == '!')
                                ReturnTo = index(ReturnTo, '!') + 1;
                        break;
                        if (prefix(Myname, ReturnTo) && ReturnTo[strlen(Myname)]                                == '!')
                                ReturnTo = index(ReturnTo, '!') + 1;
                        break;
+               case '?':
                default:
                default:
-                       fprintf(stderr, "unknown flag %s\n", argv[1]);
-                               break;
+                       break;
                }
                }
-               --argc;  argv++;
-       }
+
        ap = getwd(Wrkdir);
        if (ap == 0) {
                fprintf(stderr, "can't get working directory; will try to continue\n");
        ap = getwd(Wrkdir);
        if (ap == 0) {
                fprintf(stderr, "can't get working directory; will try to continue\n");
@@ -133,26 +142,38 @@ char *argv[];
        DEBUG(4, "\n\n** %s **\n", "START");
 
        inargs[0] = '\0';
        DEBUG(4, "\n\n** %s **\n", "START");
 
        inargs[0] = '\0';
-       for (argv++; argc > 1; argc--) {
-               DEBUG(4, "arg - %s:", *argv);
+       while (optind < argc) {
+               DEBUG(4, "arg - %s:", argv[optind]);
                strcat(inargs, " ");
                strcat(inargs, " ");
-               strcat(inargs, *argv++);
+               strcat(inargs, argv[optind++]);
        }
        DEBUG(4, "arg - %s\n", inargs);
        }
        DEBUG(4, "arg - %s\n", inargs);
-       ret = subchdir(Spool);
-       ASSERT(ret >= 0, "CHDIR FAILED", Spool, ret);
+       if (subchdir(Spool) < 0) {
+               syslog(LOG_WARNING, "chdir(%s) failed: %m", Spool);
+               cleanup(1);
+       }
        uid = getuid();
        uid = getuid();
-       guinfo(uid, User, path);
+       if (guinfo(uid, User, path) != SUCCESS) {
+               syslog(LOG_WARNING, "Can't find username for uid %d", uid);
+               DEBUG(1, "Using username", "uucp");
+               strcpy(User, "uucp");
+       }
 
        strncpy(local, Myname, MAXBASENAME);
        cmdp = cmd;
        *cmdp = '\0';
        gename(DATAPRE, local, 'X', rxfile);
        fprx = ufopen(rxfile, "w");
 
        strncpy(local, Myname, MAXBASENAME);
        cmdp = cmd;
        *cmdp = '\0';
        gename(DATAPRE, local, 'X', rxfile);
        fprx = ufopen(rxfile, "w");
-       ASSERT(fprx != NULL, "CAN'T OPEN", rxfile, 0);
+       if (fprx == NULL) {
+               syslog(LOG_WARNING, "fopen(%s) failed: %m", rxfile);
+               cleanup(1);
+       }
        gename(DATAPRE, local, 'T', tcfile);
        fpc = ufopen(tcfile, "w");
        gename(DATAPRE, local, 'T', tcfile);
        fpc = ufopen(tcfile, "w");
-       ASSERT(fpc != NULL, "CAN'T OPEN", tcfile, 0);
+       if (fpc == NULL) {
+               syslog(LOG_WARNING, "fopen(%s) failed: %m", tcfile);
+               cleanup(1);
+       }
        fprintf(fprx, "%c %s %s\n", X_USER, User, local);
        if (nonoti)
                fprintf(fprx, "%c\n", X_NONOTI);
        fprintf(fprx, "%c %s %s\n", X_USER, User, local);
        if (nonoti)
                fprintf(fprx, "%c\n", X_NONOTI);
@@ -190,7 +211,10 @@ char *argv[];
        if (pipein) {
                gename(DATAPRE, local, 'B', dfile);
                fpd = ufopen(dfile, "w");
        if (pipein) {
                gename(DATAPRE, local, 'B', dfile);
                fpd = ufopen(dfile, "w");
-               ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0);
+               if (fpd == NULL) {
+                       syslog(LOG_WARNING, "fopen(%s) failed: %m", dfile);
+                       cleanup(1);
+               }
                while (!feof(stdin)) {
                        ret = fread(buf, 1, BUFSIZ, stdin);
                        fwrite(buf, 1, ret, fpd);
                while (!feof(stdin)) {
                        ret = fread(buf, 1, BUFSIZ, stdin);
                        fwrite(buf, 1, ret, fpd);
@@ -202,6 +226,7 @@ char *argv[];
                                perror(dfile);
                                cleanup(EX_IOERR);
                        }
                                perror(dfile);
                                cleanup(EX_IOERR);
                        }
+                       size += ret;
                }
                fclose(fpd);
                strcpy(tfile, dfile);
                }
                fclose(fpd);
                strcpy(tfile, dfile);
@@ -270,6 +295,15 @@ char *argv[];
                        continue;
                }
 
                        continue;
                }
 
+               if (rest[0] != '\0') {
+                       struct stat stbuf;
+                       if (stat(rest, &stbuf) < 0)
+                               DEBUG(4, "Can't stat %s\n", rest);
+                       else 
+                               size += stbuf.st_size;
+                       DEBUG(4, "size = %ld\n", size);
+               }
+
                if (strcmp(xsys, local) == SAME
                 && strcmp(xsys, syspart) == SAME) {
                        if (ckexpf(rest))
                if (strcmp(xsys, local) == SAME
                 && strcmp(xsys, syspart) == SAME) {
                        if (ckexpf(rest))
@@ -328,7 +362,11 @@ char *argv[];
                        strcpy(dfile, tfile);
                        dfile[0] = DATAPRE;
                        fp = ufopen(tfile, "w");
                        strcpy(dfile, tfile);
                        dfile[0] = DATAPRE;
                        fp = ufopen(tfile, "w");
-                       ASSERT(fp != NULL, "CAN'T OPEN", tfile, 0);
+                       if (fp == NULL) {
+                               syslog(LOG_WARNING, "fopen(%s) failed: %m",
+                                       tfile);
+                               cleanup(1);
+                       }
                        if (ckexpf(rest))
                                cleanup(EX_CANTCREAT);
                        GENRCV(fp, rest, dfile, User);
                        if (ckexpf(rest))
                                cleanup(EX_CANTCREAT);
                        GENRCV(fp, rest, dfile, User);
@@ -356,7 +394,11 @@ char *argv[];
                        strcpy(tfile, dfile);
                        tfile[0] = CMDPRE;
                        fpd = ufopen(dfile, "w");
                        strcpy(tfile, dfile);
                        tfile[0] = CMDPRE;
                        fpd = ufopen(dfile, "w");
-                       ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0);
+                       if (fpd == NULL) {
+                               syslog(LOG_WARNING, "fopen(%s) failed: %m",
+                                       dfile);
+                               cleanup(1);
+                       }
                        gename(DATAPRE, local, 'T', t2file);
                        GENRCV(fpd, rest, t2file, User);
                        fclose(fpd);
                        gename(DATAPRE, local, 'T', t2file);
                        GENRCV(fpd, rest, t2file, User);
                        fclose(fpd);
@@ -407,6 +449,13 @@ char *argv[];
                logent(cmd, "XQT QUE'D");
        fclose(fprx);
 
                logent(cmd, "XQT QUE'D");
        fclose(fprx);
 
+       if (size > 0 && Gradedelta > 0) {
+               DEBUG (4, "Grade changed from %c ", Grade);
+               Grade += size/Gradedelta;
+               if (Grade > 'z')
+                       Grade = 'z';
+               DEBUG(4, "to %c\n", Grade);
+       }
        gename(XQTPRE, local, Grade, tfile);
        if (strcmp(xsys, local) == SAME) {
                /* rti!trt: xmv() works across filesystems, link(II) doesnt */
        gename(XQTPRE, local, Grade, tfile);
        if (strcmp(xsys, local) == SAME) {
                /* rti!trt: xmv() works across filesystems, link(II) doesnt */
@@ -519,7 +568,6 @@ register char *name, *rest;
 char *sys;
 {
        register char *c;
 char *sys;
 {
        register char *c;
-       register int i;
 
        if (*name == LQUOTE) {
                if ((c = index(name + 1, RQUOTE)) != NULL) {
 
        if (*name == LQUOTE) {
                if ((c = index(name + 1, RQUOTE)) != NULL) {