Updated docs/README-ATTACHMENTS, mainly to reflect that no setup is
[mmh] / 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 @