|
|
1.1 root 1: /* whom.c - report who a message would go to */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include <signal.h>
6:
7: /* */
8:
9: static struct swit switches[] = {
10: #define ALIASW 0
11: "alias aliasfile", 0,
12:
13: #define CHKSW 1
14: "check", 0,
15: #define NOCHKSW 2
16: "nocheck", 0,
17:
18: #define DRAFTSW 3
19: "draft", 0,
20:
21: #define DFOLDSW 4
22: "draftfolder +folder", 6,
23: #define DMSGSW 5
24: "draftmessage msg", 6,
25: #define NDFLDSW 6
26: "nodraftfolder", 0,
27:
28: #define HELPSW 7
29: "help", 4,
30:
31: #define CLIESW 8
32: "client host", -6,
33: #define SERVSW 9
34: "server host", -6,
35: #define SNOOPSW 10
36: "snoop", -5,
37:
38: NULL, NULL
39: };
40:
41: /* */
42:
43: /* ARGSUSED */
44:
45: main (argc, argv)
46: int argc;
47: char *argv[];
48: {
49: int child_id,
50: i,
51: status,
52: isdf = 0,
53: distsw = 0,
54: vecp = 0;
55: char *cp,
56: *dfolder = NULL,
57: *dmsg = NULL,
58: *msg = NULL,
59: **ap,
60: **argp,
61: backup[BUFSIZ],
62: buf[100],
63: *arguments[MAXARGS],
64: *vec[MAXARGS];
65:
66: invo_name = r1bindex (argv[0], '/');
67: if ((cp = m_find (invo_name)) != NULL) {
68: ap = brkstring (cp = getcpy (cp), " ", "\n");
69: ap = copyip (ap, arguments);
70: }
71: else
72: ap = arguments;
73: (void) copyip (argv + 1, ap);
74: argp = arguments;
75:
76: vec[vecp++] = invo_name;
77: vec[vecp++] = "-whom";
78: vec[vecp++] = "-library";
79: vec[vecp++] = getcpy (m_maildir (""));
80:
81: /* */
82:
83: while (cp = *argp++) {
84: if (*cp == '-')
85: switch (smatch (++cp, switches)) {
86: case AMBIGSW:
87: ambigsw (cp, switches);
88: done (1);
89: case UNKWNSW:
90: adios (NULLCP, "-%s unknown", cp);
91: case HELPSW:
92: (void) sprintf (buf, "%s [switches] [file]", invo_name);
93: help (buf, switches);
94: done (1);
95:
96: case CHKSW:
97: case NOCHKSW:
98: case SNOOPSW:
99: vec[vecp++] = --cp;
100: continue;
101:
102: case DRAFTSW:
103: msg = draft;
104: continue;
105:
106: case DFOLDSW:
107: if (dfolder)
108: adios (NULLCP, "only one draft folder at a time!");
109: if (!(cp = *argp++) || *cp == '-')
110: adios (NULLCP, "missing argument to %s", argp[-2]);
111: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
112: *cp != '@' ? TFOLDER : TSUBCWF);
113: continue;
114: case DMSGSW:
115: if (dmsg)
116: adios (NULLCP, "only one draft message at a time!");
117: if (!(dmsg = *argp++) || *dmsg == '-')
118: adios (NULLCP, "missing argument to %s", argp[-2]);
119: continue;
120: case NDFLDSW:
121: dfolder = NULL;
122: isdf = NOTOK;
123: continue;
124:
125: case ALIASW:
126: case CLIESW:
127: case SERVSW:
128: vec[vecp++] = --cp;
129: if (!(cp = *argp++) || *cp == '-')
130: adios (NULLCP, "missing argument to %s", argp[-2]);
131: vec[vecp++] = cp;
132: continue;
133: }
134: if (msg)
135: adios (NULLCP, "only one draft at a time!");
136: else
137: vec[vecp++] = msg = cp;
138: }
139:
140: /* */
141:
142: if (msg == NULL) {
143: #ifdef WHATNOW
144: if ((cp = getenv ("mhdraft")) == NULL || *cp == NULL)
145: #endif WHATNOW
146: cp = getcpy (m_draft (dfolder, dmsg, 1, &isdf));
147: msg = vec[vecp++] = cp;
148: }
149: if ((cp = getenv ("mhdist"))
150: && *cp
151: && (distsw = atoi (cp))
152: && (cp = getenv ("mhaltmsg"))
153: && *cp) {
154: if (distout (msg, cp, backup) == NOTOK)
155: done (1);
156: vec[vecp++] = "-dist";
157: distsw++;
158: }
159: vec[vecp] = NULL;
160:
161: closefds (3);
162:
163: if (distsw)
164: for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
165: sleep (5);
166: switch (distsw ? child_id : OK) {
167: case NOTOK:
168: advise (NULLCP, "unable to fork, so checking directly...");
169: case OK:
170: execvp (postproc, vec);
171: fprintf (stderr, "unable to exec ");
172: perror (postproc);
173: _exit (-1);
174:
175: default:
176: (void) signal (SIGHUP, SIG_IGN);
177: (void) signal (SIGINT, SIG_IGN);
178: (void) signal (SIGQUIT, SIG_IGN);
179: (void) signal (SIGTERM, SIG_IGN);
180:
181: status = pidwait (child_id, OK);
182:
183: (void) unlink (msg);
184: if (rename (backup, msg) == NOTOK)
185: adios (msg, "unable to rename %s to", backup);
186: done (status);
187: }
188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.