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