]> diplodocus.org Git - nmh/blob - uip/whatnowproc.c
6ed9fb7c9750392d4437215719f0f258e2a75b42
[nmh] / uip / whatnowproc.c
1 /*
2 * whatnowproc.c -- exec the "whatnowproc"
3 *
4 * This code is Copyright (c) 2002, by the authors of nmh. See the
5 * COPYRIGHT file in the root directory of the nmh distribution for
6 * complete copyright information.
7 */
8
9 #include <h/mh.h>
10
11
12 /*
13 * This routine is used by comp, repl, forw, and dist to exec
14 * the "whatnowproc". It first sets up all the environment
15 * variables that the "whatnowproc" will need to check, and
16 * then execs the command. As an optimization, if the
17 * "whatnowproc" is the nmh command "whatnow" (typical case),
18 * it will call this routine directly without exec'ing it.
19 */
20
21
22 int
23 what_now (char *ed, int nedit, int use, char *file, char *altmsg, int dist,
24 struct msgs *mp, char *text, int inplace, char *cwd, int atfile)
25 {
26 int found, k, msgnum, vecp;
27 int len, buflen;
28 char *bp;
29 char buffer[BUFSIZ], *vec[MAXARGS];
30
31 vecp = 0;
32 vec[vecp++] = r1bindex (whatnowproc, '/');
33 vec[vecp] = NULL;
34
35 m_putenv ("mhdraft", file);
36 if (mp)
37 m_putenv ("mhfolder", mp->foldpath);
38 else
39 unputenv ("mhfolder");
40 if (altmsg) {
41 if (mp == NULL || *altmsg == '/' || cwd == NULL)
42 m_putenv ("mhaltmsg", altmsg);
43 else {
44 snprintf (buffer, sizeof(buffer), "%s/%s", mp->foldpath, altmsg);
45 m_putenv ("mhaltmsg", buffer);
46 }
47 } else {
48 unputenv ("mhaltmsg");
49 }
50 if ((bp = getenv ("mhaltmsg")))/* XXX */
51 m_putenv ("editalt", bp);
52 snprintf (buffer, sizeof(buffer), "%d", dist);
53 m_putenv ("mhdist", buffer);
54 if (nedit) {
55 unputenv ("mheditor");
56 } else {
57 m_putenv ("mheditor", ed ? ed : (ed = get_default_editor()));
58 }
59 snprintf (buffer, sizeof(buffer), "%d", use);
60 m_putenv ("mhuse", buffer);
61 snprintf (buffer, sizeof(buffer), "%d", atfile);
62 m_putenv ("mhatfile", buffer);
63
64 unputenv ("mhmessages");
65 unputenv ("mhannotate");
66 unputenv ("mhinplace");
67
68 if (text && mp && !is_readonly(mp)) {
69 found = 0;
70 bp = buffer;
71 buflen = sizeof(buffer);
72 for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) {
73 if (is_selected(mp, msgnum)) {
74 snprintf (bp, buflen, "%s%s", found ? " " : "", m_name (msgnum));
75 len = strlen (bp);
76 bp += len;
77 buflen -= len;
78 for (k = msgnum + 1; k <= mp->hghmsg && is_selected(mp, k); k++)
79 continue;
80 if (--k > msgnum) {
81 snprintf (bp, buflen, "-%s", m_name (k));
82 len = strlen (bp);
83 bp += len;
84 buflen -= len;
85 }
86 msgnum = k + 1;
87 found++;
88 }
89 }
90 if (found) {
91 m_putenv ("mhmessages", buffer);
92 m_putenv ("mhannotate", text);
93 snprintf (buffer, sizeof(buffer), "%d", inplace);
94 m_putenv ("mhinplace", buffer);
95 }
96 }
97
98 context_save (); /* save the context file */
99 fflush (stdout);
100
101 if (cwd) {
102 if (chdir (cwd) < 0) {
103 advise (cwd, "chdir");
104 }
105 }
106
107 /*
108 * If the "whatnowproc" is the nmh command "whatnow",
109 * we run it internally, rather than exec'ing it.
110 */
111 if (strcmp (vec[0], "whatnow") == 0) {
112 WhatNow (vecp, vec);
113 done (0);
114 }
115
116 execvp (whatnowproc, vec);
117 fprintf (stderr, "unable to exec ");
118 perror (whatnowproc);
119
120 return 0;
121 }