Annotation of 43BSD/usr.bin/uucp/uuxqt.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)uuxqt.c    5.8 (Berkeley) 1/24/86";
                      3: #endif
                      4: 
                      5: #include "uucp.h"
                      6: #include <sys/stat.h>
                      7: #ifdef NDIR
                      8: #include "ndir.h"
                      9: #else
                     10: #include <sys/dir.h>
                     11: #endif
                     12: #include <signal.h>
                     13: 
                     14: #define BADCHARS       "&^|(`\\<>;\"{}\n'"
                     15: #define RECHECKTIME    60*10   /* 10 minutes */
                     16: 
                     17: #define APPCMD(d) {\
                     18: char *p;\
                     19: for (p = d; *p != '\0';) *cmdp++ = *p++; *cmdp++ = ' '; *cmdp = '\0';}
                     20: 
                     21: /*
                     22:  *     uuxqt will execute commands set up by a uux command,
                     23:  *     usually from a remote machine - set by uucp.
                     24:  */
                     25: 
                     26: #define        NCMDS   50
                     27: char *Cmds[NCMDS+1];
                     28: int Notify[NCMDS+1];
                     29: #define        NT_YES  0       /* if should notify on execution */
                     30: #define        NT_ERR  1       /* if should notify if non-zero exit status (-z equivalent) */
                     31: #define        NT_NO   2       /* if should not notify ever (-n equivalent) */
                     32: 
                     33: extern int Nfiles;
                     34: 
                     35: int TransferSucceeded = 1;
                     36: int notiok = 1;
                     37: int nonzero = 0;
                     38: 
                     39: struct timeb Now;
                     40: 
                     41: char PATH[MAXFULLNAME] = "PATH=/bin:/usr/bin:/usr/ucb";
                     42: char Shell[MAXFULLNAME];
                     43: char HOME[MAXFULLNAME];
                     44: 
                     45: extern char **environ;
                     46: char *nenv[] = {
                     47:        PATH,
                     48:        Shell,
                     49:        HOME,
                     50:        0
                     51: };
                     52: 
                     53: /*  to remove restrictions from uuxqt
                     54:  *  define ALLOK 1
                     55:  *
                     56:  *  to add allowable commands, add to the file CMDFILE
                     57:  *  A line of form "PATH=..." changes the search path
                     58:  */
                     59: main(argc, argv)
                     60: char *argv[];
                     61: {
                     62:        char xcmd[MAXFULLNAME];
                     63:        int argnok;
                     64:        int notiflg;
                     65:        char xfile[MAXFULLNAME], user[MAXFULLNAME], buf[BUFSIZ];
                     66:        char lbuf[MAXFULLNAME];
                     67:        char cfile[NAMESIZE], dfile[MAXFULLNAME];
                     68:        char file[NAMESIZE];
                     69:        char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME];
                     70:        register FILE *xfp, *fp;
                     71:        FILE *dfp;
                     72:        char path[MAXFULLNAME];
                     73:        char cmd[BUFSIZ];
                     74:        char *cmdp, prm[1000], *ptr;
                     75:        char *getprm(), *lastpart();
                     76:        int uid, ret, ret2, badfiles;
                     77:        register int i;
                     78:        int stcico = 0;
                     79:        time_t xstart, xnow;
                     80:        char retstat[30];
                     81:        char **ep;
                     82: 
                     83:        strcpy(Progname, "uuxqt");
                     84:        uucpname(Myname);
                     85: 
                     86:        umask(WFMASK);
                     87:        Ofn = 1;
                     88:        Ifn = 0;
                     89:        while (argc>1 && argv[1][0] == '-') {
                     90:                switch(argv[1][1]){
                     91:                case 'x':
                     92:                        chkdebug();
                     93:                        Debug = atoi(&argv[1][2]);
                     94:                        if (Debug <= 0)
                     95:                                Debug = 1;
                     96:                        break;
                     97:                default:
                     98:                        fprintf(stderr, "unknown flag %s\n", argv[1]);
                     99:                                break;
                    100:                }
                    101:                --argc;  argv++;
                    102:        }
                    103: 
                    104:        DEBUG(4, "\n\n** START **\n", CNULL);
                    105:        ret = subchdir(Spool);
                    106:        ASSERT(ret >= 0, "CHDIR FAILED", Spool, ret);
                    107:        strcpy(Wrkdir, Spool);
                    108:        uid = getuid();
                    109:        guinfo(uid, User, path);
                    110:        setgid(getegid());
                    111:        setuid(geteuid());
                    112: 
                    113:        DEBUG(4, "User - %s\n", User);
                    114:        if (ulockf(X_LOCK, X_LOCKTIME) != 0)
                    115:                exit(0);
                    116: 
                    117:        fp = fopen(CMDFILE, "r");
                    118:        if (fp == NULL) {
                    119:                logent(CANTOPEN, CMDFILE);
                    120:                Cmds[0] = "rmail";
                    121:                Cmds[1] = "rnews";
                    122:                Cmds[2] = "ruusend";
                    123:                Cmds[3] = NULL;
                    124:                goto doprocess;
                    125:        }
                    126:        DEBUG(5, "%s opened\n", CMDFILE);
                    127:        for (i=0; i<NCMDS && cfgets(xcmd, sizeof(xcmd), fp) != NULL; i++) {
                    128:                int j;
                    129:                /* strip trailing whitespace */
                    130:                for (j = strlen(xcmd)-1; j >= 0; --j)
                    131:                        if (xcmd[j] == '\n' || xcmd[j] == ' ' || xcmd[j] == '\t')
                    132:                                xcmd[j] = '\0';
                    133:                        else
                    134:                                break;
                    135:                /* look for imbedded whitespace */
                    136:                for (; j >= 0; --j)
                    137:                        if (xcmd[j] == '\n' || xcmd[j] == ' ' || xcmd[j] == '\t')
                    138:                                break;
                    139:                /* skip this entry if it has embedded whitespace */
                    140:                /* This defends against a bad PATH=, for example */
                    141:                if (j >= 0) {
                    142:                        logent(xcmd, "BAD WHITESPACE");
                    143:                        continue;
                    144:                }
                    145:                if (strncmp(xcmd, "PATH=", 5) == 0) {
                    146:                        strcpy(PATH, xcmd);
                    147:                        i--;    /*kludge */
                    148:                        continue;
                    149:                }
                    150:                DEBUG(5, "xcmd = %s\n", xcmd);
                    151: 
                    152:                if ((ptr = index(xcmd, ',')) != NULL) {
                    153:                        *ptr++ = '\0';
                    154:                        if (strncmp(ptr, "Err", 3) == SAME)
                    155:                                Notify[i] = NT_ERR;
                    156:                        else if (strcmp(ptr, "No") == SAME)
                    157:                                Notify[i] = NT_NO;
                    158:                        else
                    159:                                Notify[i] = NT_YES;
                    160:                } else
                    161:                        Notify[i] = NT_YES;
                    162:                if ((Cmds[i] = malloc((unsigned)(strlen(xcmd)+1))) == NULL) {
                    163:                        DEBUG(1, "MALLOC FAILED", CNULL);
                    164:                        break;
                    165:                }
                    166:                strcpy(Cmds[i], xcmd);
                    167:        }
                    168:        Cmds[i] = CNULL;
                    169:        fclose(fp);
                    170: 
                    171: doprocess:
                    172: 
                    173:        (void) sprintf(HOME, "HOME=%s", Spool);
                    174:        (void) sprintf(Shell, "SHELL=%s", SHELL);
                    175:        environ = nenv; /* force use if our environment */
                    176: 
                    177:        DEBUG(11,"path = %s\n", getenv("PATH"));
                    178: 
                    179:        DEBUG(4, "process %s\n", CNULL);
                    180:        time(&xstart);
                    181:        while (gtxfile(xfile) > 0) {
                    182:                /* if /etc/nologin exists, exit cleanly */
                    183: #if defined(BSD4_2) || defined(USG)
                    184:                if (access(NOLOGIN) == 0) {
                    185: #else !BSD4_2 && ! USG
                    186:                ultouch();
                    187:                if (nologinflag) {
                    188: #endif !BSD4_2 && !USG
                    189:                        logent(NOLOGIN, "UUXQT SHUTDOWN");
                    190:                        if (Debug)
                    191:                                logent("debugging", "continuing anyway");
                    192:                        else
                    193:                                break;
                    194:                }
                    195:                DEBUG(4, "xfile - %s\n", xfile);
                    196: 
                    197:                xfp = fopen(subfile(xfile), "r");
                    198:                ASSERT(xfp != NULL, CANTOPEN, xfile, 0);
                    199: 
                    200:                /*  initialize to default  */
                    201:                strcpy(user, User);
                    202:                strcpy(fin, DEVNULL);
                    203:                strcpy(fout, DEVNULL);
                    204:                strcpy(sysout, Myname);
                    205:                badfiles = 0;
                    206:                while (fgets(buf, BUFSIZ, xfp) != NULL) {
                    207:                        switch (buf[0]) {
                    208:                        case X_USER:
                    209:                                sscanf(&buf[1], "%s %s", user, Rmtname);
                    210:                                break;
                    211:                        case X_RETURNTO:
                    212:                                sscanf(&buf[1], "%s", user);
                    213:                                break;
                    214:                        case X_STDIN:
                    215:                                sscanf(&buf[1], "%s", fin);
                    216:                                i = expfile(fin);
                    217:                                /* rti!trt: do not check permissions of
                    218:                                 * vanilla spool file */
                    219:                                if (i != 0
                    220:                                 && (chkpth("", "", fin) || anyread(fin) != 0))
                    221:                                        badfiles = 1;
                    222:                                break;
                    223:                        case X_STDOUT:
                    224:                                sscanf(&buf[1], "%s%s", fout, sysout);
                    225:                                sysout[MAXBASENAME] = '\0';
                    226:                                /* rti!trt: do not check permissions of
                    227:                                 * vanilla spool file.  DO check permissions
                    228:                                 * of writing on a non-vanilla file */
                    229:                                i = 1;
                    230:                                if (fout[0] != '~' || prefix(sysout, Myname))
                    231:                                        i = expfile(fout);
                    232:                                if (i != 0
                    233:                                 && (chkpth("", "", fout)
                    234:                                        || chkperm(fout, (char *)1)))
                    235:                                        badfiles = 1;
                    236:                                break;
                    237:                        case X_CMD:
                    238:                                strcpy(cmd, &buf[2]);
                    239:                                if (*(cmd + strlen(cmd) - 1) == '\n')
                    240:                                        *(cmd + strlen(cmd) - 1) = '\0';
                    241:                                break;
                    242:                        case X_NONOTI:
                    243:                                notiok = 0;
                    244:                                break;
                    245:                        case X_NONZERO:
                    246:                                nonzero = 1;
                    247:                                break;
                    248:                        default:
                    249:                                break;
                    250:                        }
                    251:                }
                    252: 
                    253:                fclose(xfp);
                    254:                DEBUG(4, "fin - %s, ", fin);
                    255:                DEBUG(4, "fout - %s, ", fout);
                    256:                DEBUG(4, "sysout - %s, ", sysout);
                    257:                DEBUG(4, "user - %s\n", user);
                    258:                DEBUG(4, "cmd - %s\n", cmd);
                    259: 
                    260:                /*  command execution  */
                    261:                if (strcmp(fout, DEVNULL) == SAME)
                    262:                        strcpy(dfile,DEVNULL);
                    263:                else
                    264:                        gename(DATAPRE, sysout, 'O', dfile);
                    265: 
                    266:                /* expand file names where necessary */
                    267:                expfile(dfile);
                    268:                cmdp = buf;
                    269:                ptr = cmd;
                    270:                xcmd[0] = '\0';
                    271:                argnok = 0;
                    272:                while ((ptr = getprm(ptr, prm)) != NULL) {
                    273:                        if (prm[0] == ';' || prm[0] == '^'
                    274:                          || prm[0] == '&'  || prm[0] == '|') {
                    275:                                xcmd[0] = '\0';
                    276:                                APPCMD(prm);
                    277:                                continue;
                    278:                        }
                    279: 
                    280:                        if ((argnok = argok(xcmd, prm)) != SUCCESS)
                    281:                                /*  command not valid  */
                    282:                                break;
                    283: 
                    284:                        if (prm[0] == '~')
                    285:                                expfile(prm);
                    286:                        APPCMD(prm);
                    287:                }
                    288:                /*
                    289:                 * clean up trailing ' ' in command.
                    290:                 */
                    291:                if (cmdp > buf && cmdp[0] == '\0' && cmdp[-1] == ' ')
                    292:                        *--cmdp = '\0';
                    293:                if (argnok || badfiles) {
                    294:                        sprintf(lbuf, "%s XQT DENIED", user);
                    295:                        logent(cmd, lbuf);
                    296:                        DEBUG(4, "bad command %s\n", prm);
                    297:                        notify(user, Rmtname, cmd, "DENIED");
                    298:                        goto rmfiles;
                    299:                }
                    300:                sprintf(lbuf, "%s XQT", user);
                    301:                logent(buf, lbuf);
                    302:                DEBUG(4, "cmd %s\n", buf);
                    303: 
                    304:                mvxfiles(xfile);
                    305:                ret = subchdir(XQTDIR);
                    306:                ASSERT(ret >= 0, "CHDIR FAILED", XQTDIR, ret);
                    307:                ret = shio(buf, fin, dfile);
                    308:                sprintf(retstat, "signal %d, exit %d", ret & 0377,
                    309:                  (ret>>8) & 0377);
                    310:                if (strcmp(xcmd, "rmail") == SAME)
                    311:                        notiok = 0;
                    312:                if (strcmp(xcmd, "rnews") == SAME)
                    313:                        nonzero = 1;
                    314:                notiflg = chknotify(xcmd);
                    315:                if (notiok && notiflg != NT_NO &&
                    316:                   (ret != 0 || (!nonzero && notiflg == NT_YES)))
                    317:                        notify(user, Rmtname, cmd, retstat);
                    318:                else if (ret != 0 && strcmp(xcmd, "rmail") == SAME) {
                    319:                        /* mail failed - return letter to sender  */
                    320: #ifdef DANGEROUS
                    321:                        /* NOT GUARANTEED SAFE!!! */
                    322:                        if (!nonzero)
                    323:                                retosndr(user, Rmtname, fin);
                    324: #else
                    325:                        notify(user, Rmtname, cmd, retstat);
                    326: #endif
                    327:                        sprintf(buf, "%s (%s) from %s!%s", buf, retstat, Rmtname, user);
                    328:                        logent("MAIL FAIL", buf);
                    329:                }
                    330:                DEBUG(4, "exit cmd - %d\n", ret);
                    331:                ret2 = subchdir(Spool);
                    332:                ASSERT(ret2 >= 0, "CHDIR FAILED", Spool, ret);
                    333:                rmxfiles(xfile);
                    334:                if (ret != 0) {
                    335:                        /*  exit status not zero */
                    336:                        dfp = fopen(subfile(dfile), "a");
                    337:                        ASSERT(dfp != NULL, CANTOPEN, dfile, 0);
                    338:                        fprintf(dfp, "exit status %d", ret);
                    339:                        fclose(dfp);
                    340:                }
                    341:                if (strcmp(fout, DEVNULL) != SAME) {
                    342:                        if (prefix(sysout, Myname)) {
                    343:                                xmv(dfile, fout);
                    344:                                chmod(fout, BASEMODE);
                    345:                        } else {
                    346:                                char *cp = rindex(user, '!');
                    347:                                gename(CMDPRE, sysout, 'O', cfile);
                    348:                                fp = fopen(subfile(cfile), "w");
                    349:                                ASSERT(fp != NULL, "OPEN", cfile, 0);
                    350:                                fprintf(fp, "S %s %s %s - %s 0666\n", dfile,
                    351:                                        fout, cp ? cp : user, lastpart(dfile));
                    352:                                fclose(fp);
                    353:                        }
                    354:                }
                    355:        rmfiles:
                    356:                xfp = fopen(subfile(xfile), "r");
                    357:                ASSERT(xfp != NULL, CANTOPEN, xfile, 0);
                    358:                while (fgets(buf, BUFSIZ, xfp) != NULL) {
                    359:                        if (buf[0] != X_RQDFILE)
                    360:                                continue;
                    361:                        sscanf(&buf[1], "%s", file);
                    362:                        unlink(subfile(file));
                    363:                }
                    364:                unlink(subfile(xfile));
                    365:                fclose(xfp);
                    366: 
                    367:                /* rescan X. for new work every RECHECKTIME seconds */
                    368:                time(&xnow);
                    369:                if (xnow > (xstart + RECHECKTIME)) {
                    370:                        extern int Nfiles;
                    371:                        Nfiles = 0;     /*force rescan for new work */
                    372:                }
                    373:                xstart = xnow;
                    374:        }
                    375: 
                    376:        if (stcico)
                    377:                xuucico("");
                    378:        cleanup(0);
                    379: }
                    380: 
                    381: 
                    382: cleanup(code)
                    383: int code;
                    384: {
                    385:        logcls();
                    386:        rmlock(CNULL);
                    387: #ifdef VMS
                    388:        /*
                    389:         *      Since we run as a BATCH job we must wait for all processes to
                    390:         *      to finish
                    391:         */
                    392:        while(wait(0) != -1)
                    393:                ;
                    394: #endif VMS
                    395:        exit(code);
                    396: }
                    397: 
                    398: 
                    399: /*
                    400:  *     get a file to execute
                    401:  *
                    402:  *     return codes:  0 - no file  |  1 - file to execute
                    403:  */
                    404: 
                    405: gtxfile(file)
                    406: register char *file;
                    407: {
                    408:        char pre[3];
                    409:        int rechecked;
                    410:        time_t ystrdy;          /* yesterday */
                    411:        struct stat stbuf;      /* for X file age */
                    412: 
                    413:        pre[0] = XQTPRE;
                    414:        pre[1] = '.';
                    415:        pre[2] = '\0';
                    416:        rechecked = 0;
                    417: retry:
                    418:        if (!gtwrkf(Spool, file)) {
                    419:                if (rechecked)
                    420:                        return 0;
                    421:                rechecked = 1;
                    422:                DEBUG(4, "iswrk\n", CNULL);
                    423:                if (!iswrk(file, "get", Spool, pre))
                    424:                        return 0;
                    425:        }
                    426:        DEBUG(4, "file - %s\n", file);
                    427:        /* skip spurious subdirectories */
                    428:        if (strcmp(pre, file) == SAME)
                    429:                goto retry;
                    430:        if (gotfiles(file))
                    431:                return 1;
                    432:        /* check for old X. file with no work files and remove them. */
                    433:        if (Nfiles > LLEN/2) {
                    434:            time(&ystrdy);
                    435:            ystrdy -= (4 * 3600L);              /* 4 hours ago */
                    436:            DEBUG(4, "gtxfile: Nfiles > LLEN/2\n", CNULL);
                    437:            while (gtwrkf(Spool, file) && !gotfiles(file)) {
                    438:                if (stat(subfile(file), &stbuf) == 0)
                    439:                    if (stbuf.st_mtime <= ystrdy) {
                    440:                        char *bnp, cfilename[NAMESIZE];
                    441:                        DEBUG(4, "gtxfile: move %s to CORRUPT \n", file);
                    442:                        unlink(subfile(file));
                    443:                        bnp = rindex(subfile(file), '/');
                    444:                        sprintf(cfilename, "%s/%s", CORRUPT,
                    445:                                bnp ? bnp + 1 : subfile(file));
                    446:                        xmv(subfile(file), cfilename);
                    447:                        logent(file, "X. FILE CORRUPTED");
                    448:                    }
                    449:            }
                    450:            DEBUG(4, "iswrk\n", CNULL);
                    451:            if (!iswrk(file, "get", Spool, pre))
                    452:                return 0;
                    453:        }
                    454:        goto retry;
                    455: }
                    456: 
                    457: /*
                    458:  *     check for needed files
                    459:  *
                    460:  *     return codes:  0 - not ready  |  1 - all files ready
                    461:  */
                    462: 
                    463: gotfiles(file)
                    464: register char *file;
                    465: {
                    466:        struct stat stbuf;
                    467:        register FILE *fp;
                    468:        char buf[BUFSIZ], rqfile[MAXFULLNAME];
                    469: 
                    470:        fp = fopen(subfile(file), "r");
                    471:        if (fp == NULL)
                    472:                return 0;
                    473: 
                    474:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    475:                DEBUG(4, "%s\n", buf);
                    476:                if (buf[0] != X_RQDFILE)
                    477:                        continue;
                    478:                sscanf(&buf[1], "%s", rqfile);
                    479:                expfile(rqfile);
                    480:                if (stat(subfile(rqfile), &stbuf) == -1) {
                    481:                        fclose(fp);
                    482:                        return 0;
                    483:                }
                    484:        }
                    485: 
                    486:        fclose(fp);
                    487:        return 1;
                    488: }
                    489: 
                    490: 
                    491: /*
                    492:  *     remove execute files to x-directory
                    493:  */
                    494: 
                    495: rmxfiles(xfile)
                    496: register char *xfile;
                    497: {
                    498:        register FILE *fp;
                    499:        char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE];
                    500:        char tfull[MAXFULLNAME];
                    501: 
                    502:        if((fp = fopen(subfile(xfile), "r")) == NULL)
                    503:                return;
                    504: 
                    505:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    506:                if (buf[0] != X_RQDFILE)
                    507:                        continue;
                    508:                if (sscanf(&buf[1], "%s%s", file, tfile) < 2)
                    509:                        continue;
                    510:                sprintf(tfull, "%s/%s", XQTDIR, tfile);
                    511:                unlink(subfile(tfull));
                    512:        }
                    513:        fclose(fp);
                    514:        return;
                    515: }
                    516: 
                    517: 
                    518: /*
                    519:  *     move execute files to x-directory
                    520:  */
                    521: 
                    522: mvxfiles(xfile)
                    523: char *xfile;
                    524: {
                    525:        register FILE *fp;
                    526:        char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE];
                    527:        char tfull[MAXFULLNAME];
                    528:        int ret;
                    529: 
                    530:        if((fp = fopen(subfile(xfile), "r")) == NULL)
                    531:                return;
                    532: 
                    533:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    534:                if (buf[0] != X_RQDFILE)
                    535:                        continue;
                    536:                if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2)
                    537:                        continue;
                    538:                expfile(ffile);
                    539:                sprintf(tfull, "%s/%s", XQTDIR, tfile);
                    540:                unlink(subfile(tfull));
                    541:                ret = xmv(ffile, tfull);
                    542:                ASSERT(ret == 0, "XQTDIR ERROR", CNULL, ret);
                    543:        }
                    544:        fclose(fp);
                    545: }
                    546: 
                    547: /*
                    548:  *     check for valid command/argument        
                    549:  *     *NOTE - side effect is to set xc to the command to be executed.
                    550:  *
                    551:  *     return 0 - ok | 1 nok
                    552:  */
                    553: 
                    554: argok(xc, cmd)
                    555: register char *xc, *cmd;
                    556: {
                    557:        register char **ptr;
                    558: 
                    559: #ifndef ALLOK
                    560:        if (strpbrk(cmd, BADCHARS) != NULL) {
                    561:                DEBUG(1,"MAGIC CHARACTER FOUND\n", CNULL);
                    562:                logent(cmd, "NASTY MAGIC CHARACTER FOUND");
                    563:                return FAIL;
                    564:        }
                    565: #endif !ALLOK
                    566: 
                    567:        if (xc[0] != '\0')
                    568:                return SUCCESS;
                    569: 
                    570: #ifndef ALLOK
                    571:        ptr = Cmds;
                    572:        DEBUG(9, "Compare %s and\n", cmd);
                    573:        while(*ptr != NULL) {
                    574:                DEBUG(9, "\t%s\n", *ptr);
                    575:                if (strcmp(cmd, *ptr) == SAME)
                    576:                        break;
                    577:                ptr++;
                    578:        }
                    579:        if (*ptr == NULL) {
                    580:                DEBUG(1,"COMMAND NOT FOUND\n", CNULL);
                    581:                return FAIL;
                    582:        }
                    583: #endif
                    584:        strcpy(xc, cmd);
                    585:        DEBUG(9, "MATCHED %s\n", xc);
                    586:        return SUCCESS;
                    587: }
                    588: 
                    589: 
                    590: /*
                    591:  *     if notification should be sent for successful execution of cmd
                    592:  *
                    593:  *     return NT_YES - do notification
                    594:  *            NT_ERR - do notification if exit status != 0
                    595:  *            NT_NO  - don't do notification ever
                    596:  */
                    597: 
                    598: chknotify(cmd)
                    599: char *cmd;
                    600: {
                    601:        register char **ptr;
                    602:        register int *nptr;
                    603: 
                    604:        ptr = Cmds;
                    605:        nptr = Notify;
                    606:        while (*ptr != NULL) {
                    607:                if (strcmp(cmd, *ptr) == SAME)
                    608:                        return *nptr;
                    609:                ptr++;
                    610:                nptr++;
                    611:        }
                    612:        return NT_YES;          /* "shouldn't happen" */
                    613: }
                    614: 
                    615: 
                    616: 
                    617: /*
                    618:  *     send mail to user giving execution results
                    619:  */
                    620: 
                    621: notify(user, rmt, cmd, str)
                    622: char *user, *rmt, *cmd, *str;
                    623: {
                    624:        char text[MAXFULLNAME];
                    625:        char ruser[MAXFULLNAME];
                    626: 
                    627:        if (strpbrk(user, BADCHARS) != NULL) {
                    628:                char lbuf[MAXFULLNAME];
                    629:                sprintf(lbuf, "%s INVALID CHARACTER IN USERNAME", user);
                    630:                logent(cmd, lbuf);
                    631:                strcpy(user, "postmaster");
                    632:        }
                    633:        sprintf(text, "uuxqt cmd (%s) status (%s)", cmd, str);
                    634:        if (prefix(rmt, Myname))
                    635:                strcpy(ruser, user);
                    636:        else
                    637:                sprintf(ruser, "%s!%s", rmt, user);
                    638:        mailst(ruser, text, CNULL);
                    639: }
                    640: 
                    641: /*
                    642:  *     return mail to sender
                    643:  *
                    644:  */
                    645: retosndr(user, rmt, file)
                    646: char *user, *rmt, *file;
                    647: {
                    648:        char ruser[MAXFULLNAME];
                    649: 
                    650:        if (strpbrk(user, BADCHARS) != NULL) {
                    651:                char lbuf[MAXFULLNAME];
                    652:                sprintf(lbuf, "%s INVALID CHARACTER IN USERNAME", user);
                    653:                logent(file, lbuf);
                    654:                strcpy(user, "postmaster");
                    655:        }
                    656:        if (strcmp(rmt, Myname) == SAME)
                    657:                strcpy(ruser, user);
                    658:        else
                    659:                sprintf(ruser, "%s!%s", rmt, user);
                    660: 
                    661:        if (anyread(file) == 0)
                    662:                mailst(ruser, "Mail failed.  Letter returned to sender.\n", file);
                    663:        else
                    664:                mailst(ruser, "Mail failed.  Letter returned to sender.\n", CNULL);
                    665:        return;
                    666: }
                    667: 
                    668: /*
                    669:  *     execute shell of command with fi and fo as standard input/output
                    670:  */
                    671: 
                    672: shio(cmd, fi, fo)
                    673: char *cmd, *fi, *fo;
                    674: {
                    675:        int status, f;
                    676:        int uid, pid, ret;
                    677:        char path[MAXFULLNAME];
                    678:        char *args[20];
                    679:        extern int errno;
                    680: 
                    681:        if (fi == NULL)
                    682:                fi = DEVNULL;
                    683:        if (fo == NULL)
                    684:                fo = DEVNULL;
                    685: 
                    686:        getargs(cmd, args, 20);
                    687:        DEBUG(3, "shio - %s\n", cmd);
                    688: #ifdef SIGCHLD
                    689:        signal(SIGCHLD, SIG_IGN);
                    690: #endif SIGCHLD
                    691:        if ((pid = fork()) == 0) {
                    692:                signal(SIGINT, SIG_IGN);
                    693:                signal(SIGHUP, SIG_IGN);
                    694:                signal(SIGQUIT, SIG_IGN);
                    695:                close(Ifn);
                    696:                close(Ofn);
                    697:                close(0);
                    698:                setuid(getuid());
                    699:                f = open(subfile(fi), 0);
                    700:                if (f != 0) {
                    701:                        logent(fi, "CAN'T READ");
                    702:                        exit(-errno);
                    703:                }
                    704:                close(1);
                    705:                f = creat(subfile(fo), 0666);
                    706:                if (f != 1) {
                    707:                        logent(fo, "CAN'T WRITE");
                    708:                        exit(-errno);
                    709:                }
                    710:                execvp(args[0], args);
                    711:                exit(100+errno);
                    712:        }
                    713:        while ((ret = wait(&status)) != pid && ret != -1)
                    714:                ;
                    715:        DEBUG(3, "status %d\n", status);
                    716:        return status;
                    717: }

unix.superglobalmegacorp.com

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