|
|
1.1 root 1: #include "decl.h"
2:
3: extern "C" {
4: extern int setlogname (char*);
5: }
6:
7: main()
8: {
9: Path_list dirs = dircontents (spooldir);
10: Path_list_iterator pli (dirs);
11: Path p;
12: while (pli.nextX (p)) {
13: Path dir = spooldir & p;
14:
15: /*
16: * Try to remove the directory. If we fail,
17: * that means it isn't empty, so there's work to do.
18: */
19: if (rmdir (dir) < 0) {
20: /* If the lock file exists, leave it alone */
21: if (access (dir & "lock", 0) < 0) {
22: struct stat sb;
23: int pid = fork();
24: int rc;
25: switch (pid) {
26: case -1: // better luck next time
27: break;
28:
29: case 0: // child
30: if (stat (dir, &sb) >= 0) {
31: charstr ln = String(p);
32: charstr d = String(Path(etcdir) & "udaemon");
33: setlogname (ln);
34: setgid (sb.st_gid);
35: setuid (sb.st_uid);
36: execl (d, "udaemon", (char*) 0);
37: }
38: exit (1);
39:
40: default: // parent
41: while ((rc = wait (0)) != -1 &&
42: rc != pid)
43: ;
44: break;
45: }
46: }
47: }
48: }
49: return 0;
50: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.