Use execprog() instead of system() ... partly transition
[mmh] / uip / whatnow.c
index ead1bd5..ff9d84c 100644 (file)
@@ -4,36 +4,6 @@
 ** This code is Copyright (c) 2002, by the authors of nmh.  See the
 ** COPYRIGHT file in the root directory of the nmh distribution for
 ** complete copyright information.
-**
-**  The inclusion of attachments is eased by
-**  using the header field name mechanism added to anno and send.
-**  The header field name for attachments is predefined.
-**
-**  Several commands have been added at the whatnow prompt:
-**
-**        cd [ directory ]        This option works just like the shell's
-**                                cd command and lets the user change the
-**                                directory from which attachments are
-**                                taken so that long path names are not
-**                                needed with every file.
-**
-**        ls [ ls-options ]       This option works just like the normal
-**                                ls command and exists to allow the user
-**                                to verify file names in the directory.
-**
-**        pwd                     This option works just like the normal
-**                                pwd command and exists to allow the user
-**                                to verify the directory.
-**
-**        attach files            This option attaches the named files to
-**                                the draft.
-**
-**        alist                   This option lists the attachments on the
-**                                draft.
-**
-**        detach files            This option removes attachments from the
-**        detach -n numbers       draft.  This can be done by file name or
-**                                by attachment number.
 */
 
 #include <h/mh.h>
@@ -42,7 +12,7 @@
 #include <h/mime.h>
 #include <h/utils.h>
 
-static struct swit whatnowswitches[] = {
+static struct swit switches[] = {
 #define EDITRSW  0
        { "editor editor", 0 },
 #define PRMPTSW  1
@@ -59,31 +29,33 @@ static struct swit whatnowswitches[] = {
 */
 static struct swit aleqs[] = {
 #define EDITSW  0
-       { "edit [<editor> <switches>]", 0 },
-#define REFILEOPT  1
-       { "refile [<switches>] +folder", 0 },
+       { "edit [editor [switches]]", 0 },
+#define LISTSW  1
+       { "list", 0 },
 #define DISPSW  2
        { "display", 0 },
-#define LISTSW  3
-       { "list", 0 },
+#define WHOMSW  3
+       { "whom", 0 },
 #define SENDSW  4
-       { "send [<switches>]", 0 },
-#define QUITSW  5
-       { "quit", 0 },
+       { "send", 0 },
+#define REFILEOPT  5
+       { "refile +folder", 0 },
 #define DELETESW  6
        { "delete", 0 },
-#define CDCMDSW  7
+#define QUITSW  7
+       { "quit", 0 },
+#define CDCMDSW  8
        { "cd [directory]", 0 },
-#define PWDCMDSW  8
+#define PWDCMDSW  9
        { "pwd", 0 },
-#define LSCMDSW  9
+#define LSCMDSW  10
        { "ls", 0 },
-#define ATTACHCMDSW  10
-       { "attach", 0 },
-#define DETACHCMDSW  11
-       { "detach [-n]", 0 },
-#define ALISTCMDSW  12
+#define ALISTCMDSW  11
        { "alist", 0 },
+#define ATTACHCMDSW  12
+       { "attach files", 0 },
+#define DETACHCMDSW  13
+       { "detach numbers", 0 },
        { NULL, 0 }
 };
 
@@ -97,9 +69,9 @@ static int sendfile(char **, char *);
 static int refile(char **, char *);
 static int removefile(char *);
 static void writelscmd(char *, int, char **);
-static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp);
-static FILE* popen_in_dir(const char *dir, const char *cmd, const char *type);
-static int system_in_dir(const char *dir, const char *cmd);
+static void writesomecmd(char *, int, char *, char *, char **);
+static FILE* popen_in_dir(const char *, const char *, const char *);
+static int system_in_dir(const char *, const char *);
 
 
 int
@@ -115,12 +87,8 @@ main(int argc, char **argv)
        char file[MAXPATHLEN + 1];  /* file name buffer */
        char shell[MAXPATHLEN + 1];  /* shell response buffer */
        FILE *f;  /* read pointer for bgnd proc */
-       int n;  /* set on -n to detach command */
 
-#ifdef LOCALE
        setlocale(LC_ALL, "");
-#endif
-
        invo_name = mhbasename(argv[0]);
 
        /* read user profile/context */
@@ -139,9 +107,9 @@ main(int argc, char **argv)
 
        while ((cp = *argp++)) {
                if (*cp == '-') {
-                       switch (smatch(++cp, whatnowswitches)) {
+                       switch (smatch(++cp, switches)) {
                        case AMBIGSW:
-                               ambigsw(cp, whatnowswitches);
+                               ambigsw(cp, switches);
                                done(1);
                        case UNKWNSW:
                                adios(NULL, "-%s unknown", cp);
@@ -150,7 +118,7 @@ main(int argc, char **argv)
                                snprintf(buf, sizeof(buf),
                                                "%s [switches] [file]",
                                                invo_name);
-                               print_help(buf, whatnowswitches, 1);
+                               print_help(buf, switches, 1);
                                done(1);
                        case VERSIONSW:
                                print_version(invo_name);
@@ -206,9 +174,8 @@ main(int argc, char **argv)
                case DISPSW:
                        /* display the msg being replied to or distributed */
                        if ((cp = getenv("mhaltmsg")) && *cp) {
-                               snprintf(buf, sizeof buf, "%s '%s'",
-                                               listproc, cp);
-                               system(buf);
+                               execprogl(listproc, listproc, "-file", cp,
+                                               (char *)NULL);
                        } else {
                                advise(NULL, "no alternate message to display");
                        }
@@ -223,8 +190,8 @@ main(int argc, char **argv)
 
                case LISTSW:
                        /* display the draft file */
-                       snprintf(buf, sizeof buf, "%s '%s'", listproc, drft);
-                       system(buf);
+                       execprogl(listproc, listproc, "-file", drft,
+                                       (char *)NULL);
                        break;
 
                case QUITSW:
@@ -301,10 +268,9 @@ main(int argc, char **argv)
                        /*
                        ** List attachments on current draft.
                        */
-                       snprintf(buf, sizeof buf, "anno -list -comp '%s' "
-                                       "-number all -text IGNORE '%s'",
-                                       attach_hdr, drft);
-                       if (system(buf) != 0) {
+                       if (execprogl("anno", "anno", "-list", "-comp",
+                                       attach_hdr, "-number", drft,
+                                       (char *)NULL) != 0) {
                                advise(NULL, "Could not list attachment headers.");
                        }
                        break;
@@ -337,8 +303,6 @@ main(int argc, char **argv)
                        ** Add the attachment annotation to the draft.
                        */
                        if ((f = popen_in_dir(cwd, buf, "r"))) {
-                               char buf[BUFSIZ];
-
                                while (fgets(shell, sizeof(shell), f)) {
                                        *(strchr(shell, '\n')) = '\0';
 
@@ -348,13 +312,13 @@ main(int argc, char **argv)
                                                sprintf(file, "%s/%s", cwd,
                                                                shell);
                                        }
-                                       snprintf(buf, sizeof buf,
-                                                       "anno -nodate -append "
-                                                       "-comp '%s' -text '%s'"
-                                                       " '%s'",
-                                                       attach_hdr, file,
-                                                       drft);
-                                       if (system(buf) != 0) {
+                                       if (execprogl("anno", "anno",
+                                                       "-nodate",
+                                                       "-append", "-comp",
+                                                       attach_hdr, "-text",
+                                                       file, drft,
+                                                       (char *)NULL)
+                                                       != 0) {
                                                advise(NULL, "Could not add attachment header.");
                                        }
                                }
@@ -370,86 +334,42 @@ main(int argc, char **argv)
                        /*
                        ** Detach files from current draft.
                        **
-                       ** Scan the arguments for a -n.  Mixed file
-                       ** names and numbers aren't allowed, so this
-                       ** catches a -n anywhere in the argument list.
-                       */
-                       for (n = 0, arguments = argp + 1;
-                                       *arguments != NULL;
-                                       arguments++) {
-                               if (strcmp(*arguments, "-n") == 0) {
-                                               n = 1;
-                                               break;
-                               }
-                       }
-
-                       /*
-                       ** A -n was found so interpret the arguments as
+                       ** Interpret the arguments as
                        ** attachment numbers.  Decrement any remaining
                        ** argument number that is greater than the one
                        ** just processed after processing each one so
                        ** that the numbering stays correct.
                        */
-                       if (n == 1) {
-                               for (arguments=argp+1; *arguments;
-                                               arguments++) {
-                                       if (strcmp(*arguments, "-n") == 0)
-                                               continue;
-
-                                       if (**arguments != '\0') {
-                                               char buf[BUFSIZ];
-
-                                               n = atoi(*arguments);
-                                               snprintf(buf, sizeof buf, "anno -delete -comp '%s' -number '%d' '%s'", attach_hdr, n, drft);
-                                               if (system(buf) != 0) {
-                                                       advise(NULL, "Could not delete attachment header.");
-                                               }
+                       for (arguments=argp+1; *arguments; arguments++) {
+                               int n;
 
-                                               for (argp=arguments+1; *argp;
-                                                               argp++) {
-                                                       if (atoi(*argp) > n) {
-                                                               if (atoi(*argp) == 1)
-                                                                       *argp = "";
-                                                               else
-                                                                       sprintf(*argp, "%d", atoi(*argp) - 1);
-                                                       }
-                                               }
-                                       }
+                               if (**arguments == '\0') {
+                                       continue;
                                }
-                               break;
-                       }
-                       /* else */
 
-                       /*
-                       ** The arguments are interpreted as file names.
-                       ** Run them through the user's shell for wildcard
-                       ** expansion and other goodies.  Do this from
-                       ** the current working directory if the argument
-                       ** is not an absolute path name (does not begin
-                       ** with a /).
-                       **
-                       ** We feed all the file names to the shell at
-                       ** once, otherwise you can't provide a file name
-                       ** with a space in it.
-                       */
-                       writelscmd(buf, sizeof(buf), argp);
-                       if ((f = popen_in_dir(cwd, buf, "r"))) {
-                               while (fgets(shell, sizeof (shell), f)) {
-                                       *(strchr(shell, '\n')) = '\0';
-                                       snprintf(buf, sizeof buf,
-                                                       "anno -delete -comp "
-                                                       "'%s' -text '%s' '%s'",
-                                                       attach_hdr, shell,
-                                                       drft);
-                                       if (system(buf) != 0) {
-                                               advise(NULL, "Could not delete attachment header.");
+                               if (execprogl("anno", "anno", "-delete",
+                                               "-comp", attach_hdr,
+                                               "-number", *arguments, drft,
+                                               (char *)NULL) != 0) {
+                                       advise(NULL, "Could not delete attachment header.");
+                               }
+
+                               n = atoi(*arguments);
+                               for (argp=arguments+1; *argp; argp++) {
+                                       if (atoi(*argp) > n) {
+                                               if (atoi(*argp) == 1) {
+                                                       *argp = "";
+                                               } else {
+                                                       sprintf(*argp, "%d", atoi(*argp) - 1);
+                                               }
                                        }
                                }
-                               pclose(f);
-                       } else {
-                               advise("popen", "could not get file from shell");
                        }
+                       break;
 
+               case WHOMSW:
+                       /* list recipients */
+                       execprogl("whom", "whom", drft, (char *)NULL);
                        break;
 
                default:
@@ -662,7 +582,7 @@ sendfile(char **arg, char *file)
                /* fall */
        case OK:
                vecp = 0;
-               vec[vecp++] = invo_name;
+               vec[vecp++] = "send";
                if (arg)
                        while (*arg)
                                vec[vecp++] = *arg++;