|
|
1.1 root 1: /* dist.c - re-distribute a message */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include <sys/types.h>
6: #include <sys/stat.h>
7:
8: /* */
9:
10: static struct swit switches[] = {
11: #define ANNOSW 0
12: "annotate", 0,
13: #define NANNOSW 1
14: "noannotate", 0,
15:
16: #define DFOLDSW 2
17: "draftfolder +folder", 0,
18: #define DMSGSW 3
19: "draftmessage msg", 0,
20: #define NDFLDSW 4
21: "nodraftfolder", 0,
22:
23: #define EDITRSW 5
24: "editor editor", 0,
25: #define NEDITSW 6
26: "noedit", 0,
27:
28: #define FORMSW 7
29: "form formfile", 0,
30:
31: #define INPLSW 8
32: "inplace", 0,
33: #define NINPLSW 9
34: "noinplace", 0,
35:
36: #define WHATSW 10
37: "whatnowproc program", 0,
38: #define NWHATSW 11
39: "nowhatnowproc", 0,
40:
41: #define HELPSW 12
42: "help", 4,
43:
44: #define FILESW 13
45: "file file", -4, /* interface from msh */
46:
47: NULL, NULL
48: };
49:
50: /* */
51:
52: static struct swit aqrnl[] = {
53: #define NOSW 0
54: "quit", 0,
55: #define YESW 1
56: "replace", 0,
57: #define LISTDSW 2
58: "list", 0,
59: #define REFILSW 3
60: "refile +folder", 0,
61: #define NEWSW 4
62: "new", 0,
63:
64: NULL, NULL
65: };
66:
67:
68: static struct swit aqrl[] = {
69: "quit", 0,
70: "replace", 0,
71: "list", 0,
72: "refile +folder", 0,
73:
74: NULL, NULL
75: };
76:
77: /* */
78:
79: /* ARGSUSED */
80:
81: main (argc, argv)
82: int argc;
83: char *argv[];
84: {
85: int anot = 0,
86: inplace = 0,
87: nedit = 0,
88: nwhat = 0,
89: i,
90: in,
91: isdf = 0,
92: out;
93: char *cp,
94: *cwd,
95: *maildir,
96: *msgnam,
97: *dfolder = NULL,
98: *dmsg = NULL,
99: *ed = NULL,
100: *file = NULL,
101: *folder = NULL,
102: *form = NULL,
103: *msg = NULL,
104: buf[100],
105: drft[BUFSIZ],
106: **ap,
107: **argp,
108: *arguments[MAXARGS];
109: struct msgs *mp = NULL;
110: struct stat st;
111:
112: invo_name = r1bindex (argv[0], '/');
113: if ((cp = m_find (invo_name)) != NULL) {
114: ap = brkstring (cp = getcpy (cp), " ", "\n");
115: ap = copyip (ap, arguments);
116: }
117: else
118: ap = arguments;
119: (void) copyip (argv + 1, ap);
120: argp = arguments;
121:
122: /* */
123:
124: while (cp = *argp++) {
125: if (*cp == '-')
126: switch (smatch (++cp, switches)) {
127: case AMBIGSW:
128: ambigsw (cp, switches);
129: done (1);
130: case UNKWNSW:
131: adios (NULLCP, "-%s unknown", cp);
132: case HELPSW:
133: (void) sprintf (buf, "%s [+folder] [msg] [switches]",
134: invo_name);
135: help (buf, switches);
136: done (1);
137:
138: case ANNOSW:
139: anot++;
140: continue;
141: case NANNOSW:
142: anot = 0;
143: continue;
144:
145: case EDITRSW:
146: if (!(ed = *argp++) || *ed == '-')
147: adios (NULLCP, "missing argument to %s", argp[-2]);
148: nedit = 0;
149: continue;
150: case NEDITSW:
151: nedit++;
152: continue;
153:
154: case WHATSW:
155: if (!(whatnowproc = *argp++) || *whatnowproc == '-')
156: adios (NULLCP, "missing argument to %s", argp[-2]);
157: nwhat = 0;
158: continue;
159: case NWHATSW:
160: nwhat++;
161: continue;
162:
163: case FILESW:
164: if (file)
165: adios (NULLCP, "only one file at a time!");
166: if (!(cp = *argp++) || *cp == '-')
167: adios (NULLCP, "missing argument to %s", argp[-2]);
168: file = path (cp, TFILE);
169: continue;
170: case FORMSW:
171: if (!(form = *argp++) || *form == '-')
172: adios (NULLCP, "missing argument to %s", argp[-2]);
173: continue;
174:
175: case INPLSW:
176: inplace++;
177: continue;
178: case NINPLSW:
179: inplace = 0;
180: continue;
181:
182: case DFOLDSW:
183: if (dfolder)
184: adios (NULLCP, "only one draft folder at a time!");
185: if (!(cp = *argp++) || *cp == '-')
186: adios (NULLCP, "missing argument to %s", argp[-2]);
187: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
188: *cp != '@' ? TFOLDER : TSUBCWF);
189: continue;
190: case DMSGSW:
191: if (dmsg)
192: adios (NULLCP, "only one draft message at a time!");
193: if (!(dmsg = *argp++) || *dmsg == '-')
194: adios (NULLCP, "missing argument to %s", argp[-2]);
195: continue;
196: case NDFLDSW:
197: dfolder = NULL;
198: isdf = NOTOK;
199: continue;
200: }
201: if (*cp == '+' || *cp == '@') {
202: if (folder)
203: adios (NULLCP, "only one folder at a time!");
204: else
205: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
206: }
207: else
208: if (msg)
209: adios (NULLCP, "only one message at a time!");
210: else
211: msg = cp;
212: }
213:
214: /* */
215:
216: cwd = getcpy (pwd ());
217:
218: if (!m_find ("path"))
219: free (path ("./", TFOLDER));
220: if (file && (msg || folder))
221: adios (NULLCP, "can't mix files and folders/msgs");
222:
223: if (form) {
224: if ((in = open (libpath (form), 0)) == NOTOK)
225: adios (form, "unable to open form file");
226: }
227: else {
228: if ((in = open (libpath (distcomps), 0)) == NOTOK)
229: adios (distcomps, "unable to open default components file");
230: form = distcomps;
231: }
232:
233: try_it_again: ;
234: (void) strcpy (drft, m_draft (dfolder, dmsg, NOUSE, &isdf));
235: if (stat (drft, &st) != NOTOK) {
236: printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size);
237: for (i = LISTDSW; i != YESW;) {
238: if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl)))
239: done (1);
240: switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) {
241: case NOSW:
242: done (0);
243: case NEWSW:
244: dmsg = NULL;
245: goto try_it_again;
246: case YESW:
247: break;
248: case LISTDSW:
249: (void) showfile (++argp, drft);
250: break;
251: case REFILSW:
252: if (refile (++argp, drft) == 0)
253: i = YESW;
254: break;
255: default:
256: advise (NULLCP, "say what?");
257: break;
258: }
259: }
260: }
261: if ((out = creat (drft, m_gmprot ())) == NOTOK)
262: adios (drft, "unable to create");
263:
264: cpydata (in, out, form, drft);
265: (void) close (in);
266: (void) close (out);
267:
268: /* */
269:
270: if (file) {
271: anot = 0;
272: goto go_to_it;
273: }
274:
275: if (!msg)
276: msg = "cur";
277: if (!folder)
278: folder = m_getfolder ();
279: maildir = m_maildir (folder);
280:
281: if (chdir (maildir) == NOTOK)
282: adios (maildir, "unable to change directory to");
283: if (!(mp = m_gmsg (folder)))
284: adios (NULLCP, "unable to read folder %s", folder);
285: if (mp -> hghmsg == 0)
286: adios (NULLCP, "no messages in %s", folder);
287:
288: if (!m_convert (mp, msg))
289: done (1);
290: m_setseq (mp);
291:
292: if (mp -> numsel > 1)
293: adios (NULLCP, "only one message at a time!");
294:
295: go_to_it: ;
296: if ((in = open (msgnam = file ? file : getcpy (m_name (mp -> lowsel)), 0))
297: == NOTOK)
298: adios (msgnam, "unable to open message");
299:
300: if (!file) {
301: m_replace (pfolder, folder);
302: if (mp -> lowsel != mp -> curmsg)
303: m_setcur (mp, mp -> lowsel);
304: m_sync (mp);
305: m_update ();
306: }
307:
308: if (nwhat)
309: done (0);
310: (void) m_whatnow (ed, nedit, NOUSE, drft, msgnam, 1, mp,
311: anot ? "Resent" : NULLCP, inplace, cwd);
312: done (1);
313: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.