Annotation of coherent/d/usr/bin/uucpstuff/src/uux.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  uux.c
        !             3:  *
        !             4:  *  Execute commands on a remote system.
        !             5:  *
        !             6:  *  Peter S. Housel ([email protected])
        !             7:  *  changes copyright (c) 1989-1991 by Mark Williams Company
        !             8:  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <signal.h>
        !            12: #include <ctype.h>
        !            13: #include "dcp.h"
        !            14: 
        !            15: #define DEFGRADE       'a'     /* or whatever */
        !            16: 
        !            17: extern int getopt();
        !            18: extern int optind;
        !            19: extern char *optarg;
        !            20: extern char *index(/* char *string, char c */);
        !            21: extern char *rindex(/* char *string, char c */);
        !            22: extern char *mktemp(/* char *template */);
        !            23: extern char    *strtok();
        !            24: extern FILE *fopen();
        !            25: 
        !            26: void usage(), dostdin(), doarg();
        !            27: char *uucpname(), *whoami();
        !            28: char *filesite(/* char *filename */), *filepath(/* char *filename */);
        !            29: char *basename(/* char *filename */);
        !            30: extern int getseq();
        !            31: int    debug = 0;
        !            32: 
        !            33: char tempname[] =              "/usr/spool/uucp/TM.XXXXXX";
        !            34: char luser[512];               /* local user name */
        !            35: char mysite[SITELEN];  /* this host's uucpname */
        !            36: char cmdsite[SITELEN]; /* site where command is run */
        !            37: char cmd[64];                  /* remote command name */
        !            38: char arglist[2048] = "";       /* remote argument list */
        !            39: FILE *commandfile;             /* the "C." spool command file */
        !            40: FILE *execfile;                        /* the "X." remote spool execute file */
        !            41: char grade = DEFGRADE;         /* transfer grade */
        !            42: int    local = 0;
        !            43: int nocico = 0;                        /* "don't run uucico" flag */
        !            44: int trylink = 0;               /* try spoolfile links before copying */
        !            45: int readstdin = 0;             /* read standard input ("-" or "-p") */
        !            46: int    notifyfail = 1;
        !            47: int    notifysucceed = 0;      /* notify succeed */
        !            48: char   directory [40] = SPOOLDIR;
        !            49: char   subdirectory [60];
        !            50: int    output = 0;
        !            51: int    input = 0;
        !            52: #define        ARGBUFSZ 1024
        !            53: char   argbuf[ARGBUFSZ];
        !            54: char   onearg[ARGBUFSZ];
        !            55: char   *rmtname = NULL;
        !            56: 
        !            57: main(argc, argv)
        !            58: int argc; 
        !            59: char *argv[];
        !            60: {
        !            61:        int c;                          /* option character */
        !            62:        int seq;                        /* 'seq number' of X. file */
        !            63:        static char scratch[256];       /* ubiquitous scratch buffer */
        !            64:        char *p;                        /* equally ubiquitous scratch pointer */
        !            65:        char    *arg;
        !            66:        register int (*intfun)(), (*quitfun)();
        !            67: 
        !            68:        umask(077);
        !            69:        strcpy(mysite, uucpname());
        !            70:        if (strlen(mysite) == 0) {
        !            71:                fprintf(stderr, "uux: can't get my own uucpname\n");
        !            72:                exit(1);
        !            73:        }
        !            74:        strcpy(luser, whoami());
        !            75:        while( (c=getopt(argc, argv, "a:bcCg:jnprS:s:vVx:z")) != EOF ) {
        !            76:                switch(c) {
        !            77:                case 'a':
        !            78:                        strcpy(luser, optarg);
        !            79:                        break;
        !            80:                case 'b':
        !            81:                case 'c':
        !            82:                case 'C':
        !            83:                        notsup(c);
        !            84:                        break;
        !            85:                case 'g':
        !            86:                        if (isalnum(optarg[0]) && '\0' == optarg[1])
        !            87:                                grade = optarg[0];
        !            88:                        else
        !            89:                                fprintf(stderr,
        !            90:                                "uux: %s: illegal grade\n", optarg);
        !            91:                        break;
        !            92:                case 'j':
        !            93:                        notsup(c);
        !            94:                        break;
        !            95:                case 'r':
        !            96:                        nocico = 1;
        !            97:                        break;
        !            98:                case 'n':
        !            99:                        notifyfail = 0;
        !           100:                        break;
        !           101:                case 'p':
        !           102:                        readstdin = 1;
        !           103:                        break;
        !           104:                case 's':
        !           105:                        notsup(c);
        !           106:                        break;
        !           107:                case 'S':
        !           108:                        strcpy(directory, optarg);
        !           109:                        fprintf(stderr, "Debug directory is %s\n", directory);
        !           110:                        break;
        !           111:                case 'x':
        !           112:                        debug = atoi (optarg);
        !           113:                        fprintf (stderr, "debug is %d\n", debug);
        !           114:                        fprintf(stderr, "uux version %s\n", VERSION);
        !           115:                        break;
        !           116:                case 'v':
        !           117:                case 'V':
        !           118:                        fatal("uux: Version %s", VERSION);
        !           119:                case 'z':
        !           120:                        notifysucceed = 1;
        !           121:                        break;
        !           122:                default:
        !           123:                        usage();
        !           124:                        exit(1);
        !           125:                }
        !           126:        }
        !           127:        if (optind < argc && strcmp(argv[optind], "-") == 0) {
        !           128:                ++optind;
        !           129:                readstdin = 1;
        !           130:        }
        !           131:        if (optind >= argc) {
        !           132:                usage();
        !           133:                exit(1);
        !           134:        }
        !           135:        if (NULL == (p = filesite(argv[optind]))) {
        !           136:                fprintf(stderr, "uux: illegal command\n");
        !           137:                exit(1);
        !           138:        }
        !           139:        strcpy(cmdsite, p);
        !           140:        if (NULL == (p = filepath(argv[optind]))) {
        !           141:                fprintf(stderr, "uux: illegal command\n");
        !           142:                exit(1);
        !           143:        }
        !           144:        strcpy(cmd, p);
        !           145:        ++optind;
        !           146:        local = 0;
        !           147:        if (strlen(cmdsite) == 0) {
        !           148:                local = 1;
        !           149:        } else if (!knowhost(cmdsite)) {
        !           150:                fprintf(stderr, "uux: site %s unknown\n", cmdsite);
        !           151:                exit(1);
        !           152:        }
        !           153:        if (local == 0) {
        !           154:                if (NULL == (commandfile = fopen(mktemp(tempname), "w"))) {
        !           155:                        fprintf(stderr, "uux: can't open ");
        !           156:                        perror(tempname);
        !           157:                        exit(1);
        !           158:                }
        !           159:        }
        !           160:        sprintf(subdirectory, "%s/%s", directory, cmdsite);
        !           161:        if (!ckdir(subdirectory)) {
        !           162:                fprintf(stderr, "Unable to create directory %s\n",
        !           163:                        subdirectory);
        !           164:                exit (1);
        !           165:        }
        !           166:        intfun = signal(SIGINT, SIG_IGN);
        !           167:        quitfun = signal(SIGQUIT, SIG_IGN);
        !           168:        seq = getseq(cmdsite);
        !           169:        if (local == 0)
        !           170:                sprintf(scratch, "%s/%s/D.%.*s%c%04d", directory,
        !           171:                        cmdsite, SITESIG, mysite, 'X', seq);
        !           172:        else
        !           173:                sprintf(scratch, "%s/%s/X.%.*s%c%04d", directory,
        !           174:                        mysite, SITESIG, mysite, 'X', seq);
        !           175:        if (debug > 1)
        !           176:                fprintf(stderr, "command path is %s\n", scratch);
        !           177:        if ((execfile = fopen(scratch, "w")) == NULL) {
        !           178:                fprintf(stderr, "uux: can't open execfile for output: ");
        !           179:                perror(scratch);
        !           180:                exit(1);
        !           181:        }
        !           182:        rmtname = &cmdsite[0];
        !           183:        open_the_logfile("uux");
        !           184:        if (readstdin)
        !           185:                dostdin();
        !           186:        strcpy(argbuf, "");
        !           187:        while (optind < argc) {
        !           188:                arg = argv[optind++];
        !           189:                if ((strlen(arg) + strlen(argbuf) + 2) > ARGBUFSZ) {
        !           190:                        fprintf(stderr, "Argument list too long\n");
        !           191:                        exit(1);
        !           192:                }
        !           193:                strcat(argbuf, " ");
        !           194:                strcat(argbuf, arg);
        !           195:        }
        !           196:        plog(M_INFO, "%s!%s %s", cmdsite, cmd, argbuf);
        !           197:        processargs();
        !           198: 
        !           199:        if (local == 0) {
        !           200:                fprintf(commandfile,
        !           201:                "S D.%.*s%c%04d X.%.*s%c%04d %s - D.%.*s%c%04d 0600\n",
        !           202:                SITESIG, mysite, 'X', seq, SITESIG, mysite, 'X', seq, luser,
        !           203:                SITESIG, mysite, 'X', seq);
        !           204:        }
        !           205:        plog(M_INFO, "user: %s site %s %s", luser, mysite, 
        !           206:                notifyfail ? "notifyfail" : "");
        !           207:        fprintf(execfile, "U %s %s\nR %s\n", luser, mysite, luser);
        !           208:        if (notifyfail)
        !           209:                fprintf(execfile, "Z \n");
        !           210:        if (notifysucceed)
        !           211:                fprintf(execfile, "n \n");
        !           212: 
        !           213:        fprintf(execfile, "C %s %s\n", cmd, arglist);
        !           214:        fclose(execfile);
        !           215:        if (local == 0) {
        !           216:                fclose(commandfile);
        !           217:                sprintf(scratch, "%s/%s/C.%.*s%c%04d",
        !           218:                        directory, cmdsite, SITESIG, cmdsite, grade, seq);
        !           219:                if (link(tempname, scratch) == 0)
        !           220:                        unlink(tempname);
        !           221:                else {
        !           222:                        fprintf(stderr, "uux: couldn't rename commandfile\n");
        !           223:                        exit(1);
        !           224:                }
        !           225:        }
        !           226:        if (nocico)
        !           227:                exit(0);
        !           228:        else {
        !           229:                exec_cico(cmdsite);
        !           230:        }
        !           231:        exit (0);
        !           232:        
        !           233: }
        !           234: 
        !           235: processargs()
        !           236: {
        !           237:        char    *ap, *arg;
        !           238:        char    append [2];
        !           239:        ap = argbuf;
        !           240: 
        !           241:        strcpy(append, "");
        !           242:        while ((arg = strtok(ap, " \t\n")) != NULL) {
        !           243:                ap = NULL;
        !           244:                if ((strcmp(arg, ">") == 0) || (strcmp(arg, "<") == 0) ||
        !           245:                strcmp(arg, "|") == 0)
        !           246:                        strcpy(append, arg);
        !           247:                else {
        !           248:                        strcpy(onearg, append);
        !           249:                        strcat(onearg, arg);
        !           250:                        strcpy(append, "");
        !           251:                        doarg(onearg);
        !           252:                }
        !           253:        }
        !           254: }
        !           255: 
        !           256: notsup(c)
        !           257: int    c;
        !           258: {
        !           259:        fprintf(stderr, "Option %c not supported yet\n", c);
        !           260: }
        !           261: 
        !           262: void usage()
        !           263: {
        !           264:        fprintf(stderr,
        !           265:        "usage: uux [-plrv] [-g grade] [-a user] [-] host!cmd arg ...\n");
        !           266:        exit (1);
        !           267: }
        !           268: 
        !           269: void
        !           270: dostdin()
        !           271: {
        !           272:        static char name[128], spoolname[128];  /* spool data filename */
        !           273:        FILE *data;                             /* spool data file */
        !           274:        int seq;                                /* spool sequence number */
        !           275:        int c;                                  /* char from stdin */
        !           276: 
        !           277:        seq = getseq(cmdsite);
        !           278:        sprintf(subdirectory, "%s/%s", directory, cmdsite);
        !           279:        if (!ckdir(subdirectory)) {
        !           280:                fprintf(stderr, "Unable to create directory %s\n",
        !           281:                        subdirectory);
        !           282:                exit (1);
        !           283:        }
        !           284:        sprintf(name, "D.%.*s%c%04d", SITESIG, mysite, grade, seq);
        !           285:        sprintf(spoolname, "%s/%s/%s", directory, cmdsite, name);
        !           286:        if ((data = fopen(spoolname, "w")) == NULL) {
        !           287:                fprintf(stderr, "uux: can't copy stdin\n");
        !           288:                return;
        !           289:        }
        !           290:        while(EOF != (c = getc(stdin)))
        !           291:                putc(c, data);
        !           292:        fclose(data);
        !           293: 
        !           294:        fprintf(execfile, "F %s\nI %s\n", name, name);
        !           295:        if (local == 0)
        !           296:                fprintf(commandfile,
        !           297:                "S %s %s %s - %s 0600\n", name, name, luser, name);
        !           298: }
        !           299: 
        !           300: void doarg(arg)
        !           301: char *arg;
        !           302: {
        !           303:        char name[128], spoolname[128]; /* spool data filename */
        !           304:        FILE *data;                             /* spool data file */
        !           305:        FILE *source;                           /* source data file */
        !           306:        int seq;                                /* spool sequence number */
        !           307:        int c;                                  /* char from input */
        !           308: 
        !           309:        if (debug > 2)
        !           310:                fprintf(stderr, "doarg argument: [%s]\n", arg);
        !           311:        output = 0;
        !           312:        input = 0;
        !           313:        if ('(' == arg[0] && ')' == arg[strlen(arg) - 1]) {
        !           314:                strcat(arglist, arg + 1);
        !           315:                arglist[strlen(arglist) - 1] = '\0';
        !           316:        } else if (NULL == index(arg, '!'))
        !           317:                strcat(arglist, arg);
        !           318:        else if (strcmp(filesite(arg), cmdsite) == 0) {
        !           319:                strcat(arglist, filepath(arg));
        !           320:        } else if (strlen(filesite(arg)) == 0) {
        !           321:                seq = getseq(cmdsite);
        !           322:                if (debug)
        !           323:                        fprintf(stderr, "seq is %s\n", seq);
        !           324:                sprintf(subdirectory, "%s/%s", directory, cmdsite);
        !           325:                if (!ckdir(subdirectory)) {
        !           326:                        fprintf(stderr, "Unable to create directory %s\n",
        !           327:                                subdirectory);
        !           328:                        exit (1);
        !           329:                }
        !           330:                sprintf(name, "D.%.*s%c%04d", SITESIG, mysite, grade, seq);
        !           331:                sprintf(spoolname, "%s/%s/%s", directory, cmdsite, name);
        !           332:                if (!trylink || link(filepath(arg), spoolname) < 0) {
        !           333:                        if (NULL == (data = fopen(spoolname, "w"))
        !           334:                        || NULL == (source = fopen(filepath(arg), "r"))) {
        !           335:                                fprintf(stderr,
        !           336:                                "uux: can't copy %s to spool directory\n",
        !           337:                                filepath(arg));
        !           338:                                exit(1);
        !           339:                        }
        !           340:                        while(EOF != (c = getc(source)))
        !           341:                                putc(c, data);
        !           342:                        fclose(data);
        !           343:                        fclose(source);
        !           344:                }
        !           345:                if (local == 0)  {
        !           346:                        fprintf(commandfile,
        !           347:                        "S %s %s %s - %s 0600\n", filepath(arg), name,
        !           348:                        luser, name);
        !           349:                }
        !           350:                fprintf(execfile, "F %s %s\n", name, basename(filepath(arg)));
        !           351:                strcat(arglist, basename(filepath(arg)));
        !           352:        } else {
        !           353:                char    *fs, *fp;
        !           354:                if (arg[0] == '>') {
        !           355:                        fprintf(stderr, "Argument is an output argument\n");
        !           356:                        output = 1;
        !           357:                        arg++;
        !           358:                } else if (arg[0] == '<') {
        !           359:                        fprintf(stderr, "Argument is an input argument\n");
        !           360:                        input = 1;
        !           361:                        arg++;
        !           362:                }
        !           363:                fs = filesite(arg);
        !           364:                fp = filepath(arg);
        !           365:                fprintf(stderr, "To handle transfer for site %s, file %s\n",
        !           366:                        fs, fp);
        !           367:        }
        !           368:        strcat(arglist, " ");
        !           369: }
        !           370: 
        !           371: char *filesite(name)
        !           372: char *name;
        !           373: {
        !           374:        static char site[SITELEN];
        !           375:        char    *oname;
        !           376:        char *p;
        !           377:        char *q;
        !           378: 
        !           379:        oname = name;
        !           380:        if (NULL == (p = index(name, '!')))
        !           381:                p = NULL;
        !           382:        else {
        !           383:                q = site;
        !           384:                while(name < p)
        !           385:                        *q++ = *name++;
        !           386:                *q = '\0';
        !           387:                p = site;
        !           388:        }
        !           389:        if (debug) 
        !           390:                fprintf(stderr, "filesite(%s) : %s.\n", oname, p);
        !           391:        return p;
        !           392:        
        !           393: }
        !           394: 
        !           395: char *filepath(name)
        !           396: char *name;
        !           397: {
        !           398:        char *p;
        !           399: 
        !           400:        if (NULL == (p = rindex(name, '!')))
        !           401:                p = NULL;
        !           402:        else
        !           403:                p = p + 1;
        !           404:        if (debug)
        !           405:                fprintf(stderr, "filepath(%s) : %s\n", name, p);
        !           406:        return p;
        !           407: }
        !           408: 
        !           409: char *basename(name)
        !           410: char *name;
        !           411: {
        !           412:        char *p;
        !           413:        if (NULL == (p = rindex(name, '/')))
        !           414:                return name;
        !           415:        else
        !           416:                return p + 1;
        !           417: }

unix.superglobalmegacorp.com

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