|
|
1.1 root 1: #include "decl.h"
2: #include <fstream.h>
3:
4: /* udaemon: do the processing for a single user */
5:
6: /* Does this string represent the name of a status file? */
7: static int
8: isstat (String s)
9: {
10: if (s.length() <= 2)
11: return 0;
12: return String (s (s.length()-2, 2)) == ".s";
13: }
14:
15: /* Return the data file name corresponding to this string */
16: static String
17: datafile (String s)
18: {
19: return String (s(0,s.length()-2)) + ".d";
20: }
21:
22: /* Read a status file and return its contents */
23: static map
24: readstatus (String s)
25: {
26: map m;
27: char *buf = new char[s.length() + 1];
28: s.dump (buf);
29: filebuf fb;
30: if (fb.open (buf, input)) {
31: istream i (&fb);
32: i >> m;
33: }
34: delete buf;
35: return m;
36: }
37:
38: /* Rewrite a map into a status file */
39: static void
40: writestatus (Path file, map m)
41: {
42: String tempfile = file.rmlast() & "stemp";
43: char *buf = new char[tempfile.length() + 1];
44: tempfile.dump (buf);
45: filebuf fb;
46: if (fb.open (buf, output)) {
47: ostream o (&fb);
48: o << m;
49: o.flush();
50: if (o) {
51: unlink (file);
52: link (tempfile, file);
53: unlink (tempfile);
54: }
55: }
56: delete buf;
57: }
58:
59: static int
60: listsearch (String_list sl, String s)
61: {
62: String_list_iterator i (sl);
63: String t;
64: while (i.nextX (t)) {
65: if (s == t)
66: return 1;
67: }
68: return 0;
69: }
70:
71: String_list deadmach;
72:
73: /* Do all the work for a status file */
74: static void
75: dofile (Path sfile, Path dfile)
76: {
77: map statmap = readstatus (sfile);
78: mel_list_iterator mli (statmap.l);
79: mel m;
80: int keepfile = 0, sendfile = 0;
81: while (mli.nextX (m)) {
82: if (m.p.strchr('#') < 0 &&
83: (m.q.length() == 0 || m.s.length() != 0)) {
84: m.q = String_list();
85: if (listsearch (deadmach, m.p)) {
86: keepfile = 1;
87: m.s = "deferred for sequence";
88: mli.replace (m);
89: } else {
90: m.s = domach (m.p, dfile, m.q);
91: if (m.s.length() == 0) {
92: sendfile = 1;
93: if (m.q.length() == 0)
94: mli.remove();
95: else
96: mli.replace (m);
97: } else {
98: keepfile = 1;
99: deadmach += m.p;
100: mli.replace (m);
101: }
102: }
103: }
104: writestatus (sfile, statmap);
105: }
106:
107: int rc = 0;
108:
109: if (sendfile || !keepfile) {
110: rc = system ("mail " + logname() + " <" + String(sfile));
111: }
112:
113: if (!keepfile && rc == 0) {
114: unlink (sfile);
115: unlink (dfile);
116: }
117: }
118:
119: main()
120: {
121: String ln = logname();
122: Path myspool = spooldir & ln;
123:
124: umask (022);
125: lock (myspool);
126:
127: Path_list files = dircontents (myspool);
128: Path_list_iterator pli (files);
129: Path f;
130:
131: while (pli.nextX (f)) {
132: if (isstat (f))
133: dofile (myspool & f, myspool & datafile(f));
134: }
135: unlock (myspool);
136: return 0;
137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.