]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/cmds/reply.c
Removed --depth 1 from git clone invocation.
[nmh] / docs / historical / mh-nov-1983 / cmds / reply.c
1 #include "mh.h"
2 #include <stdio.h>
3 #include <signal.h>
4 #include <strings.h>
5
6 /*#define NEWS 1*/
7
8 #define NOUSE 0
9
10 /* #define TEST 1 */
11
12 char *anyl[] = {
13 "no", 0,
14 "yes", 0,
15 "list", 0,
16 0
17 };
18
19 char *aleqs[] = {
20 "list", 0, /* 0 */
21 "edit [<editor>]", 0, /* 1 */
22 "quit [delete]", 0, /* 2 */
23 "send [verbose]", 0, /* 3 */
24 0
25 };
26
27 int *vec[MAXARGS], anot;
28 int ccme = 1;
29 struct msgs *mp;
30 char *ed;
31 int inplace; /* preserve links in anno */
32
33 struct swit switches[] = {
34 "annotate", 0, /* 0 */
35 "noannotate", 0, /* 1 */
36 "ccme", -1, /* 2 */
37 "noccme", -1, /* 3 */
38 "editor editor", 0, /* 4 */
39 "inplace", 0, /* 5 */
40 "noinplace", 0, /* 6 */
41 "help", 4, /* 7 */
42 0, 0
43 };
44
45 char *ltrim();
46 char *rtrim();
47 char *niceadd();
48 char *fix();
49 char *addr();
50
51 main(argc, argv)
52 char *argv[];
53 {
54 char *folder, *nfolder, *msg, *maildir;
55 register char *cp, **ap;
56 register int cur;
57 char *arguments[50], **argp;
58
59 #ifdef NEWS
60 m_news();
61 #endif
62 msg = 0; anot = 0; folder = 0;
63
64 cp = r1bindex(argv[0], '/');
65 if((cp = m_find(cp)) != NULL) {
66 ap = brkstring(cp = getcpy(cp), " ", "\n");
67 ap = copyip(ap, arguments);
68 } else
69 ap = arguments;
70 copyip(argv+1, ap);
71 argp = arguments;
72 while(cp = *argp++) {
73 if(*cp == '-')
74 switch(smatch(++cp, switches)) {
75 case -2:ambigsw(cp, switches); /* ambiguous */
76 goto leave;
77 /* unknown */
78 case -1:fprintf(stderr, "repl: -%s unknown\n", cp);
79 goto leave;
80 case 0: anot = 1; continue; /* -annotate */
81 case 1: anot = 0; continue; /* -noannotate */
82 case 2: ccme = 1; continue; /* -ccme */
83 case 3: ccme = 0; continue; /* -noccme */
84 case 4: if(!(ed = *argp++)) { /* -editor */
85 fprintf(stderr, "repl: Missing argument for %s switch\n", argp[-2]);
86 goto leave;
87 }
88 continue;
89 case 5: inplace = 1; continue; /* -inplace */
90 case 6: inplace = 0; continue; /* -noinplace */
91 /* -help */
92 case 7: help("repl [+folder] [msg] [switches]",
93 switches);
94 goto leave;
95 }
96 if(*cp == '+') {
97 if(folder) {
98 fprintf(stderr, "Only one folder at a time.\n");
99 goto leave;
100 } else
101 folder = cp + 1;
102 } else if(msg) {
103 fprintf(stderr, "Only one message per reply.\n");
104 goto leave;
105 } else
106 msg = cp;
107 }
108 if(!msg)
109 msg = "cur";
110 if(!folder)
111 folder = m_getfolder();
112 maildir = m_maildir(folder);
113 if(chdir(maildir) < 0) {
114 fprintf(stderr, "Can't chdir to: ");
115 perror(maildir);
116 goto leave;
117 }
118 if(!(mp = m_gmsg(folder))) {
119 fprintf(stderr, "Can't read folder!?\n");
120 goto leave;
121 }
122 if(mp->hghmsg == 0) {
123 fprintf(stderr, "No messages in \"%s\".\n", folder);
124 goto leave;
125 }
126 if(!m_convert(msg))
127 goto leave;
128 if(mp->numsel == 0) {
129 fprintf(stderr, "repl: pepperoni pizza\n");/* never get here */
130 goto leave;
131 }
132 if(mp->numsel > 1) {
133 fprintf(stderr, "Only one message at a time.\n");
134 goto leave;
135 }
136 m_replace(pfolder, folder);
137 if(mp->lowsel != mp->curmsg)
138 m_setcur(mp->lowsel);
139 repl(getcpy(m_name(mp->lowsel)));
140 leave:
141 m_update();
142 done(0);
143 }
144
145
146 repl(msg)
147 {
148 register char *cp;
149 register int i,j;
150 register FILE *in;
151 char name[NAMESZ], field[BUFSIZ];
152 char *drft, *msgid, *replto, *from, *cc, *sub, *date, *to;
153 int state, out, status, intr;
154 int pid, wpid;
155 char **argp, *address;
156
157 if((in = fopen(msg, "r")) == NULL) {
158 fprintf(stderr, "Can't open "); perror(msg);
159 return;
160 }
161 drft = m_maildir(draft);
162 if((out = open(drft, 0)) >= 0) {
163 cp = concat("\"", drft, "\" exists; delete? ", 0);
164 while((i = gans(cp, anyl)) == 2)
165 showfile(drft);
166 if(!i)
167 return;
168 free(cp);
169 close(out);
170 }
171 if((out = creat(drft, m_gmprot())) < 0) {
172 fprintf(stderr, "Can't create \"%s\".\n", drft);
173 return;
174 }
175
176 state = FLD;
177 replto = msgid = to = from = cc = sub = date = 0;
178
179 for(;;) {
180
181 switch(state = m_getfld(state, name, field, sizeof field, in)) {
182
183 case FLD:
184 case FLDEOF:
185 case FLDPLUS:
186 if(uleq(name, "from"))
187 from = niceadd(field, from);
188 if(uleq(name, "cc"))
189 cc = niceadd(field, cc);
190 if(uleq(name, "subject"))
191 sub = niceadd(field, sub);
192 if(uleq(name, "date"))
193 date = niceadd(field, date);
194 if(uleq(name, "to"))
195 to = niceadd(field, to);
196 if(uleq(name, "message-id"))
197 msgid = niceadd(field, msgid);
198 if(uleq(name, "reply-to"))
199 replto = niceadd(field, replto);
200 /* if(uleq(name, "sender"))
201 sender = niceadd(field, sender); */
202 if(state == FLDEOF)
203 goto done;
204 break;
205
206 case BODY:
207 case BODYEOF:
208 case FILEEOF:
209 goto done;
210
211 default:
212 fprintf(stderr, "getfld returned %d\n", state);
213 return;
214 }
215
216 }
217
218 done:
219
220 /* if(!(address = addr(sender)))
221 if(!(address = addr(from)))
222 address = addr(replto);
223 */
224 /* if(!(address = addr(replto)))
225 address = addr(from);
226 */
227 address = replto ? addr(replto) : addr(from);
228 if(!ccme)
229 to = 0;
230 if(!(from || replto)) {
231 fprintf(stderr, "No one to reply to!!!\n");
232 return;
233 }
234 fclose(in);
235 type(out, "To: "); /* To: */
236 type(out, replto ? replto : from);
237 if(cc || to ) /* cc: */
238 type(out, "cc: ");
239 if(cc) {
240 if(address)
241 cc = fix(cc, address);
242 if(to)
243 rtrim(cc);
244 type(out, cc);
245 }
246 if(to) {
247 if(cc)
248 type(out, ",\n ");
249 if(address)
250 to = fix(to, address);
251 type(out, to);
252 }
253 if(sub) { /* Subject: Re: */
254 type(out, "Subject: ");
255 if(*sub == ' ') sub++;
256 if((sub[0] != 'R' && sub[0] != 'r') ||
257 (sub[1] != 'E' && sub[1] != 'e') ||
258 sub[2] != ':')
259 type(out, "Re: ");
260 type(out, sub);
261 } /* In-reply-to: */
262 if(date) {
263 type(out, "In-reply-to: Your message of ");
264 date[strlen(date)-1] = '.';
265 if(*date == ' ') date++;
266 type(out, date);
267 type(out, "\n");
268 if(msgid) {
269 type(out, " ");
270 if(*msgid == ' ') msgid++;
271 type(out, msgid);
272 }
273 }
274 type(out, "----------\n");
275 close(out);
276 if(m_edit(&ed, drft, NOUSE, msg) < 0)
277 return;
278 #ifdef TEST
279 fprintf(stderr, "!! Test Version of SEND Being Run !!\n");
280 fprintf(stderr, " Send verbose !\n\n");
281 #endif
282
283 for(;;) {
284 if(!(argp = getans("\nWhat now? ", aleqs))) {
285 unlink("@");
286 return;
287 }
288 switch(smatch(*argp, aleqs)) {
289 case 0: showfile(drft); /* list */
290 break;
291 case 1: if(*++argp) /* edit */
292 ed = *argp;
293 if(m_edit(&ed, drft, NOUSE, msg) == -1)
294 return;
295 break;
296 case 2: if(*++argp && *argp[0] == 'd') /* quit */
297 if(unlink(drft) == -1) {
298 fprintf(stderr, "Can't unlink %s ", drft);
299 perror("");
300 }
301 return;
302 case 3: if(*++argp) cp = *argp; else cp = ""; /* send */
303
304 if(!mp->msgflags&READONLY) { /* annotate first */
305 if(anot > 0) {
306 while((pid = fork()) == -1) sleep(5);
307 if(pid) {
308 while(wpid=wait((int *)NULL)!= -1 && wpid!= pid);
309 if(stat(drft, field) == -1)
310 annotate(msg, "Replied", "", inplace);
311 return;
312 }
313 }
314 }
315 if(!m_send(cp, drft))
316 return;
317 default:fprintf(stderr, "repl: illegal option\n"); /*##*/
318 break;
319 }
320 }
321 }