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