|
|
1.1 root 1: /* send.c - send a composed message */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include <signal.h>
6: #include <sys/types.h>
7: #include <sys/stat.h>
8:
9: /* */
10:
11: static struct swit switches[] = {
12: #define ALIASW 0
13: "alias aliasfile", 0,
14:
15: #define DEBUGSW 1
16: "debug", -5,
17:
18: #define DRAFTSW 2
19: "draft", 0,
20:
21: #define DFOLDSW 3
22: "draftfolder +folder", 6,
23: #define DMSGSW 4
24: "draftmessage msg", 6,
25: #define NDFLDSW 5
26: "nodraftfolder", 0,
27:
28: #define ENCRSW 6
29: "encrypt",
30: #ifndef TMA
31: -7,
32: #else TMA
33: 0,
34: #endif TMA
35: #define NENCRSW 7
36: "noencrypt",
37: #ifndef TMA
38: -9,
39: #else TMA
40: 0,
41: #endif TMA
42:
43: #define FILTSW 8
44: "filter filterfile", 0,
45: #define NFILTSW 9
46: "nofilter", 0,
47:
48: #define FRMTSW 10
49: "format", 0,
50: #define NFRMTSW 11
51: "noformat", 0,
52:
53: #define FORWSW 12
54: "forward", 0,
55: #define NFORWSW 13
56: "noforward", 0,
57:
58: #define MSGDSW 14
59: "msgid", 0,
60: #define NMSGDSW 15
61: "nomsgid", 0,
62:
63: #define PUSHSW 16
64: "push", 0,
65: #define NPUSHSW 17
66: "nopush", 0,
67:
68: #define UNIQSW 18
69: "unique", -6,
70: #define NUNIQSW 19
71: "nounique", -8,
72:
73: #define VERBSW 20
74: "verbose", 0,
75: #define NVERBSW 21
76: "noverbose", 0,
77:
78: #define WATCSW 22
79: "watch", 0,
80: #define NWATCSW 23
81: "nowatch", 0,
82:
83: #define WIDTHSW 24
84: "width columns", 0,
85:
86: #define HELPSW 25
87: "help", 4,
88:
89: #define MAILSW 26
90: "mail", -4,
91: #define SAMLSW 27
92: "saml", -4,
93: #define SENDSW 28
94: "send", -4,
95: #define SOMLSW 29
96: "soml", -4,
97:
98: #define CLIESW 30
99: "client host", -6,
100: #define SERVSW 31
101: "server host", -6,
102: #define SNOOPSW 32
103: "snoop", -5,
104:
105: NULL, NULL
106: };
107:
108: static struct swit anyl[] = {
109: #define NOSW 0
110: "no", 0,
111: #define YESW 1
112: "yes", 0,
113: #define LISTDSW 2
114: "list", 0,
115:
116: NULL, NULL
117: };
118:
119: /* */
120:
121: extern int debugsw; /* from sendsbr.c */
122: extern int forwsw;
123: extern int inplace;
124: extern int pushsw;
125: extern int unique;
126:
127: extern char *altmsg; /* .. */
128: extern char *annotext;
129: extern char *distfile;
130:
131: /* */
132:
133: /* ARGSUSED */
134:
135: main (argc, argv)
136: int argc;
137: char *argv[];
138: {
139: int msgp = 0,
140: distsw = 0,
141: vecp = 1,
142: isdf = 0,
143: msgnum,
144: status;
145: char *cp,
146: *dfolder = NULL,
147: *maildir,
148: buf[100],
149: **ap,
150: **argp,
151: *arguments[MAXARGS],
152: *msgs[MAXARGS],
153: *vec[MAXARGS];
154: struct msgs *mp;
155: struct stat st;
156: #ifdef UCI
157: FILE *fp;
158: #endif UCI
159:
160: invo_name = r1bindex (argv[0], '/');
161: if ((cp = m_find (invo_name)) != NULL) {
162: ap = brkstring (cp = getcpy (cp), " ", "\n");
163: ap = copyip (ap, arguments);
164: }
165: else
166: ap = arguments;
167: (void) copyip (argv + 1, ap);
168: argp = arguments;
169:
170: vec[vecp++] = "-library";
171: vec[vecp++] = getcpy (m_maildir (""));
172:
173: /* */
174:
175: while (cp = *argp++) {
176: if (*cp == '-')
177: switch (smatch (++cp, switches)) {
178: case AMBIGSW:
179: ambigsw (cp, switches);
180: done (1);
181: case UNKWNSW:
182: adios (NULLCP, "-%s unknown\n", cp);
183: case HELPSW:
184: (void) sprintf (buf, "%s [file] [switches]", invo_name);
185: help (buf, switches);
186: done (1); /* thanks, phyl */
187:
188: case DRAFTSW:
189: msgs[msgp++] = draft;
190: continue;
191:
192: case DFOLDSW:
193: if (dfolder)
194: adios (NULLCP, "only one draft folder at a time!");
195: if (!(cp = *argp++) || *cp == '-')
196: adios (NULLCP, "missing argument to %s", argp[-2]);
197: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
198: *cp != '@' ? TFOLDER : TSUBCWF);
199: continue;
200: case DMSGSW:
201: if (!(cp = *argp++) || *cp == '-')
202: adios (NULLCP, "missing argument to %s", argp[-2]);
203: msgs[msgp++] = cp;
204: continue;
205: case NDFLDSW:
206: dfolder = NULL;
207: isdf = NOTOK;
208: continue;
209:
210: case PUSHSW:
211: pushsw++;
212: continue;
213: case NPUSHSW:
214: pushsw = 0;
215: continue;
216:
217: case UNIQSW:
218: unique++;
219: continue;
220: case NUNIQSW:
221: unique = 0;
222: continue;
223:
224: case FORWSW:
225: forwsw++;
226: continue;
227: case NFORWSW:
228: forwsw = 0;
229: continue;
230:
231: case DEBUGSW:
232: debugsw++; /* fall */
233: case NFILTSW:
234: case FRMTSW:
235: case NFRMTSW:
236: case MSGDSW:
237: case NMSGDSW:
238: case VERBSW:
239: case NVERBSW:
240: case WATCSW:
241: case NWATCSW:
242: case MAILSW:
243: case SAMLSW:
244: case SENDSW:
245: case SOMLSW:
246: case ENCRSW:
247: case NENCRSW:
248: case SNOOPSW:
249: vec[vecp++] = --cp;
250: continue;
251:
252: case ALIASW:
253: case FILTSW:
254: case WIDTHSW:
255: case CLIESW:
256: case SERVSW:
257: vec[vecp++] = --cp;
258: if (!(cp = *argp++) || *cp == '-')
259: adios (NULLCP, "missing argument to %s", argp[-2]);
260: vec[vecp++] = cp;
261: continue;
262: }
263: else
264: msgs[msgp++] = cp;
265: }
266:
267: /* */
268:
269: if (dfolder == NULL) {
270: if (msgp == 0) {
271: #ifdef WHATNOW
272: if ((cp = getenv ("mhdraft")) && *cp) {
273: msgs[msgp++] = cp;
274: goto go_to_it;
275: }
276: #endif WHATNOW
277: msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf));
278: if (stat (msgs[0], &st) == NOTOK)
279: adios (msgs[0], "unable to stat draft file");
280: cp = concat ("Use \"", msgs[0], "\"? ", NULLCP);
281: for (status = LISTDSW; status != YESW;) {
282: if (!(argp = getans (cp, anyl)))
283: done (1);
284: switch (status = smatch (*argp, anyl)) {
285: case NOSW:
286: done (0);
287: case YESW:
288: break;
289: case LISTDSW:
290: (void) showfile (++argp, msgs[0]);
291: break;
292: default:
293: advise (NULLCP, "say what?");
294: break;
295: }
296: }
297: }
298: else
299: for (msgnum = 0; msgnum < msgp; msgnum++)
300: msgs[msgnum] = getcpy (m_maildir (msgs[msgnum]));
301: }
302: else {
303: if (!m_find ("path"))
304: free (path ("./", TFOLDER));
305:
306: if (!msgp)
307: msgs[msgp++] = "cur";
308: maildir = m_maildir (dfolder);
309:
310: if (chdir (maildir) == NOTOK)
311: adios (maildir, "unable to change directory to");
312: if (!(mp = m_gmsg (dfolder)))
313: adios (NULLCP, "unable to read folder %s", dfolder);
314: if (mp -> hghmsg == 0)
315: adios (NULLCP, "no messages in %s", dfolder);
316:
317: for (msgnum = 0; msgnum < msgp; msgnum++)
318: if (!m_convert (mp, msgs[msgnum]))
319: done (1);
320: m_setseq (mp);
321:
322: for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
323: if (mp -> msgstats[msgnum] & SELECTED) {
324: msgs[msgp++] = getcpy (m_name (msgnum));
325: #ifdef notdef
326: mp -> msgstats[msgnum] |= DELETED;
327: #endif notdef
328: mp -> msgstats[msgnum] &= ~EXISTS;
329: }
330: mp -> msgflags |= SEQMOD;
331:
332: m_sync (mp);
333: }
334: #ifdef WHATNOW
335: go_to_it: ;
336: #endif WHATNOW
337:
338: /* */
339:
340: #ifdef TMA
341: if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
342: if ((cp = m_find ("kdsproc")) && *cp)
343: (void) putenv ("KDS", cp);
344: if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
345: if ((cp = m_find ("tmadb")) && *cp)
346: (void) putenv ("TMADB", m_maildir (cp));
347: #endif TMA
348:
349: if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
350: if ((cp = m_find ("signature")) && *cp)
351: (void) putenv ("SIGNATURE", cp);
352: #ifdef UCI
353: else {
354: (void) sprintf (buf, "%s/.signature", mypath);
355: if ((fp = fopen (buf, "r")) != NULL
356: && fgets (buf, sizeof buf, fp) != NULL) {
357: (void) fclose (fp);
358: if (cp = index (buf, '\n'))
359: *cp = NULL;
360: (void) putenv ("SIGNATURE", buf);
361: }
362: }
363: #endif UCI
364:
365: for (msgnum = 0; msgnum < msgp; msgnum++)
366: if (stat (msgs[msgnum], &st) == NOTOK)
367: adios (msgs[msgnum], "unable to stat draft file");
368:
369: if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
370: annotext = NULL;
371: if (annotext
372: && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL))
373: altmsg = NULL;
374: if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
375: inplace = atoi (cp);
376:
377: if ((cp = getenv ("mhdist"))
378: && *cp
379: && (distsw = atoi (cp))
380: && altmsg) {
381: vec[vecp++] = "-dist";
382: distfile = getcpy (m_scratch (altmsg, invo_name));
383: if (link (altmsg, distfile) == NOTOK)
384: adios (distfile, "unable to link %s to", altmsg);
385: }
386: else
387: distfile = NULL;
388:
389: if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
390: st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
391: if (pushsw)
392: push ();
393:
394: status = 0;
395: vec[0] = r1bindex (postproc, '/');
396: closefds (3);
397:
398: for (msgnum = 0; msgnum < msgp; msgnum++)
399: switch (sendsbr (vec, vecp, msgs[msgnum], &st)) {
400: case DONE:
401: done (++status);
402:
403: case NOTOK:
404: status++; /* fall */
405: case OK:
406: break;
407: }
408:
409: m_update ();
410:
411: done (status);
412: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.