annotate uip/sendsbr.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children 07f8972434be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* sendsbr.c - routines to help WhatNow/Send along */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: sendsbr.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <setjmp.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #ifdef UNISTD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #endif
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 extern char *LocalName();
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 static alert(), anno(), annoaux();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 static int tmp_fd();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 static int sendaux();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #ifdef MIME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 static int sendaux2();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 int debugsw = 0; /* global */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 int forwsw = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 int inplace = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 int mime = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 int pushsw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 int splitsw = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 int unique = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 int verbsw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 char *altmsg = NULL; /* .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 char *annotext = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 char *distfile = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 static int armed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 static jmp_buf env;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 char *getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 time_t time ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 int sendsbr (vec, vecp, drft, st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 char **vec,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 *drft;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 int vecp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 struct stat *st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 armed++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 switch (setjmp (env)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 status = sendaux (vec, vecp, drft, st) ? NOTOK : OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 status = DONE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 armed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 if (distfile)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 (void) unlink (distfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 return status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 #ifdef MIME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 #include "../h/mhn.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 static int sendaux (vec, vecp, drft, st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 register char **vec,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 *drft;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 int vecp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 register struct stat *st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 int compnum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 nparts,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 partno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 state,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 time_t clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 long pos,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 *subject = "",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 msgid[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 name[NAMESZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 partnum[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 struct stat sts;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 if (splitsw < 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 || distfile
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 || stat (drft, &sts) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 || sts.st_size < CPERMSG) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 one_shot: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 splitsw = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 return sendaux2 (vec, vecp, drft, st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 if ((in = fopen (drft, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 adios (drft, "unable to open for reading");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 cp = dp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 start = 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 for (compnum = 1, state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 switch (state = m_getfld (state, name, buffer, sizeof buffer, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 if (uleq (name, "Message-ID")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 while (state == FLDPLUS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 state = m_getfld (state, name, buffer, sizeof buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 if (uprf (name, XXX_FIELD_PRF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 || uleq (name, VRSN_FIELD)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 || uleq (name, "Encrypted")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 dp = add (concat (name, ":", buffer, NULLCP), dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 state = m_getfld (state, name, buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 sizeof buffer, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 dp = add (buffer, dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 } else if (uleq (name, "Subject")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 long sublen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 subject = add (buffer, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 state = m_getfld (state, name, buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 sizeof buffer, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 subject = add (buffer, subject);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 dp = add (concat (name, ":", subject, NULLCP), dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 if ((sublen = strlen (subject)) > 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 && subject[sublen - 1] == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 subject[sublen - 1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 if ((pp = rindex(subject, '\n')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 sublen = strlen(pp) - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 pp = subject;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 sublen += 8 /* strlen("Subject:") */;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 if (sublen + 12 + 6 > CPERLIN && strstr(pp, "=?"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 subject = add ("\n\t", subject);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 cp = add (concat (name, ":", buffer, NULLCP), cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 state = m_getfld (state, name, buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 sizeof buffer, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 cp = add (buffer, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 if (state != FLDEOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 start = ftell (in) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 /* else fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 case BODYEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 adios (NULLCP, "message format error in component #%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 compnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 adios (NULLCP, "getfld () returned %d", state);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 if (cp == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 adios (NULLCP, "headers missing from draft");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 nparts = 1, pos = start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 while (fgets (buffer, sizeof buffer - 1, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 register long len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 if ((pos += (len = strlen (buffer))) > CPERMSG)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 nparts++, pos = len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 if (nparts == 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 if (dp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 free (dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 goto one_shot;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 if (!pushsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 printf ("Sending as %d Partial Messages\n", nparts);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 status = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 vec[vecp++] = "-partno";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 vec[vecp++] = partnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 if (splitsw == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 vec[vecp++] = "-queued";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 (void) time (&clock);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 (void) sprintf (msgid, "<%d.%ld@%s>", getpid (), (long)clock, LocalName ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 (void) fseek (in, start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 for (partno = 1; partno <= nparts; partno++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 char tmpdrf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 FILE *out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 (void) strcpy (tmpdrf, m_scratch (drft, invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 if ((out = fopen (tmpdrf, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 adios (tmpdrf, "unable to open for writing");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 (void) chmod (tmpdrf, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 (void) fputs (cp, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 fprintf (out, "Subject:%s (part %d of %d)\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 subject, partno, nparts);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 fprintf (out, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 fprintf (out,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 "%s: message/partial; id=\"%s\";\n\tnumber=%d; total=%d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 TYPE_FIELD, msgid, partno, nparts);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 fprintf (out, "%s: part %d of %d\n\n", DESCR_FIELD, partno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 nparts);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 if (partno == 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 if (dp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 (void) fputs (dp, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 fprintf (out, "Message-ID: %s\n", msgid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 fprintf (out, "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 pos = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 register long len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 if (!fgets (buffer, sizeof buffer - 1, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 if (partno == nparts)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 adios (NULLCP, "premature eof");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 if ((pos += (len = strlen (buffer))) > CPERMSG) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 (void) fseek (in, -len, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 (void) fputs (buffer, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 if (fflush (out))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 adios (tmpdrf, "error writing to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 (void) fclose (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 if (!pushsw && verbsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 printf ("\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (splitsw > 0 && 1 < partno && partno <= nparts) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 if (!pushsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 printf ("pausing %d seconds before sending part %d...\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 splitsw, partno);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 sleep ((unsigned) splitsw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 (void) sprintf (partnum, "%d", partno);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 status = sendaux2 (vec, vecp, tmpdrf, st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 (void) unlink (tmpdrf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 if (status != OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 annotext = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 if (dp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 free (dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 if (status == OK &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 rename (drft, strcpy (buffer, m_backup (drft))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 advise (buffer, "unable to rename %s to", drft);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 return status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 #ifndef MIME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 static int sendaux (vec, vecp, drft, st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 #else /* MIME */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 static int sendaux2 (vec, vecp, drft, st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 #endif /* MIME */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 register char **vec,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 *drft;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 int vecp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 register struct stat *st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 int child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 status,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 fd2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 #ifdef MH_PLUS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 #endif /* MH_PLUS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 char backup[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 buf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 file[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 fd = pushsw ? tmp_fd () : NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 fd2 = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 #ifdef MH_PLUS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 if ((cp = m_find("sendername"))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 vec[vecp++] = "-user";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 vec[vecp++] = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 if ((cp = m_find("from-address"))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 vec[vecp++] = "-from";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 vec[vecp++] = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 #endif /* MH_PLUS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 if (pushsw && unique) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (rename (drft, strcpy (file, m_scratch (drft, invo_name)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 adios (file, "unable to rename %s to", drft);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 drft = file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 vec[vecp++] = drft;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 if (annotext)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if ((fd2 = tmp_fd ()) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 vec[vecp++] = "-idanno";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 (void) sprintf (buf, "%d", fd2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 vec[vecp++] = buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 admonish (NULLCP, "unable to create file for annotation list");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 if (distfile && distout (drft, distfile, backup) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 vec[vecp] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 case NOTOK: /* oops */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 adios ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 case OK: /* send it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if (fd != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 (void) dup2 (fd, fileno (stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 (void) dup2 (fd, fileno (stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 execvp (postproc, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 perror (postproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 default: /* wait for it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 if ((status = pidwait (child_id, NOTOK)) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 if (annotext && fd2 != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 anno (fd2, st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 if (splitsw < 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 && rename (drft, strcpy (buf, m_backup (drft)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 advise (buf, "unable to rename %s to", drft);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 if (fd != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 alert (drft, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 advise (NULLCP, "message not delivered to anyone");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 if (annotext && fd2 != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 (void) close (fd2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 if (distfile) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 (void) unlink (drft);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 if (rename (backup, drft) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 advise (drft, "unable to rename %s to", backup);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 return status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 static alert (file, out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 register char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 int out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 int child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 char buf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 case NOTOK: /* oops */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 advise ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 case OK: /* send it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 (void) signal (SIGHUP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 (void) signal (SIGINT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 (void) signal (SIGQUIT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 (void) signal (SIGTERM, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 if (forwsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 if ((in = open (file, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 admonish (file, "unable to re-open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 (void) lseek (out, (off_t)0, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 (void) strcpy (buf, "\nMessage not delivered to anyone.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 (void) write (out, buf, strlen (buf));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 (void) strcpy (buf, "\n------- Unsent Draft\n\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 (void) write (out, buf, strlen (buf));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 cpydgst (in, out, file, "temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 (void) close (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 (void) strcpy (buf, "\n------- End of Unsent Draft\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 (void) write (out, buf, strlen (buf));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 if (rename (file, strcpy (buf, m_backup (file))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 admonish (buf, "unable to rename %s to", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 (void) lseek (out, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 (void) dup2 (out, fileno (stdin));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 (void) close (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 (void) sprintf (buf, "send failed on %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 forwsw ? "enclosed draft" : file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 execlp (mailproc, r1bindex (mailproc, '/'), getusr (),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 "-subject", buf, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 perror (mailproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 default: /* no waiting... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 static int tmp_fd () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 char tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 if ((fd = creat (tmpfil, 0600)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 advise (NULLCP, "temporary file %s selected", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 if (unlink (tmpfil) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 advise (tmpfil, "unable to remove");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 static anno (fd, st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 register struct stat *st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 static char *cwd = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 struct stat st2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 if (altmsg &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 (stat (altmsg, &st2) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 || st -> st_mtime != st2.st_mtime
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 || st -> st_dev != st2.st_dev
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 || st -> st_ino != st2.st_ino)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 admonish (NULLCP, "$mhaltmsg mismatch");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 child_id = debugsw ? NOTOK : fork ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 case NOTOK: /* oops */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 if (!debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 advise (NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 "unable to fork, so doing annotations by hand...");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 if (cwd == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 cwd = getcpy (pwd ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 hstat = signal (SIGHUP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 istat = signal (SIGINT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 qstat = signal (SIGQUIT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 tstat = signal (SIGTERM, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 annoaux (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 if (child_id == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 _exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 (void) signal (SIGHUP, hstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 (void) signal (SIGINT, istat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 (void) signal (SIGQUIT, qstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 (void) signal (SIGTERM, tstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 (void) chdir (cwd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 default: /* no waiting... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 static annoaux (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 int fd2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 fd3,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 *folder,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 *maildir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 **ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 if ((folder = getenv ("mhfolder")) == NULL || *folder == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 admonish (NULLCP, "$mhfolder not set");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 maildir = m_maildir (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 if (chdir (maildir) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 admonish (maildir, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 if (!(mp = m_gmsg (folder))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 admonish (NULLCP, "unable to read folder %s");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 if (mp -> hghmsg == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 admonish (NULLCP, "no messages in %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 goto oops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 if ((cp = getenv ("mhmessages")) == NULL || *cp == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 admonish (NULLCP, "$mhmessages not set");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 goto oops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 if (!debugsw /* MOBY HACK... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 && pushsw
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 && (fd3 = open ("/dev/null", 2)) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 && (fd2 = dup (fileno (stderr))) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 (void) dup2 (fd3, fileno (stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 (void) close (fd3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 fd2 = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 for (ap = brkstring (cp = getcpy (cp), " ", NULLCP); *ap; ap++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 (void) m_convert (mp, *ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 if (fd2 != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 (void) dup2 (fd2, fileno (stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 if (mp -> numsel == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 admonish (NULLCP, "no messages to annotate");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 goto oops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 if ((fp = fdopen (fd, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 admonish (NULLCP, "unable to fdopen annotation list");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 goto oops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 cp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 while (fgets (buffer, sizeof buffer, fp) != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 cp = add (buffer, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 advise (NULLCP, "annotate%s with %s: \"%s\"",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 inplace ? " inplace" : "", annotext, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 if (mp -> msgstats[msgnum] & SELECTED) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 if (debugsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 advise (NULLCP, "annotate message %d", msgnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 (void) annotate (m_name (msgnum), annotext, cp, inplace, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 oops: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 m_fmsg (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 void done (status)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 if (armed)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 longjmp (env, status ? status : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 exit (status);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 }