Annotation of coherent/a/usr/bob/uusrc/src/uucp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     The uucp command.
        !             3:  *     Copyright Mark Williams Company Lake Bluff IL 1989.
        !             4:  *     All rights reserved.
        !             5:  */
        !             6: 
        !             7: #include <stdio.h>
        !             8: #include <sys/stat.h>
        !             9: #include <ctype.h>
        !            10: #include <access.h>
        !            11: #include <signal.h>
        !            12: #include "dcp.h"
        !            13: 
        !            14: #define DEFGRADE       'a'
        !            15: 
        !            16: extern int getopt();
        !            17: extern int optind;
        !            18: extern char *optarg;
        !            19: extern char *index(/* char *string, char c */);
        !            20: extern char *rindex(/* char *string, char c */);
        !            21: extern char *mktemp(/* char *template */);
        !            22: extern FILE *fopen();
        !            23: extern char    *getwd();
        !            24: char   *build_full_path();
        !            25: char *uucpname(), *whoami();
        !            26: char *filesite(/* char *filename */), *filepath(/* char *filename */);
        !            27: char *myfilepath();
        !            28: char *basename(/* char *filename */);
        !            29: char   tempname[] =                    "/usr/spool/uucp/TM.XXXXXX";
        !            30: char   luser [32];                     /* local user name */
        !            31: char   notifyusr [32];                 /* user to be notified */
        !            32: 
        !            33: char *rmtname = NULL;
        !            34: 
        !            35: static char    spoolname [BUFSIZ];
        !            36: static char    fsname [BUFSIZ];        /* full spool pathname */
        !            37: static char    dirname [BUFSIZ];       /* full spool pathname */
        !            38: static char    fullfrompath [BUFSIZ];
        !            39: static char    fulltopath [BUFSIZ];
        !            40: static char    fromsite [32];
        !            41: static char    tosite [32];
        !            42: static char    options [32];
        !            43: char   thissite[SITELEN];
        !            44: char   cmd[64];                        /* remote command name */
        !            45: FILE   *commandfile;                   /* the "C." spool command file */
        !            46: char   commandsite [40];               /* site in command file name */
        !            47: char   grade = DEFGRADE;               /* transfer grade */
        !            48: char   spdir [40] = SPOOLDIR;          /* spool directory */
        !            49: 
        !            50: int    nocicoflg       = 0;            /* "don't run uucico" flag */
        !            51: int    called_uux      = 0;
        !            52: int    mkdirflg        = 1;
        !            53: int    nocopyflg       = 1;
        !            54: int    copyflg         = 0;
        !            55: int    mailflg         = 0;
        !            56: int    notifyflg       = 0;
        !            57: int    debugflg        = 0;
        !            58: int    debugdir        = 0;
        !            59: char   *toptr, *fromptr;               /* pointers to from and to arguments */
        !            60: char   *topath, *frompath;             /* file pathname part of source/dest */
        !            61: char   topathbuf[BUFSIZ];
        !            62: char   frompathbuf[BUFSIZ];
        !            63: char   *tositeptr, *fromsiteptr;
        !            64: char   argbuf[BUFSIZ];
        !            65: char   argbuf1[BUFSIZ];
        !            66: char   argbuf2[BUFSIZ];
        !            67: 
        !            68: int    sending, receiving;
        !            69: struct stat    statbuf;
        !            70: int    seqno;
        !            71: 
        !            72: main(argc, argv)
        !            73: int argc; 
        !            74: char *argv[];
        !            75: {
        !            76:        int ch;
        !            77:        int     argx;
        !            78: 
        !            79:        commandfile = NULL;
        !            80:        strcpy(commandsite, "<?>");
        !            81:        strcpy(thissite, uucpname());
        !            82:        if (strlen(thissite) == 0) {
        !            83:                fprintf(stderr, "uucp: can't get my own uucpname\n");
        !            84:                exit(1);
        !            85:        }
        !            86:        strcpy(luser, whoami());
        !            87:        strcpy(notifyusr, luser);
        !            88:        if (debugflg > 0)
        !            89:                fprintf(stderr, "I yam %s.\n", luser);
        !            90:        while( (ch=getopt(argc, argv, "dfcCmrg:s:x:n:vV")) != EOF ) {
        !            91:                switch(ch) {
        !            92:                case 'r':
        !            93:                        nocicoflg = 1;
        !            94:                        break;
        !            95:                case 's':
        !            96:                        debugdir = 1;
        !            97:                        fprintf(stderr, "-s option is %s.\n", optarg);
        !            98:                        strcpy(spdir, optarg);
        !            99:                        break;
        !           100:                case 'x':
        !           101:                        debugflg = atoi(optarg);
        !           102:                        fprintf(stderr, "Debug level is %d\n", debugflg);
        !           103:                        fprintf(stderr, "uucp Version %s\n", VERSION);
        !           104:                        break;
        !           105:                case 'g':
        !           106:                        if (isalnum(optarg[0]) && '\0' == optarg[1])
        !           107:                                grade = optarg[0];
        !           108:                        else {
        !           109:                                fprintf(stderr,
        !           110:                                        "uucp: %s: illegal grade\n", optarg);
        !           111:                                usage();
        !           112:                        }
        !           113:                        break;
        !           114:                case 'd':
        !           115:                        mkdirflg = 1;
        !           116:                        break;
        !           117:                case 'f':
        !           118:                        mkdirflg = 0;
        !           119:                        break;
        !           120:                case 'c':
        !           121:                        copyflg         = 0;
        !           122:                        nocopyflg       = 1;
        !           123:                        break;
        !           124:                case 'C':
        !           125:                        copyflg         = 1;
        !           126:                        nocopyflg       = 0;
        !           127:                        break;
        !           128:                case 'm':
        !           129:                        mailflg = 1;
        !           130:                        break;
        !           131:                case 'n':
        !           132:                        notifyflg = 1;
        !           133:                        strcpy (notifyusr, optarg);
        !           134:                        if (debugflg > 5)
        !           135:                        fprintf(stderr, "notify user %s upon rcpt\n",notifyusr);
        !           136:                        break;
        !           137:                case 'v':
        !           138:                case 'V':
        !           139:                        fatal("uucp: Version %s", VERSION);
        !           140:                default:
        !           141:                        fprintf(stderr, "uucp: Option character of %c\n", ch);
        !           142:                        usage();
        !           143:                }
        !           144:        }
        !           145:        toptr = argv[argc - 1];
        !           146:        if (debugflg > 4) {
        !           147:                fprintf(stderr, "argc is now %d\n", argc);
        !           148:                fprintf(stderr, "therefore, last argument is %s.\n", toptr);
        !           149:        }
        !           150:        if ((argc - optind) < 2)
        !           151:                usage();
        !           152:        if (optind >= argc)
        !           153:                usage();
        !           154:        for (argx = optind; argx < argc - 1; argx ++ )
        !           155:                uucp(argv[argx], toptr);
        !           156:        if (commandfile != NULL)
        !           157:                finish_commandfile();
        !           158:        if (nocicoflg || called_uux)
        !           159:                return 0;
        !           160:        else
        !           161:                exec_cico(commandsite);
        !           162:        exit(0);
        !           163: }
        !           164: 
        !           165: uucp(fromptr, toptr)
        !           166: char   *fromptr;
        !           167: char   *toptr;
        !           168: {
        !           169:        if (debugflg > 1)
        !           170:                fprintf(stderr, "uucp from %s to %s\n", fromptr, toptr);
        !           171:        sending = 0;
        !           172:        receiving = 0;
        !           173:        topath = toptr;
        !           174:        if ((tositeptr = filesite(toptr)) != NULL) {
        !           175:                sending = 1;
        !           176:                strcpy(topathbuf, filepath(toptr));
        !           177:                topath = topathbuf;             
        !           178:                if (!knowhost(tositeptr)) {
        !           179:                        fprintf(stderr,
        !           180:                        "uucp: destination site %s unknown\n", tositeptr);
        !           181:                        exit(1);
        !           182:                }
        !           183:        }
        !           184:        strcpy(tosite, tositeptr);      tositeptr = tosite;
        !           185:        frompath = fromptr;
        !           186:        if ((fromsiteptr = filesite(fromptr)) != NULL) {
        !           187:                receiving = 1;
        !           188:                frompath = filepath(fromptr);
        !           189:                if (!knowhost(fromsiteptr)) {
        !           190:                        fprintf(stderr,
        !           191:                        "uucp: from site %s unknown\n", fromsiteptr);
        !           192:                        exit(1);
        !           193:                }
        !           194:        }
        !           195:        strcpy(fromsite, fromsiteptr);  fromsiteptr = fromsite;
        !           196:        if (strlen(fromsite) == 0 && strlen(tosite) == 0) {
        !           197:                if (debugflg > 1) {
        !           198:                        fprintf(stderr, "Need to issue a cp right here\n");
        !           199:                        fprintf(stderr, "cp %s %s\n", frompath, topath);
        !           200:                }
        !           201:                sprintf(argbuf, "cp %s %s", frompath, topath);
        !           202:                system(argbuf);
        !           203:                return;
        !           204:        }
        !           205:        strcpy(frompathbuf, frompath);
        !           206:        if (debugflg > 1)
        !           207:                fprintf(stderr,
        !           208:                "We are copying from site %s file %s to site %s file %s.\n",
        !           209:                fromsiteptr, frompathbuf, tositeptr, topath);
        !           210:        if (sending && receiving) {
        !           211:                if (strcmp (tosite, fromsite) == 0) {
        !           212:                        sprintf(topathbuf, "(%s)", filepath(toptr));
        !           213:                        strcpy(frompathbuf, fromptr);
        !           214:                        sprintf(frompathbuf, "(%s)", filepath(frompathbuf));
        !           215:                } else {
        !           216:                        sprintf(topathbuf, "(%s!%s)", thissite, toptr);
        !           217:                        sprintf(frompathbuf, "(%s)", frompath);
        !           218:                }
        !           219:                return uuxit(fromsiteptr, frompathbuf, topathbuf);
        !           220:        } else if (complex(toptr)) {
        !           221:                sprintf(frompathbuf, "!%s", fromptr);
        !           222:                sprintf(topathbuf, "(%s)", filepath(toptr)); /* strip off first */
        !           223:                if (debugflg > 3) 
        !           224:                        fprintf(stderr, "complex to; %s, %s, %s\n",
        !           225:                                tositeptr, frompathbuf, topathbuf);
        !           226:                return uuxit(tositeptr, frompathbuf, topathbuf);
        !           227:        } else if (complex(fromptr)) {
        !           228:                sprintf(topathbuf, "(%s!%s)", thissite, toptr);
        !           229:                sprintf(frompathbuf, "(%s)", frompath);
        !           230:                if (debugflg > 3)
        !           231:                        fprintf(stderr, "complex fromptr: %s, %s, %s\n",
        !           232:                        fromsiteptr, frompathbuf, topathbuf);
        !           233:                return uuxit(fromsiteptr, frompathbuf, topathbuf);
        !           234:        } else {
        !           235:                if (sending)
        !           236:                        return send_file();
        !           237:                if (receiving) {
        !           238:                        if (metacharacters(frompathbuf)) {
        !           239:                                sprintf(topathbuf, "(%s!%s)", thissite, toptr);
        !           240:                                return
        !           241:                                 uuxit(fromsiteptr, frompathbuf, topathbuf);
        !           242:                        } else
        !           243:                                return receive_file();
        !           244:                }
        !           245:        }
        !           246: }
        !           247: 
        !           248: encode_options()
        !           249: {
        !           250:        strcpy(options, "-");
        !           251:        if (mkdirflg)
        !           252:                strcat (options, "d");
        !           253:        if (nocopyflg)
        !           254:                strcat(options, "c");
        !           255:        if (copyflg)
        !           256:                strcat(options, "C");
        !           257:        if (notifyflg)
        !           258:                strcat(options, "n");
        !           259:        if (mailflg)
        !           260:                strcat(options, "m");
        !           261: }
        !           262: 
        !           263: /*
        !           264:  *     send one file.
        !           265:  *     Return 1 if queuing was successful,
        !           266:  *     0 if any error.
        !           267:  */
        !           268: int
        !           269: send_file()
        !           270: {
        !           271:        FILE    *sourcefp, *datafp;
        !           272:        int     c;
        !           273:        register int (*intfun)(), (*quitfun)();
        !           274: 
        !           275:        encode_options();
        !           276:        strcpy(fullfrompath, build_full_path(frompath));
        !           277:        if (stat(fullfrompath, &statbuf) == -1) {
        !           278:                fprintf(stderr, "uucp: Cannot stat %s.\n", fullfrompath);
        !           279:                return 0;
        !           280:        }
        !           281:        if (debugflg > 4)
        !           282:                fprintf(stderr,
        !           283:                "Send: frompath is %s, full is %s.\n", frompath, fullfrompath);
        !           284:        if (getcommandfile(tositeptr))
        !           285:                return 0;
        !           286: 
        !           287:        intfun = signal(SIGINT, SIG_IGN);
        !           288:        quitfun = signal(SIGQUIT, SIG_IGN);
        !           289:        seqno = getseq(tositeptr);
        !           290:        if (nocopyflg)
        !           291:                strcpy(spoolname, "D.0");
        !           292:        else {
        !           293:                sprintf(spoolname, "D.%s%c%04d", tositeptr, grade, seqno);
        !           294:                if (debugflg > 3) {
        !           295:                        fprintf(stderr, "data file built is %s\n", spoolname);
        !           296:                        fprintf(stderr,"mode: %o.\n",statbuf.st_mode & ~S_IFMT);
        !           297:                }
        !           298:        }
        !           299:        fprintf(commandfile, "S %s %s %s %s %s %o %s\n",
        !           300:                fullfrompath, topath, luser, options, spoolname,
        !           301:                statbuf.st_mode & ~S_IFMT, notifyusr);
        !           302:        if (nocopyflg == 0) {
        !           303:                sprintf(dirname, "%s/%s", spdir, tositeptr);
        !           304:                if (debugflg > 2) 
        !           305:                        fprintf(stderr, "Gotta copy\n");
        !           306:                sprintf(fsname, "%s/%s/%s", spdir, tositeptr, spoolname);
        !           307:                if ((!ckdir(dirname)) || (datafp = fopen(fsname, "w")) == NULL)
        !           308:                        return cantopen("datafile", fsname);
        !           309:                if ((sourcefp = fopen(fullfrompath, "r")) == NULL) 
        !           310:                        return cantopen("fromfile", fullfrompath);
        !           311:                chmod(fsname, 0600);
        !           312:                while ((c = getc(sourcefp)) != EOF)
        !           313:                        putc(c, datafp);
        !           314:                fclose(datafp);
        !           315:                fclose(sourcefp);
        !           316:        } else
        !           317:                strcpy(fsname, fullfrompath);
        !           318:        signal(SIGINT, intfun);
        !           319:        signal(SIGQUIT, quitfun);
        !           320:        return 1;
        !           321: }
        !           322: 
        !           323: cantopen(kind, which)
        !           324: char   *kind;
        !           325: char   *which;
        !           326: {
        !           327:        fprintf(stderr, "uucp: Cannot open %s (%s)\n", which, kind);
        !           328:        return 1;
        !           329: }
        !           330: 
        !           331: /*
        !           332:  *     receive_file
        !           333:  *     Return 1 if queuing successful,
        !           334:  *     0 if not.
        !           335:  */
        !           336: receive_file()
        !           337: {
        !           338:        if (debugflg > 2)
        !           339:                fprintf(stderr, "Receive file\n");
        !           340:        copyflg   = nocopyflg = notifyflg = 0;
        !           341:        encode_options();
        !           342:        strcpy(fulltopath, build_full_path(topath));
        !           343:        if (getcommandfile(fromsiteptr))
        !           344:                return 0;
        !           345:        seqno = getseq(fromsiteptr);
        !           346:        fprintf(commandfile, "R %s %s %s %s dummy\n",
        !           347:                frompathbuf, fulltopath, luser, options);
        !           348:        return 1;
        !           349: }
        !           350: 
        !           351: /*
        !           352:  *     Handle send and receive forms of command.
        !           353:  *     Command of the form "uucp a!b c!d".
        !           354:  *     Send it off via uux to do at another location.
        !           355:  *     of the form "c!uucp b <mysite>!c!d".
        !           356:  */
        !           357: uuxit(cmdsite, from, to)
        !           358: char   *cmdsite;
        !           359: char   *from;
        !           360: char   *to;
        !           361: {
        !           362:        int     argx;
        !           363:        char    *argv[30];
        !           364:        char    debugdirm[64];
        !           365:        char    debugbuf[64];
        !           366:        int     waitstat;
        !           367: 
        !           368:        if (debugflg > 2)
        !           369:                fprintf(stderr, "uuxit(%s, %s, %s)\n",
        !           370:                cmdsite, from, to);
        !           371:        argx    = 0;
        !           372:        argv[argx++] = "memeUUX";
        !           373:        if (debugflg > 0) {
        !           374:                sprintf(debugbuf, "-x%d", debugflg);
        !           375:                argv[argx++] = debugbuf;
        !           376:        }               
        !           377:        /* if (nocicoflg) */    /* always turn off -r for intermediate site */
        !           378:                argv [argx++] = "-r";
        !           379:        if (debugdir) {
        !           380:                sprintf(debugdirm, "-S%s", spdir);
        !           381:                argv [argx++] = debugdirm;
        !           382:        }
        !           383:        sprintf(argbuf, "%s!uucp", cmdsite);
        !           384:        argv[argx++] = argbuf;
        !           385:        argv[argx++] = "-C";
        !           386:        if (mkdirflg)
        !           387:                argv[argx++] = "-d";
        !           388:        if (notifyflg) {
        !           389:                sprintf(argbuf1, "-n%s ", notifyusr);
        !           390:                argv[argx++] = argbuf1;
        !           391:        }
        !           392:        argv[argx++] =  from;
        !           393:        sprintf(argbuf2, "%s", to);
        !           394:        argv[argx++] = argbuf2;
        !           395:        argv[argx++] = NULL;
        !           396:        if (debugflg > 3) {
        !           397:                argx = 0;
        !           398:                while (argv [argx] != NULL)
        !           399:                        fprintf(stderr, "%s ", argv[argx++]);
        !           400:                fprintf(stderr, "\n");
        !           401:        }
        !           402:        if (fork() == 0 ) {
        !           403:                execvp("uux", argv);
        !           404:                exit(1);
        !           405:        } else 
        !           406:                wait (&waitstat);
        !           407:        called_uux = 1;
        !           408:        return waitstat;
        !           409: }
        !           410: 
        !           411: getcommandfile(forwhich)
        !           412: char   *forwhich;
        !           413: {
        !           414:        if (commandfile != NULL) {
        !           415:                if (strcmp(forwhich, commandsite) != 0)
        !           416:                        finish_commandfile();
        !           417:        }
        !           418:        if (commandfile == NULL) {
        !           419:                if ((commandfile = fopen(mktemp(tempname), "w")) == NULL) {
        !           420:                        fprintf(stderr, "uucp: can't open ");
        !           421:                        perror(tempname);
        !           422:                        return 1;
        !           423:                }
        !           424:                strcpy(commandsite, forwhich);
        !           425:        }
        !           426:        return 0;
        !           427: }
        !           428: 
        !           429: finish_commandfile()
        !           430: {
        !           431:        static char buf[BUFSIZ];
        !           432: 
        !           433:        sprintf(buf, "%s/%s", spdir, commandsite);
        !           434:        if (!ckdir(buf)) {
        !           435:                fprintf(stderr, "Unable to make directory \"%s\"\n", buf);
        !           436:                exit(1);
        !           437:        }
        !           438:        sprintf(buf, "%s/%s/C.%.6s%c%04d",
        !           439:                 spdir, commandsite, commandsite, grade, seqno);
        !           440:        if (debugflg > 1)
        !           441:                fprintf(stderr, "command file name is %s.\n", buf);
        !           442:        if (link(tempname, buf) == 0)
        !           443:                unlink(tempname);
        !           444:        else {
        !           445:                fprintf(stderr, "uucp: couldn't rename commandfile\n");
        !           446:                exit(1);
        !           447:        }
        !           448:        fclose (commandfile);
        !           449:        commandfile = NULL;
        !           450: }
        !           451: 
        !           452: char *filesite(name)
        !           453: char *name;
        !           454: {
        !           455:        static char site[SITELEN];
        !           456:        char *p;
        !           457: 
        !           458:        strcpy(site, name);
        !           459:        if ((p = index(site, '!')) == NULL)
        !           460:                return NULL;
        !           461:        *p = '\0';
        !           462:        return site;
        !           463: }
        !           464: 
        !           465: char *filepath(name)
        !           466: char *name;
        !           467: {
        !           468:        char *p;
        !           469:        static char site[SITELEN];
        !           470:        strcpy(site, name);
        !           471:        p = index(site, '!');
        !           472:        if (p == NULL) 
        !           473:                return NULL;
        !           474:        return p + 1;
        !           475: }
        !           476: 
        !           477: char *basename(name)
        !           478: char *name;
        !           479: {
        !           480:        char *p;
        !           481:        if (NULL == (p = rindex(name, '/')))
        !           482:                return name;
        !           483:        else
        !           484:                return p + 1;
        !           485: }
        !           486: 
        !           487: char   *
        !           488: build_full_path(localpath)
        !           489: char   *localpath;
        !           490: {
        !           491:        static  char buf[BUFSIZ];
        !           492:        char    *p;
        !           493:        if ((*localpath != '/') && (*localpath != '~')) {
        !           494:                strcpy(buf, p = getwd());
        !           495:                if (p == NULL) {
        !           496:                        fprintf(stderr, "uucp: Unable to do getpwd\n");
        !           497:                        exit(1);
        !           498:                }
        !           499:                strcat(buf, "/");
        !           500:                strcat(buf, localpath);
        !           501:        } else
        !           502:                strcpy(buf, localpath);
        !           503:        return buf;
        !           504: }
        !           505: 
        !           506: usage()
        !           507: {
        !           508:        fatal("\n\
        !           509: Usage: uucp [-dcmr] [-g grade] [-s dir] [-xnum] <fn> <fn> ... \n\
        !           510: ");
        !           511: }
        !           512: 
        !           513: /*
        !           514:  *     Return 1 if there are shell type metacharacters in the argument.
        !           515:  *     Zero otherwise.
        !           516:  */
        !           517: metacharacters(strin)
        !           518: char   *strin;
        !           519: {
        !           520:        char    *first;
        !           521: 
        !           522:        if (index(strin, '*') != NULL)
        !           523:                return 1;
        !           524:        if (index(strin, '?') != NULL)
        !           525:                return 1;
        !           526:        if (((first = index(strin, '[')) != NULL) && (index(first, ']') != NULL))
        !           527:                return 1;
        !           528:        return 0;
        !           529: }
        !           530: 
        !           531: complex(pathname)
        !           532: char   *pathname;
        !           533: {
        !           534:        char    *cp;
        !           535: 
        !           536:        if ((cp = index(pathname, '!')) != NULL) {
        !           537:                if (index (cp + 1, '!') != NULL)
        !           538:                        return 1;       /* more than one ! */
        !           539:        }
        !           540:        return 0;
        !           541: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.