]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/RCS/mhmail.c,v
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / docs / historical / mh-6.8.5 / uip / RCS / mhmail.c,v
1 head 1.9;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 1.9
9 date 93.08.20.15.51.29; author jromine; state Exp;
10 branches;
11 next 1.8;
12
13 1.8
14 date 92.12.15.00.20.22; author jromine; state Exp;
15 branches;
16 next 1.7;
17
18 1.7
19 date 92.11.04.00.46.24; author jromine; state Exp;
20 branches;
21 next 1.6;
22
23 1.6
24 date 92.10.27.00.13.21; author jromine; state Exp;
25 branches;
26 next 1.5;
27
28 1.5
29 date 92.01.31.22.12.50; author jromine; state Exp;
30 branches;
31 next 1.4;
32
33 1.4
34 date 92.01.31.05.51.11; author jromine; state Exp;
35 branches;
36 next 1.3;
37
38 1.3
39 date 90.04.05.15.01.25; author sources; state Exp;
40 branches;
41 next 1.2;
42
43 1.2
44 date 90.02.06.13.21.18; author sources; state Exp;
45 branches;
46 next 1.1;
47
48 1.1
49 date 90.02.06.13.21.05; author sources; state Exp;
50 branches;
51 next ;
52
53
54 desc
55 @@
56
57
58 1.9
59 log
60 @added -queued to pass to post
61 @
62 text
63 @/* mhmail.c - simple mail program */
64 #ifndef lint
65 static char ident[] = "@@(#)$Id: mhmail.c,v 1.8 1992/12/15 00:20:22 jromine Exp jromine $";
66 #endif /* lint */
67
68 #include "../h/mh.h"
69 #include <stdio.h>
70 #include <signal.h>
71 #ifdef LOCALE
72 #include <locale.h>
73 #endif
74
75 /* \f */
76
77 static struct swit switches[] = {
78 #define BODYSW 0
79 "body text", 0,
80
81 #define CCSW 1
82 "cc addrs ...", 0,
83
84 #define FROMSW 2
85 "from addr", 0,
86
87 #define SUBJSW 3
88 "subject text", 0,
89
90 #define HELPSW 4
91 "help", 4,
92
93 #define RESNDSW 5
94 "resent", -6,
95 #define QUEUESW 6
96 "queued", -6,
97
98 NULL, 0
99 };
100
101 /* \f */
102
103 static TYPESIG intrser ();
104
105
106 static char tmpfil[BUFSIZ];
107
108 /* \f */
109
110 /* ARGSUSED */
111
112 main (argc, argv)
113 int argc;
114 char *argv[];
115 {
116 int child_id,
117 status,
118 i,
119 iscc = 0,
120 nvec,
121 queued = 0,
122 resent = 0,
123 somebody;
124 char *cp,
125 *tolist = NULL,
126 *cclist = NULL,
127 *subject = NULL,
128 *from = NULL,
129 *body = NULL,
130 **argp = argv + 1,
131 buf[100],
132 *vec[5];
133 FILE * out;
134
135 #ifdef LOCALE
136 setlocale(LC_ALL, "");
137 #endif
138 invo_name = r1bindex (argv[0], '/');
139 m_foil (NULLCP);
140
141 if (argc == 1) {
142 execlp (incproc, r1bindex (incproc, '/'), NULLCP);
143 adios (incproc, "unable to exec");
144 }
145
146 /* \f */
147
148 while (cp = *argp++) {
149 if (*cp == '-')
150 switch (smatch (++cp, switches)) {
151 case AMBIGSW:
152 ambigsw (cp, switches);
153 done (1);
154
155 case UNKWNSW:
156 adios (NULLCP, "-%s unknown", cp);
157
158 case HELPSW:
159 (void) sprintf (buf, "%s [addrs ... [switches]]",
160 invo_name);
161 help (buf, switches);
162 done (1);
163
164 case FROMSW:
165 if (!(from = *argp++) || *from == '-')
166 adios (NULLCP, "missing argument to %s", argp[-2]);
167 continue;
168
169 case BODYSW:
170 if (!(body = *argp++) || *body == '-')
171 adios (NULLCP, "missing argument to %s", argp[-2]);
172 continue;
173
174 case CCSW:
175 iscc++;
176 continue;
177
178 case SUBJSW:
179 if (!(subject = *argp++) || *subject == '-')
180 adios (NULLCP, "missing argument to %s", argp[-2]);
181 continue;
182
183 case RESNDSW:
184 resent++;
185 continue;
186
187 case QUEUESW:
188 queued++;
189 continue;
190 }
191 if (iscc)
192 cclist = cclist ? add (cp, add (", ", cclist)) : getcpy (cp);
193 else
194 tolist = tolist ? add (cp, add (", ", tolist)) : getcpy (cp);
195 }
196
197 /* \f */
198
199 if (tolist == NULL)
200 adios (NULLCP, "usage: %s addrs ... [switches]", invo_name);
201 (void) strcpy (tmpfil, m_tmpfil (invo_name));
202 if ((out = fopen (tmpfil, "w")) == NULL)
203 adios (tmpfil, "unable to write");
204 (void) chmod (tmpfil, 0600);
205
206 setsig (SIGINT, intrser);
207
208 fprintf (out, "%sTo: %s\n", resent ? "Resent-" : "", tolist);
209 if (cclist)
210 fprintf (out, "%scc: %s\n", resent ? "Resent-" : "", cclist);
211 if (subject)
212 fprintf (out, "%sSubject: %s\n", resent ? "Resent-" : "", subject);
213 if (from)
214 fprintf (out, "%sFrom: %s\n", resent ? "Resent-" : "", from);
215 if (!resent)
216 (void) fputs ("\n", out);
217
218 if (body) {
219 fprintf (out, "%s", body);
220 if (*body && *(body + strlen (body) - 1) != '\n')
221 fputs ("\n", out);
222 }
223 else {
224 for (somebody = 0;
225 (i = fread (buf, sizeof *buf, sizeof buf, stdin)) > 0;
226 somebody++)
227 if (fwrite (buf, sizeof *buf, i, out) != i)
228 adios (tmpfil, "error writing");
229 if (!somebody) {
230 (void) unlink (tmpfil);
231 done (1);
232 }
233 }
234 (void) fclose (out);
235
236 /* \f */
237
238 nvec = 0;
239 vec[nvec++] = r1bindex (postproc, '/');
240 vec[nvec++] = tmpfil;
241 if (resent)
242 vec[nvec++] = "-dist";
243 if (queued)
244 vec[nvec++] = "-queued";
245 vec[nvec] = 0;
246
247 for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
248 sleep (5);
249 switch (child_id) {
250 case NOTOK: /* report failure and then send it */
251 admonish (NULLCP, "unable to fork");
252
253 case OK:
254 execvp (postproc, vec);
255 fprintf (stderr, "unable to exec ");
256 perror (postproc);
257 _exit (-1);
258
259 default:
260 if (status = pidXwait (child_id, postproc)) {
261 fprintf (stderr, "Letter saved in dead.letter\n");
262 execl ("/bin/mv", "mv", tmpfil, "dead.letter", NULLCP);
263 execl ("/usr/bin/mv", "mv", tmpfil, "dead.letter", NULLCP);
264 perror ("mv");
265 _exit (-1);
266 }
267
268 (void) unlink (tmpfil);
269 done (status ? 1 : 0);
270 }
271 }
272
273 /* \f */
274
275 /* ARGSUSED */
276
277 static TYPESIG intrser (i)
278 int i;
279 {
280 #ifndef BSD42
281 if (i)
282 (void) signal (i, SIG_IGN);
283 #endif /* BSD42 */
284
285 (void) unlink (tmpfil);
286 done (i != 0 ? 1 : 0);
287 }
288 @
289
290
291 1.8
292 log
293 @endif sugar
294 @
295 text
296 @d3 1
297 a3 1
298 static char ident[] = "@@(#)$Id: mhmail.c,v 1.7 1992/11/04 00:46:24 jromine Exp jromine $";
299 d33 2
300 d58 2
301 d69 2
302 a70 1
303 buf[100];
304 d124 4
305 d176 9
306 d191 2
307 a192 3
308 case OK:
309 execlp (postproc, r1bindex (postproc, '/'), tmpfil,
310 resent ? "-dist" : NULLCP, NULLCP);
311 @
312
313
314 1.7
315 log
316 @LOCALE
317 TYPESIG
318 @
319 text
320 @d3 2
321 a4 2
322 static char ident[] = "@@(#)$Id: mhmail.c,v 1.6 1992/10/27 00:13:21 jromine Exp jromine $";
323 #endif lint
324 d204 1
325 a204 1
326 #endif BSD42
327 @
328
329
330 1.6
331 log
332 @typo
333 @
334 text
335 @d3 1
336 a3 1
337 static char ident[] = "@@(#)$Id: mhmail.c,v 1.5 1992/01/31 22:12:50 jromine Exp jromine $";
338 d9 3
339 d39 1
340 a39 1
341 static int intrser ();
342 d68 3
343 d198 1
344 a198 1
345 static int intrser (i)
346 @
347
348
349 1.5
350 log
351 @kerberos
352 @
353 text
354 @d3 1
355 a3 1
356 static char ident[] = "@@(#)$Id: mhmail.c,v 1.4 1992/01/31 05:51:11 jromine Exp jromine $";
357 d23 1
358 a23 1
359 "subject", 0,
360 @
361
362
363 1.4
364 log
365 @add -resent for mrose@@dbc.mtview.ca.us
366 @
367 text
368 @d3 1
369 a3 1
370 static char ident[] = "@@(#)$Id: mhmail.c,v 1.3 1990/04/05 15:01:25 sources Exp jromine $";
371 d31 1
372 a31 1
373 NULL, NULL
374 @
375
376
377 1.3
378 log
379 @add ID
380 @
381 text
382 @d3 1
383 a3 1
384 static char ident[] = "@@(#)$Id:$";
385 d28 3
386 d53 1
387 d109 4
388 d131 1
389 a131 1
390 fprintf (out, "To: %s\n", tolist);
391 d133 1
392 a133 1
393 fprintf (out, "cc: %s\n", cclist);
394 d135 1
395 a135 1
396 fprintf (out, "Subject: %s\n", subject);
397 d137 3
398 a139 2
399 fprintf (out, "From: %s\n", from);
400 (void) fputs ("\n", out);
401 d168 2
402 a169 1
403 execlp (postproc, r1bindex (postproc, '/'), tmpfil, NULLCP);
404 @
405
406
407 1.2
408 log
409 @ANSI Compilance
410 @
411 text
412 @d2 3
413 @
414
415
416 1.1
417 log
418 @Initial revision
419 @
420 text
421 @d30 1
422 a30 1
423 int intrser ();
424 @