|
|
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.