Annotation of 3BSD/cmd/uucp/uuxqt.c, revision 1.1.1.1

1.1       root        1: #include "uucp.h"
                      2: #include "uucpdefs.h"
                      3: #include <sys/types.h>
                      4: #include <sys/stat.h>
                      5: #include <sys/dir.h>
                      6: 
                      7: #define APPCMD(d) {\
                      8: char *p;\
                      9: for (p = d; *p != '\0';) *cmdp++ = *p++;\
                     10: *cmdp++ = ' ';\
                     11: *cmdp = '\0';}
                     12: 
                     13: /*
                     14:  *     uuxqt will execute commands set up by a uux command,
                     15:  *     usually from a remote machine - set by uucp.
                     16:  */
                     17: 
                     18: char *Cmds[] = {
                     19:        "rmail",
                     20:        "lpr",
                     21:        "opr",
                     22:        "fsend",
                     23:        "fget",
                     24:        NULL
                     25:        };
                     26: #define PATH   "PATH=/bin:/usr/bin;"
                     27: /*  to remove restrictions from uuxqt
                     28:  *  define ALLOK 1
                     29:  *
                     30:  *  to add allowable commands, add to the list under Cmds[]
                     31:  */
                     32: 
                     33: main(argc, argv)
                     34: char *argv[];
                     35: {
                     36:        char xcmd[100];
                     37:        int cmdnok;
                     38:        char xfile[MAXFULLNAME], user[10], buf[BUFSIZ];
                     39:        char lbuf[30];
                     40:        char cfile[NAMESIZE], dfile[MAXFULLNAME];
                     41:        char file[NAMESIZE];
                     42:        char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME];
                     43:        FILE *xfp, *dfp, *fp;
                     44:        char path[MAXFULLNAME];
                     45:        char cmd[BUFSIZ];
                     46:        char *cmdp, prm[MAXFULLNAME], *ptr;
                     47:        char *getprm();
                     48:        int uid, ret;
                     49:        int stcico = 0;
                     50:        char rnum[5];
                     51: 
                     52:        uucpname(Myname);
                     53:        Ofn = 1;
                     54:        Ifn = 0;
                     55:        while (argc>1 && argv[1][0] == '-') {
                     56:                switch(argv[1][1]){
                     57:                case 'x':
                     58:                        Debug = atoi(&argv[1][2]);
                     59:                        if (Debug <= 0)
                     60:                                Debug = 1;
                     61:                        break;
                     62:                default:
                     63:                        sprintf(stderr, "unknown flag %s\n", argv[1]);
                     64:                                break;
                     65:                }
                     66:                --argc;  argv++;
                     67:        }
                     68: 
                     69:        DEBUG(4, "\n\n** %s **\n", "START");
                     70:        chdir(Spool);
                     71:        strcpy(Wrkdir, Spool);
                     72:        uid = getuid();
                     73:        guinfo(uid, User, path);
                     74:        DEBUG(4, "User - %s\n", User);
                     75:        if (ulockf(X_LOCK, X_LOCKTIME) != 0)
                     76:                exit(0);
                     77: 
                     78:        DEBUG(4, "process %s\n", "");
                     79:        while (gtxfile(xfile) > 0) {
                     80:                DEBUG(4, "xfile - %s\n", xfile);
                     81: 
                     82:                xfp = fopen(xfile, "r");
                     83:                ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile);
                     84: 
                     85:                /*  initialize to default  */
                     86:                strcpy(user, User);
                     87:                strcpy(fin, "/dev/null");
                     88:                strcpy(fout, "/dev/null");
                     89:                sprintf(sysout, "%.7s", Myname);
                     90:                while (fgets(buf, BUFSIZ, xfp) != NULL) {
                     91:                        switch (buf[0]) {
                     92:                        case X_USER:
                     93:                                sscanf(&buf[1], "%s%s", user, Rmtname);
                     94:                                break;
                     95:                        case X_STDIN:
                     96:                                sscanf(&buf[1], "%s", fin);
                     97:                                expfile(fin);
                     98:                                break;
                     99:                        case X_STDOUT:
                    100:                                sscanf(&buf[1], "%s%s", fout, sysout);
                    101:                                sysout[7] = '\0';
                    102:                                if (fout[0] != '~' || prefix(sysout, Myname))
                    103:                                        expfile(fout);
                    104:                                break;
                    105:                        case X_CMD:
                    106:                                strcpy(cmd, &buf[2]);
                    107:                                if (*(cmd + strlen(cmd) - 1) == '\n')
                    108:                                        *(cmd + strlen(cmd) - 1) = '\0';
                    109:                                break;
                    110:                        default:
                    111:                                break;
                    112:                        }
                    113:                }
                    114: 
                    115:                fclose(xfp);
                    116:                DEBUG(4, "fin - %s, ", fin);
                    117:                DEBUG(4, "fout - %s, ", fout);
                    118:                DEBUG(4, "sysout - %s, ", sysout);
                    119:                DEBUG(4, "user - %s\n", user);
                    120:                DEBUG(4, "cmd - %s\n", cmd);
                    121: 
                    122:                /*  command execution  */
                    123:                if (strcmp(fout, "/dev/null") == SAME)
                    124:                        strcpy(dfile,"/dev/null");
                    125:                else
                    126:                        gename(DATAPRE, sysout, 'O', dfile);
                    127: 
                    128:                /* expand file names where necessary */
                    129:                expfile(dfile);
                    130:                strcpy(buf, PATH);
                    131:                cmdp = buf + strlen(buf);
                    132:                ptr = cmd;
                    133:                xcmd[0] = '\0';
                    134:                cmdnok = 0;
                    135:                while ((ptr = getprm(ptr, prm)) != NULL) {
                    136:                        if (prm[0] == ';' || prm[0] == '^'
                    137:                          || prm[0] == '|') {
                    138:                                xcmd[0] = '\0';
                    139:                                APPCMD(prm);
                    140:                                continue;
                    141:                        }
                    142:                        if ((cmdnok = cmdok(xcmd, prm)) != 0) 
                    143:                                /*  command not valid  */
                    144:                                break;
                    145: 
                    146:                        if (prm[0] == '~')
                    147:                                expfile(prm);
                    148:                        APPCMD(prm);
                    149:                }
                    150:                if (cmdnok) {
                    151:                        sprintf(lbuf, "%s XQT DENIED", user);
                    152:                        logent(cmd, lbuf);
                    153:                        DEBUG(4, "bad command %s\n", prm);
                    154:                        notify(user, Rmtname, cmd, "DENIED");
                    155:                        goto rmfiles;
                    156:                }
                    157:                sprintf(lbuf, "%s XQT", user);
                    158:                logent(buf, lbuf);
                    159:                DEBUG(4, "cmd %s\n", buf);
                    160: 
                    161:                mvxfiles(xfile);
                    162:                chdir(XQTDIR);
                    163:                ret = shio(buf, fin, dfile, user);
                    164:                sprintf(rnum, "%d", ret);
                    165:                if (strcmp(xcmd, "rmail") != SAME
                    166:                  && strcmp(xcmd, "mail") != SAME)
                    167:                        notify(user, Rmtname, cmd, rnum);
                    168:                DEBUG(4, "exit cmd - %d\n", ret);
                    169:                chdir(Spool);
                    170:                rmxfiles(xfile);
                    171:                if (ret != 0) {
                    172:                        /*  exit status not zero */
                    173:                        dfp = fopen(dfile, "a");
                    174:                        ASSERT(dfp != NULL, "CAN'T OPEN %s", dfile);
                    175:                        fprintf(dfp, "exit status %d", ret);
                    176:                        fclose(dfp);
                    177:                }
                    178:                if (strcmp(fout, "/dev/null") != SAME) {
                    179:                        if (prefix(sysout, Myname)) {
                    180:                                xmv(dfile, fout);
                    181:                        }
                    182:                        else {
                    183:                                gename(CMDPRE, sysout, 'O', cfile);
                    184:                                fp = fopen(cfile, "w");
                    185:                                ASSERT(fp != NULL, "OPEN %s", cfile);
                    186:                                chmod(cfile, 0666);
                    187:                                fprintf(fp, "S %s %s %s - %s 0666\n",
                    188:                                dfile, fout, user, lastpart(dfile));
                    189:                                fclose(fp);
                    190:                        }
                    191:                }
                    192:        rmfiles:
                    193:                xfp = fopen(xfile, "r");
                    194:                ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile);
                    195:                while (fgets(buf, BUFSIZ, xfp) != NULL) {
                    196:                        if (buf[0] != X_RQDFILE)
                    197:                                continue;
                    198:                        sscanf(&buf[1], "%s", file);
                    199:                        unlink(file);
                    200:                }
                    201:                unlink(xfile);
                    202:        }
                    203: 
                    204:        if (stcico)
                    205:                xuucico("");
                    206:        cleanup(0);
                    207: }
                    208: 
                    209: 
                    210: cleanup(code)
                    211: int code;
                    212: {
                    213:        logcls();
                    214:        rmlock(NULL);
                    215:        exit(code);
                    216: }
                    217: 
                    218: 
                    219: /*******
                    220:  *     gtxfile(file)   get a file to execute
                    221:  *     char *file;
                    222:  *
                    223:  *     return codes:  0 - no file  |  1 - file to execute
                    224:  */
                    225: 
                    226: gtxfile(file)
                    227: char *file;
                    228: {
                    229:        static FILE *pdir;
                    230:        char pre[2];
                    231: 
                    232:        if (pdir == NULL) {
                    233:                pdir = fopen(Spool, "r");
                    234:                ASSERT(pdir != NULL, "GTXFILE CAN'T OPEN %s", Spool);
                    235:        }
                    236: 
                    237:        pre[0] = XQTPRE;
                    238:        pre[1] = '\0';
                    239:        while (gnamef(pdir, file) != 0) {
                    240:                DEBUG(4, "file - %s\n", file);
                    241:                if (!prefix(pre, file))
                    242:                        continue;
                    243:                if (gotfiles(file))
                    244:                        /*  return file to execute */
                    245:                        return(1);
                    246:        }
                    247: 
                    248:        fclose(pdir);
                    249:        return(0);
                    250: }
                    251: 
                    252: 
                    253: /***
                    254:  *     gotfiles(file)          check for needed files
                    255:  *     char *file;
                    256:  *
                    257:  *     return codes:  0 - not ready  |  1 - all files ready
                    258:  */
                    259: 
                    260: gotfiles(file)
                    261: char *file;
                    262: {
                    263:        struct stat stbuf;
                    264:        FILE *fp;
                    265:        char buf[BUFSIZ], rqfile[MAXFULLNAME];
                    266: 
                    267:        fp = fopen(file, "r");
                    268:        if (fp == NULL)
                    269:                return(0);
                    270: 
                    271:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    272:                DEBUG(4, "%s\n", buf);
                    273:                if (buf[0] != X_RQDFILE)
                    274:                        continue;
                    275:                sscanf(&buf[1], "%s", rqfile);
                    276:                expfile(rqfile);
                    277:                if (stat(rqfile, &stbuf) == -1) {
                    278:                        fclose(fp);
                    279:                        return(0);
                    280:                }
                    281:        }
                    282: 
                    283:        fclose(fp);
                    284:        return(1);
                    285: }
                    286: 
                    287: 
                    288: /***
                    289:  *     rmxfiles(xfile)         remove execute files to x-directory
                    290:  *     char *xfile;
                    291:  *
                    292:  *     return codes - none
                    293:  */
                    294: 
                    295: rmxfiles(xfile)
                    296: char *xfile;
                    297: {
                    298:        FILE *fp;
                    299:        char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE];
                    300:        char tfull[MAXFULLNAME];
                    301: 
                    302:        if((fp = fopen(xfile, "r")) == NULL)
                    303:                return;
                    304: 
                    305:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    306:                if (buf[0] != X_RQDFILE)
                    307:                        continue;
                    308:                if (sscanf(&buf[1], "%s%s", file, tfile) < 2)
                    309:                        continue;
                    310:                sprintf(tfull, "%s/%s", XQTDIR, tfile);
                    311:                unlink(tfull);
                    312:        }
                    313:        fclose(fp);
                    314:        return;
                    315: }
                    316: 
                    317: 
                    318: /***
                    319:  *     mvxfiles(xfile)         move execute files to x-directory
                    320:  *     char *xfile;
                    321:  *
                    322:  *     return codes - none
                    323:  */
                    324: 
                    325: mvxfiles(xfile)
                    326: char *xfile;
                    327: {
                    328:        FILE *fp;
                    329:        char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE];
                    330:        char tfull[MAXFULLNAME];
                    331:        int ret;
                    332: 
                    333:        if((fp = fopen(xfile, "r")) == NULL)
                    334:                return;
                    335: 
                    336:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    337:                if (buf[0] != X_RQDFILE)
                    338:                        continue;
                    339:                if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2)
                    340:                        continue;
                    341:                expfile(ffile);
                    342:                sprintf(tfull, "%s/%s", XQTDIR, tfile);
                    343:                unlink(tfull);
                    344:                ret = link(ffile, tfull);
                    345:                ASSERT(ret == 0, "LINK RET-%d", ret);
                    346:                unlink(ffile);
                    347:        }
                    348:        fclose(fp);
                    349:        return;
                    350: }
                    351: 
                    352: 
                    353: /***
                    354:  *     cmdok(xc, cmd)          check for valid command
                    355:  *                     *NOTE - side effect is to set xc to the
                    356:  *                             command to be executed.
                    357:  *     char *xc, *cmd;
                    358:  *
                    359:  *     return 0 - ok | 1 nok
                    360:  */
                    361: 
                    362: cmdok(xc, cmd)
                    363: char *xc, *cmd;
                    364: {
                    365:        char **ptr;
                    366: 
                    367:        if (xc[0] != '\0')
                    368:                return(0);
                    369: #ifndef ALLOK
                    370:        ptr = Cmds;
                    371:        while(*ptr != NULL) {
                    372:                if (strcmp(cmd, *ptr) == SAME)
                    373:                        break;
                    374:        ptr++;
                    375:        }
                    376:        if (*ptr == NULL)
                    377:                return(1);
                    378: #endif
                    379:        strcpy(xc, cmd);
                    380:        return(0);
                    381: }
                    382: 
                    383: 
                    384: /***
                    385:  *     notify  send mail to user giving execution results
                    386:  *     return code - none
                    387:  *     This program assumes new mail command - send remote mail
                    388:  */
                    389: 
                    390: notify(user, rmt, cmd, str)
                    391: char *user, *rmt, *cmd, *str;
                    392: {
                    393:        char text[100];
                    394:        char ruser[100];
                    395: 
                    396:        sprintf(text, "uuxqt cmd (%s) status (%s)", cmd, str);
                    397:        if (prefix(rmt, Myname))
                    398:                strcpy(ruser, user);
                    399:        else
                    400:                sprintf(ruser, "%s!%s", rmt, user);
                    401:        mailst(ruser, text);
                    402:        return;
                    403: }

unix.superglobalmegacorp.com

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