Annotation of researchv10no/cmd/odist/ape/scanq.c, revision 1.1

1.1     ! root        1: #include <dirent.h>
        !             2: #include <limits.h>
        !             3: #include <stdio.h>
        !             4: #include <stdlib.h>
        !             5: #include <string.h>
        !             6: #include <unistd.h>
        !             7: #include "dist.h"
        !             8: 
        !             9: static char *
        !            10: copy(char *s)
        !            11: {
        !            12:        char *r;
        !            13: 
        !            14:        r = malloc(strlen(s) + 1);
        !            15:        if (r)
        !            16:                strcpy(r, s);
        !            17:        return r;
        !            18: }
        !            19: 
        !            20: static void
        !            21: removeq(char *name)
        !            22: {
        !            23:        DIR *dp;
        !            24:        struct dirent *d;
        !            25:        char file[2 * MAXNAME + 1];
        !            26: 
        !            27:        name = copy(name);      /* readdir bug?!? */
        !            28:        if (fork() == 0) {
        !            29:                setuid(getuid());
        !            30:                execl(LDIR "/genmail", "genmail", "-f", name, (char *) 0);
        !            31:                exit(0);
        !            32:        } else
        !            33:                wait(0);
        !            34:        if (!(dp = opendir(name)))
        !            35:                return;
        !            36:        while (d = readdir(dp)) {
        !            37:                if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
        !            38:                        continue;
        !            39:                sprintf(file, "%s/%.*s", name, MAXNAME, d->d_name);
        !            40:                remove(file);
        !            41:        }
        !            42:        closedir(dp);
        !            43:        rmdir(name);
        !            44:        free(name);
        !            45: }
        !            46: 
        !            47: void
        !            48: scanq(char *remsys, void (*func)(char *, int, char *))
        !            49: {
        !            50:        DIR *dp;
        !            51:        struct dirent *d;
        !            52:        FILE *fp;
        !            53:        char sys[MAXLINE], cansys[MAXLINE], file[MAXNAME];
        !            54:        int num, zapq;
        !            55: 
        !            56:        if (remsys)
        !            57:                canon(remsys, cansys);
        !            58: 
        !            59:        if (chdir(SDIR) < 0) {
        !            60:                eprintf("can't chdir %s", SDIR);
        !            61:                exit(1);
        !            62:        }
        !            63: 
        !            64:        if (!(dp = opendir("."))) {
        !            65:                eprintf("can't read spool directory!");
        !            66:                exit(1);
        !            67:        }
        !            68: 
        !            69:        while (d = readdir(dp))
        !            70:                if (strncmp(d->d_name, QPREFIX, strlen(QPREFIX)) == 0) {
        !            71:                        zapq = 1;
        !            72:                        if (chdir(d->d_name) < 0) {
        !            73:                                eprintf("can't chdir %s/%s", SDIR, d->d_name);
        !            74:                                continue;
        !            75:                        }
        !            76:                        if (fp = fopen(CTL, "r")) {
        !            77:                                while (fscanf(fp, "%d%s", &num, sys) == 2) {
        !            78:                                        sprintf(file, "%d.%s", num, DONE);
        !            79:                                        if (access(file, F_OK) == 0)
        !            80:                                                continue;
        !            81:                                        if (remsys && strcmp(sys, cansys) != 0) {
        !            82:                                                zapq = 0;
        !            83:                                                continue;
        !            84:                                        }
        !            85:                                        if (func)
        !            86:                                                (*func)(d->d_name, num, sys);
        !            87:                                        if (access(file, F_OK) != 0)
        !            88:                                                zapq = 0;
        !            89:                                }
        !            90:                                fclose(fp);
        !            91:                        } else
        !            92:                                eprintf("can't read %s/%s", d->d_name, CTL);
        !            93:                        chdir("..");
        !            94:                        if (zapq)
        !            95:                                removeq(d->d_name);
        !            96:                }
        !            97: 
        !            98:        closedir(dp);
        !            99: }

unix.superglobalmegacorp.com

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