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