Annotation of 3BSD/cmd/uucp/uucp.c, revision 1.1

1.1     ! root        1:        /*  uucp 2.7  5/24/79  19:40:13  */
        !             2: #include "uucp.h"
        !             3: #include "uucpdefs.h"
        !             4: #include <sys/types.h>
        !             5: #include <sys/stat.h>
        !             6: 
        !             7: static char SiD[] = "@(#)uucp  2.7";
        !             8: 
        !             9: /*
        !            10:  *     uucp
        !            11:  */
        !            12: 
        !            13: int Uid;
        !            14: char *Ropt = " ";
        !            15: char Path[100], Optns[10], Ename[8];
        !            16: char Grade = 'n';
        !            17: int Copy = 1;
        !            18: 
        !            19: #define MAXCOUNT 20    /* maximun number of commands per C. file */
        !            20: 
        !            21: main(argc, argv)
        !            22: char *argv[];
        !            23: {
        !            24:        int ret;
        !            25:        char *sysfile1, *sysfile2, *cp;
        !            26:        char file1[MAXFULLNAME], file2[MAXFULLNAME];
        !            27:        extern char *index();
        !            28: 
        !            29:        uucpname(Myname);
        !            30:        Optns[0] = '-';
        !            31:        Ename[0] = Optns[1] = '\0';
        !            32:        while(argc>1 && argv[1][0] == '-'){
        !            33:                switch(argv[1][1]){
        !            34:                case 'c':
        !            35:                        Copy = 0;
        !            36:                        strcat(Optns, "c");
        !            37:                        break;
        !            38:                case 'd':
        !            39:                        strcat(Optns, "d");
        !            40:                        break;
        !            41:                case 'e':
        !            42:                        sprintf(Ename, "%.7s", &argv[1][2]);
        !            43:                        break;
        !            44:                case 'g':
        !            45:                        Grade = argv[1][2]; break;
        !            46:                case 'm':
        !            47:                        strcat(Optns, "m");
        !            48:                        break;
        !            49:                case 'r':
        !            50:                        Ropt = argv[1];
        !            51:                        break;
        !            52:                case 's':
        !            53:                        Spool = &argv[1][2]; break;
        !            54:                case 'x':
        !            55:                        Debug = atoi(&argv[1][2]);
        !            56:                        if (Debug <= 0)
        !            57:                                Debug = 1;
        !            58:                        break;
        !            59:                default:
        !            60:                        printf("unknown flag %s\n", argv[1]); break;
        !            61:                }
        !            62:                --argc;  argv++;
        !            63:        }
        !            64:        DEBUG(4, "\n\n** %s **\n", "START");
        !            65:        ret = gwd(Wrkdir);
        !            66:        if (ret != 0) {
        !            67:                fprintf(stderr, "can't get working directory; will try to continue\n");
        !            68:                strcpy(Wrkdir, "/UNKNOWN");
        !            69:        }
        !            70:        chdir(Spool);
        !            71: 
        !            72:        Uid = getuid();
        !            73:        ret = guinfo(Uid, User, Path);
        !            74:        ASSERT(ret == 0, "CAN NOT FIND UID %d\n", Uid);
        !            75:        DEBUG(4, "UID %d, ", Uid);
        !            76:        DEBUG(4, "User %s,", User);
        !            77:        DEBUG(4, "Ename (%s) ", Ename);
        !            78:        DEBUG(4, "PATH %s\n", Path);
        !            79:        if (argc < 3) {
        !            80:                fprintf(stderr, "usage uucp from ... to\n");
        !            81:                cleanup(0);
        !            82:        }
        !            83: 
        !            84: 
        !            85:        /*  set up "to" system and file names  */
        !            86:        if ((cp = index(argv[argc - 1], '!')) != NULL) {
        !            87:                sysfile2 = argv[argc - 1];
        !            88:                *cp = '\0';
        !            89:                if (*sysfile2 == '\0')
        !            90:                        sysfile2 = Myname;
        !            91:                else
        !            92:                        sprintf(Rmtname, "%.7s", sysfile2);
        !            93:                if (versys(sysfile2) != 0) {
        !            94:                        fprintf(stderr, "bad system name: %s\n", sysfile2);
        !            95:                        cleanup(0);
        !            96:                }
        !            97:                strcpy(file2, cp + 1);
        !            98:        }
        !            99:        else {
        !           100:                sysfile2 = Myname;
        !           101:                strcpy(file2, argv[argc - 1]);
        !           102:        }
        !           103:        if (strlen(sysfile2) > 7)
        !           104:                *(sysfile2 + 7) = '\0';
        !           105: 
        !           106: 
        !           107:        /*  do each from argument  */
        !           108:        while (argc > 2) {
        !           109:                if ((cp = index(argv[1], '!')) != NULL) {
        !           110:                        sysfile1 = argv[1];
        !           111:                        *cp = '\0';
        !           112:                        if (strlen(sysfile1) > 7)
        !           113:                                *(sysfile1 + 7) = '\0';
        !           114:                        if (*sysfile1 == '\0')
        !           115:                                sysfile1 = Myname;
        !           116:                        else
        !           117:                                sprintf(Rmtname, "%.7s", sysfile1);
        !           118:                        if (versys(sysfile1) != 0) {
        !           119:                                fprintf(stderr, "bad system name: %s\n", sysfile1);
        !           120:                                cleanup(0);
        !           121:                        }
        !           122:                        strcpy(file1, cp + 1);
        !           123:                }
        !           124:                else {
        !           125:                        sysfile1 = Myname;
        !           126:                        strcpy(file1, argv[1]);
        !           127:                }
        !           128:                DEBUG(4, "file1 - %s\n", file1);
        !           129:                copy(sysfile1, file1, sysfile2, file2);
        !           130:                --argc;
        !           131:                argv++;
        !           132:        }
        !           133: 
        !           134:        clscfile();
        !           135:        if (*Ropt != '-')
        !           136:                xuucico("");
        !           137:        cleanup(0);
        !           138: }
        !           139: 
        !           140: cleanup(code)
        !           141: int code;
        !           142: {
        !           143:        logcls();
        !           144:        rmlock(NULL);
        !           145:        exit(code);
        !           146: }
        !           147: 
        !           148: 
        !           149: /***
        !           150:  *     copy(s1, f1, s2, f2)    generate copy files
        !           151:  *     char *s1, *f1, *s2, *f2;
        !           152:  *
        !           153:  *     return codes 0  |  FAIL
        !           154:  */
        !           155: 
        !           156: copy(s1, f1, s2, f2)
        !           157: char *s1, *f1, *s2, *f2;
        !           158: {
        !           159:        int ret, type, statret;
        !           160:        struct stat stbuf, stbuf1;
        !           161:        char dfile[NAMESIZE];
        !           162:        char file1[MAXFULLNAME], file2[MAXFULLNAME];
        !           163:        FILE *cfp;
        !           164:        extern char *index();
        !           165:        extern FILE *gtcfile();
        !           166: 
        !           167:        type = 0;
        !           168:        strcpy(file1, f1);
        !           169:        strcpy(file2, f2);
        !           170:        if (strcmp(s1, Myname) != SAME)
        !           171:                type = 1;
        !           172:        if (strcmp(s2, Myname) != SAME)
        !           173:                type += 2;
        !           174:        if (type & 01)
        !           175:                if ((index(file1, '*') != NULL
        !           176:                  || index(file1, '?') != NULL
        !           177:                  || index(file1, '[') != NULL))
        !           178:                        type = 4;
        !           179: 
        !           180:        switch (type) {
        !           181:        case 0:
        !           182:                /* all work here */
        !           183:                DEBUG(4, "all work here %d\n", type);
        !           184:                expfile(file1);
        !           185:                expfile(file2);
        !           186:                if (stat(file1, &stbuf) != 0) {
        !           187:                        fprintf(stderr, "can't get file status %s \n copy failed\n",
        !           188:                          file1);
        !           189:                        return(0);
        !           190:                }
        !           191:                statret = stat(file2, &stbuf1);
        !           192:                if (statret == 0
        !           193:                  && stbuf.st_ino == stbuf1.st_ino
        !           194:                  && stbuf.st_dev == stbuf1.st_dev) {
        !           195:                        fprintf(stderr, "%s %s - same file; can't copy\n", file1, file2);
        !           196:                        return(0);
        !           197:                }
        !           198:                if (chkpth(User, "", file1) != 0
        !           199:                  || chkpth(User, "", file2) != 0) {
        !           200:                        fprintf(stderr, "permission denied\n");
        !           201:                        cleanup(1);
        !           202:                }
        !           203:                if ((stbuf.st_mode & ANYREAD) == 0) {
        !           204:                        fprintf(stderr, "can't read file (%s) mode (%o)\n",
        !           205:                          file1, stbuf.st_mode);
        !           206:                        return(FAIL);
        !           207:                }
        !           208:                if (statret == 0 && (stbuf1.st_mode & ANYWRITE) == 0) {
        !           209:                        fprintf(stderr, "can't write file (%s) mode (%o)\n",
        !           210:                          file2, stbuf.st_mode);
        !           211:                        return(FAIL);
        !           212:                }
        !           213:                xcp(file1, file2);
        !           214:                logent("WORK HERE", "DONE");
        !           215:                return(0);
        !           216:        case 1:
        !           217:                /* receive file */
        !           218:                DEBUG(4, "receive file - %d\n", type);
        !           219:                if (file1[0] != '~')
        !           220:                        expfile(file1);
        !           221:                expfile(file2);
        !           222:                if (chkpth(User, "", file2) != 0) {
        !           223:                        fprintf(stderr, "permission denied\n");
        !           224:                        return(FAIL);
        !           225:                }
        !           226:                if (Ename[0] != '\0') {
        !           227:                        /* execute uux - remote uucp */
        !           228:                        xuux(Ename, s1, file1, s2, file2);
        !           229:                        return(0);
        !           230:                }
        !           231: 
        !           232:                cfp = gtcfile(s1);
        !           233:                fprintf(cfp, "R %s %s %s %s\n", file1, file2, User, Optns);
        !           234:                break;
        !           235:        case 2:
        !           236:                /* send file */
        !           237:                expfile(file1);
        !           238:                if (file2[0] != '~')
        !           239:                        expfile(file2);
        !           240:                DEBUG(4, "send file - %d\n", type);
        !           241: 
        !           242:                if (chkpth(User, "", file1) != 0) {
        !           243:                        fprintf(stderr, "permission denied %s\n", file1);
        !           244:                        return(FAIL);
        !           245:                }
        !           246:                if (stat(file1, &stbuf) != 0) {
        !           247:                        fprintf(stderr, "can't get status for file %s\n", file1);
        !           248:                        return(FAIL);
        !           249:                }
        !           250:                if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
        !           251:                        fprintf(stderr, "directory name illegal - %s\n",
        !           252:                          file1);
        !           253:                        return(FAIL);
        !           254:                }
        !           255:                if ((stbuf.st_mode & ANYREAD) == 0) {
        !           256:                        fprintf(stderr, "can't read file (%s) mode (%o)\n",
        !           257:                          file1, stbuf.st_mode);
        !           258:                        return(FAIL);
        !           259:                }
        !           260:                if (Ename[0] != '\0') {
        !           261:                        /* execute uux - remote uucp */
        !           262:                        xuux(Ename, s1, file1, s2, file2);
        !           263:                        return(0);
        !           264:                }
        !           265:                if (Copy) {
        !           266:                        gename(DATAPRE, s2, Grade, dfile);
        !           267:                        if (xcp(file1, dfile) != 0) {
        !           268:                                fprintf(stderr, "can't copy %s\n", file1);
        !           269:                                return(FAIL);
        !           270:                        }
        !           271:                        chmod(dfile, 0666);
        !           272:                }
        !           273:                else {
        !           274:                        /* make a dummy D. name */
        !           275:                        /* cntrl.c knows names < 6 chars are dummy D. files */
        !           276:                        strcpy(dfile, "D.0");
        !           277:                }
        !           278:                cfp = gtcfile(s2);
        !           279:                fprintf(cfp, "S %s %s %s %s %s %o\n", file1, file2,
        !           280:                        User, Optns, dfile, stbuf.st_mode & 0777);
        !           281:                break;
        !           282:        case 3:
        !           283:        case 4:
        !           284:                /*  send uucp command for execution on s1  */
        !           285:                DEBUG(4, "send uucp command - %d\n", type);
        !           286:                if (strcmp(s2,  Myname) == SAME) {
        !           287:                        expfile(file2);
        !           288:                        if (chkpth(User, "", file2) != 0) {
        !           289:                                fprintf(stderr, "permission denied\n");
        !           290:                                return(FAIL);
        !           291:                        }
        !           292:                }
        !           293:                if (Ename[0] != '\0') {
        !           294:                        /* execute uux - remote uucp */
        !           295:                        xuux(Ename, s1, file1, s2, file2);
        !           296:                        return(0);
        !           297:                }
        !           298:                cfp = gtcfile(s1);
        !           299:                fprintf(cfp, "X %s %s!%s\n", file1, s2, file2);
        !           300:                break;
        !           301:        }
        !           302:        return(0);
        !           303: }
        !           304: 
        !           305: /***
        !           306:  *     xuux(ename, s1, s2, f1, f2)     execute uux for remote uucp
        !           307:  *
        !           308:  *     return code - none
        !           309:  */
        !           310: 
        !           311: xuux(ename, s1, f1, s2, f2)
        !           312: char *ename, *s1, *s2, *f1, *f2;
        !           313: {
        !           314:        char cmd[200];
        !           315: 
        !           316:        DEBUG(4, "Ropt(%s) ", Ropt);
        !           317:        DEBUG(4, "ename(%s) ", ename);
        !           318:        DEBUG(4, "s1(%s) ", s1);
        !           319:        DEBUG(4, "f1(%s) ", f1);
        !           320:        DEBUG(4, "s2(%s) ", s2);
        !           321:        DEBUG(4, "f2(%s)\n", f2);
        !           322:        sprintf(cmd, "uux %s  %s!uucp %s!%s \\(%s!%s\\)",
        !           323:          Ropt, ename, s1, f1, s2, f2);
        !           324:        DEBUG(4, "cmd (%s)\n", cmd);
        !           325:        system(cmd);
        !           326:        return;
        !           327: }
        !           328: 
        !           329: FILE *Cfp = NULL;
        !           330: char Cfile[NAMESIZE];
        !           331: 
        !           332: /***
        !           333:  *     gtcfile(sys)    - get a Cfile descriptor
        !           334:  *
        !           335:  *     return an open file descriptor
        !           336:  */
        !           337: 
        !           338: FILE *
        !           339: gtcfile(sys)
        !           340: char *sys;
        !           341: {
        !           342:        static char presys[8] = "";
        !           343:        static int cmdcount = 0;
        !           344: 
        !           345:        if (strcmp(presys, sys) != SAME  /* this is !SAME on first call */
        !           346:          || ++cmdcount > MAXCOUNT) {
        !           347: 
        !           348:                cmdcount = 1;
        !           349:                if (presys[0] != '\0') {
        !           350:                        clscfile();
        !           351:                }
        !           352:                gename(CMDPRE, sys, Grade, Cfile);
        !           353:                Cfp = fopen(Cfile, "w");
        !           354:                ASSERT(Cfp != NULL, "CAN'T OPEN %s", Cfile);
        !           355:                chmod(0200, Cfile);
        !           356:                strcpy(presys, sys);
        !           357:        }
        !           358:        return(Cfp);
        !           359: }
        !           360: 
        !           361: /***
        !           362:  *     clscfile()      - close cfile
        !           363:  *
        !           364:  *     return code - none
        !           365:  */
        !           366: 
        !           367: clscfile()
        !           368: {
        !           369:        if (Cfp == NULL)
        !           370:                return;
        !           371:        fclose(Cfp);
        !           372:        chmod(0666, Cfile);
        !           373:        logent(Cfile, "QUE'D");
        !           374:        Cfp = NULL;
        !           375:        return;
        !           376: }

unix.superglobalmegacorp.com

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