|
|
1.1 root 1: /* show.c - list messages */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5:
6: /* */
7:
8: static struct swit switches[] = {
9: #define DRFTSW 0
10: "draft", 5,
11:
12: #define FORMSW 1
13: "form formfile", 4,
14: #define PROGSW 2
15: "moreproc program", 4,
16: #define NPROGSW 3
17: "nomoreproc", 3,
18: #define LENSW 4
19: "length lines", 4,
20: #define WIDSW 5
21: "width columns", 4,
22:
23: #define SHOWSW 6
24: "showproc program", 4,
25: #define NSHOWSW 7
26: "noshowproc", 3,
27:
28: #define HEADSW 8
29: "header", 4,
30: #define NHEADSW 9
31: "noheader", 3,
32:
33: #define FILESW 10
34: "file file", -4, /* interface from showfile */
35:
36: #define HELPSW 11
37: "help", 4,
38:
39: NULL, NULL
40: };
41:
42:
43: #define SHOW 0
44: #define NEXT 1
45: #define PREV 2
46:
47: /* */
48:
49: /* ARGSUSED */
50:
51: main (argc, argv)
52: int argc;
53: char **argv;
54: {
55: int draftsw = 0,
56: headersw = 1,
57: nshow = 0,
58: msgp = 0,
59: vecp = 1,
60: procp = 1,
61: isdf = 0,
62: mode = SHOW,
63: msgnum;
64: char *cp,
65: *maildir,
66: *file = NULL,
67: *folder = NULL,
68: *proc,
69: buf[100],
70: **ap,
71: **argp,
72: *arguments[MAXARGS],
73: *msgs[MAXARGS],
74: *vec[MAXARGS];
75: struct msgs *mp;
76:
77: invo_name = r1bindex (argv[0], '/');
78: if (uleq (invo_name, "next"))
79: mode = NEXT;
80: else
81: if (uleq (invo_name, "prev"))
82: mode = PREV;
83: if ((cp = m_find (invo_name)) != NULL) {
84: ap = brkstring (cp = getcpy (cp), " ", "\n");
85: ap = copyip (ap, arguments);
86: }
87: else
88: ap = arguments;
89: (void) copyip (argv + 1, ap);
90: argp = arguments;
91:
92: /* */
93:
94: while (cp = *argp++) {
95: if (*cp == '-')
96: switch (smatch (++cp, switches)) {
97: case AMBIGSW:
98: ambigsw (cp, switches);
99: done (1);
100: case UNKWNSW:
101: case NPROGSW:
102: vec[vecp++] = --cp;
103: continue;
104: case HELPSW:
105: (void) sprintf (buf,
106: "%s [+folder] %s[switches] [switches for showproc]",
107: invo_name, mode == SHOW ? "[msgs] ": "");
108: help (buf, switches);
109: done (1);
110:
111: case DRFTSW:
112: if (file)
113: adios (NULLCP, "only one file at a time!");
114: draftsw++;
115: if (mode == SHOW)
116: continue;
117: usage: ;
118: adios (NULLCP,
119: "usage: %s [+folder] [switches] [switches for showproc]",
120: invo_name);
121: case FILESW:
122: if (mode != SHOW)
123: goto usage;
124: if (draftsw || file)
125: adios (NULLCP, "only one file at a time!");
126: if (!(cp = *argp++) || *cp == '-')
127: adios (NULLCP, "missing argument to %s", argp[-2]);
128: file = path (cp, TFILE);
129: continue;
130:
131: case HEADSW:
132: headersw++;
133: continue;
134: case NHEADSW:
135: headersw = 0;
136: continue;
137:
138: case FORMSW:
139: case PROGSW:
140: case LENSW:
141: case WIDSW:
142: vec[vecp++] = --cp;
143: if (!(cp = *argp++) || *cp == '-')
144: adios (NULLCP, "missing argument to %s", argp[-2]);
145: vec[vecp++] = cp;
146: continue;
147:
148: case SHOWSW:
149: if (!(showproc = *argp++) || *showproc == '-')
150: adios (NULLCP, "missing argument to %s", argp[-2]);
151: nshow = 0;
152: continue;
153: case NSHOWSW:
154: nshow++;
155: continue;
156: }
157: if (*cp == '+' || *cp == '@') {
158: if (folder)
159: adios (NULLCP, "only one folder at a time!");
160: else
161: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
162: }
163: else
164: if (mode != SHOW)
165: goto usage;
166: else
167: msgs[msgp++] = cp;
168: }
169: procp = vecp;
170:
171: /* */
172:
173: if (!m_find ("path"))
174: free (path ("./", TFOLDER));
175:
176: if (draftsw || file) {
177: if (msgp > 1)
178: adios (NULLCP, "only one file at a time!");
179: vec[vecp++] = draftsw
180: ? getcpy (m_draft (folder, msgp ? msgs[0] : NULL, 1, &isdf))
181: : file;
182: goto go_to_it;
183: }
184:
185: #ifdef WHATNOW
186: if (!msgp && mode == SHOW && (cp = getenv ("mhdraft")) && *cp) {
187: vec[vecp++] = cp;
188: goto go_to_it;
189: }
190: #endif WHATNOW
191:
192: if (!msgp)
193: msgs[msgp++] = mode == NEXT ? "next" : mode == PREV ? "prev" : "cur";
194: if (!folder)
195: folder = m_getfolder ();
196: maildir = m_maildir (folder);
197:
198: if (chdir (maildir) == NOTOK)
199: adios (maildir, "unable to change directory to");
200: if (!(mp = m_gmsg (folder)))
201: adios (NULLCP, "unable to read folder %s", folder);
202: if (mp -> hghmsg == 0)
203: adios (NULLCP, "no messages in %s", folder);
204:
205: for (msgnum = 0; msgnum < msgp; msgnum++)
206: if (!m_convert (mp, msgs[msgnum]))
207: done (1);
208: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
209: if (mp -> msgstats[msgnum] & SELECTED)
210: mp -> msgstats[msgnum] |= UNSEEN;
211: m_setseq (mp);
212: m_setvis (mp, 1);
213:
214: if (mp -> numsel > MAXARGS - 2)
215: adios (NULLCP, "more than %d messages for show exec", MAXARGS - 2);
216: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
217: if (mp -> msgstats[msgnum] & SELECTED)
218: vec[vecp++] = getcpy (m_name (msgnum));
219:
220: m_replace (pfolder, folder);
221: if (mp -> hghsel != mp -> curmsg)
222: m_setcur (mp, mp -> hghsel);
223: m_sync (mp);
224: m_update ();
225:
226: if (vecp == 2 && headersw)
227: printf ("(Message %s:%s)\n", folder, vec[1]);
228:
229: /* */
230:
231: go_to_it: ;
232: (void) fflush (stdout);
233:
234: if (nshow)
235: proc = "/bin/cat";
236: else {
237: (void) putenv ("mhfolder", folder);
238: if (strcmp (r1bindex (showproc, '/'), "mhl") == 0) {
239: vec[0] = "mhl";
240: (void) mhl (vecp, vec);
241: done (0);
242: }
243: proc = showproc;
244: }
245:
246: if (!draftsw
247: && chdir (maildir = concat (m_maildir (""), "/", NULLCP))
248: != NOTOK) {
249: mp -> foldpath = concat (mp -> foldpath, "/", NULLCP);
250: cp = ssequal (maildir, mp -> foldpath)
251: ? mp -> foldpath + strlen (maildir)
252: : mp -> foldpath;
253: for (msgnum = procp; msgnum < vecp; msgnum++)
254: vec[msgnum] = concat (cp, vec[msgnum], NULLCP);
255: }
256:
257: vec[0] = r1bindex (proc, '/');
258: execvp (proc, vec);
259: adios (proc, "unable to exec");
260: }
261:
262: /* */
263:
264: /* Cheat: we are loaded with adrparse, which wants a routine called
265: OfficialName(). We call adrparse:getm() with the correct arguments
266: to prevent OfficialName() from being called. Hence, the following
267: is to keep the loader happy.
268: */
269:
270: char *OfficialName (name)
271: register char *name;
272: {
273: return name;
274: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.