Fix uip/whom.c for C89 compatibility
[mmh] / uip / whatnow.c
index 7217096..be046ac 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>
 #include <signal.h>
 #include <h/mime.h>
 #include <h/utils.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <locale.h>
+#include <sysexits.h>
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
 
-static struct swit whatnowswitches[] = {
+static struct swit switches[] = {
 #define EDITRSW  0
        { "editor editor", 0 },
 #define PRMPTSW  1
-       { "prompt string", 4 },
+       { "prompt string", 0 },
 #define VERSIONSW  2
        { "Version", 0 },
 #define HELPSW  3
@@ -54,36 +32,40 @@ static struct swit whatnowswitches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
+
 /*
 ** Options at the "whatnow" prompt
 */
 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 }
 };
 
@@ -92,28 +74,22 @@ static char *myprompt = "\nWhat now? ";
 /*
 ** static prototypes
 */
-static int editfile(char **, char **, char *, int, struct msgs *,
-       char *, char *);
+static int editfile(char **, char **, char *);
 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);
-
-
-#ifdef HAVE_LSTAT
-static int copyf(char *, char *);
-#endif
+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
 main(int argc, char **argv)
 {
-       int use = 0;
+       int use = NOUSE;
        char *cp;
-       char *ed = NULL, *drft = NULL, *msgnam = NULL;
+       char *ed = NULL, *drft = NULL;
        char buf[BUFSIZ], prompt[BUFSIZ];
        char **argp, **arguments;
        struct stat st;
@@ -121,12 +97,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 */
@@ -140,52 +112,50 @@ main(int argc, char **argv)
        */
 
        if (!getcwd(cwd, sizeof (cwd))) {
-               adios("getcwd", "could not get working directory");
+               adios(EX_USAGE, "getcwd", "could not get working directory");
        }
 
        while ((cp = *argp++)) {
                if (*cp == '-') {
-                       switch (smatch(++cp, whatnowswitches)) {
+                       switch (smatch(++cp, switches)) {
                        case AMBIGSW:
-                               ambigsw(cp, whatnowswitches);
-                               done(1);
+                               ambigsw(cp, switches);
+                               exit(EX_USAGE);
                        case UNKWNSW:
-                               adios(NULL, "-%s unknown", cp);
+                               adios(EX_USAGE, NULL, "-%s unknown", cp);
 
                        case HELPSW:
                                snprintf(buf, sizeof(buf),
                                                "%s [switches] [file]",
                                                invo_name);
-                               print_help(buf, whatnowswitches, 1);
-                               done(1);
+                               print_help(buf, switches, 1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
 
                        case EDITRSW:
                                if (!(ed = *argp++) || *ed == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                continue;
 
                        case PRMPTSW:
                                if (!(myprompt = *argp++) || *myprompt == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                continue;
 
                        }
                }
                if (drft)
-                       adios(NULL, "only one draft at a time!");
+                       adios(EX_USAGE, NULL, "only one draft at a time!");
                else
                        drft = cp;
        }
 
        if ((!drft && !(drft = getenv("mhdraft"))) || !*drft)
-               drft = getcpy(m_draft(seq_cur));
-
-       msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL;
+               drft = mh_xstrdup(m_draft(seq_cur));
 
        if ((cp = getenv("mhuse")) && *cp)
                use = atoi(cp);
@@ -196,28 +166,22 @@ main(int argc, char **argv)
 
        /* start editing the draft, unless editor is the empty string */
        if (*ed) {
-               if (editfile(&ed, NULL, drft, use, NULL, msgnam, NULL) <0) {
+               if (editfile(&ed, NULL, drft) <0) {
                        if (!use) {
                                unlink(drft);
                        }
-                       advise(NULL, "Try again.");
-                       done(1);
+                       adios(EX_SOFTWARE, NULL, "Try again.");
                }
        }
 
        snprintf(prompt, sizeof(prompt), myprompt, invo_name);
-       for (;;) {
-               if (!(argp = getans(prompt, aleqs))) {
-                       unlink(altmsglink);
-                       done(1);
-               }
+       while ((argp = getans(prompt, aleqs))) {
                switch (smatch(*argp, aleqs)) {
                case DISPSW:
                        /* display the msg being replied to or distributed */
-                       if (msgnam) {
-                               snprintf(buf, sizeof buf, "%s '%s'",
-                                               listproc, msgnam);
-                               system(buf);
+                       if ((cp = getenv("mhaltmsg")) && *cp) {
+                               execprogl(listproc, listproc, "-file", cp,
+                                               (char *)NULL);
                        } else {
                                advise(NULL, "no alternate message to display");
                        }
@@ -227,13 +191,13 @@ main(int argc, char **argv)
                        /* Call an editor on the draft file */
                        if (*++argp)
                                ed = *argp++;
-                       editfile(&ed, argp, drft, NOUSE, NULL, msgnam, NULL);
+                       editfile(&ed, argp, drft);
                        break;
 
                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:
@@ -241,12 +205,12 @@ main(int argc, char **argv)
                        if (stat(drft, &st) != NOTOK) {
                                advise(NULL, "draft left on %s", drft);
                        }
-                       done(1);
+                       exit(EX_OK);
 
                case DELETESW:
                        /* Delete draft and exit */
                        removefile(drft);
-                       done(1);
+                       exit(EX_OK);
 
                case SENDSW:
                        /* Send draft */
@@ -256,7 +220,7 @@ main(int argc, char **argv)
                case REFILEOPT:
                        /* Refile the draft */
                        if (refile(++argp, drft) == 0) {
-                               done(0);
+                               exit(EX_OK);
                        }
                        break;
 
@@ -310,10 +274,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;
@@ -345,120 +308,70 @@ main(int argc, char **argv)
                        ** working directory to relative path names.
                        ** Add the attachment annotation to the draft.
                        */
-                       if ((f = popen_in_dir(cwd, buf, "r"))) {
-                               char buf[BUFSIZ];
+                       if (!(f = popen_in_dir(cwd, buf, "r"))) {
+                               advise("popen", "could not get file from shell");
+                               break;
+                       }
 
-                               while (fgets(shell, sizeof(shell), f)) {
-                                       *(strchr(shell, '\n')) = '\0';
+                       while (fgets(shell, sizeof(shell), f)) {
+                               *(strchr(shell, '\n')) = '\0';
 
-                                       if (*shell == '/')
-                                               sprintf(file, "%s", shell);
-                                       else {
-                                               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) {
-                                               advise(NULL, "Could not add attachment header.");
-                                       }
+                               if (*shell == '/')
+                                       sprintf(file, "%s", shell);
+                               else {
+                                       sprintf(file, "%s/%s", cwd, shell);
+                               }
+                               if (execprogl("anno", "anno",
+                                               "-nodate", "-append",
+                                               "-comp", attach_hdr,
+                                               "-text", file,
+                                               drft, (char *)NULL) != 0) {
+                                       advise(NULL, "Could not add attachment header.");
                                }
-
-                               pclose(f);
-                       } else {
-                               advise("popen", "could not get file from shell");
                        }
-
+                       pclose(f);
                        break;
 
                case DETACHCMDSW:
                        /*
                        ** 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:
@@ -467,7 +380,8 @@ main(int argc, char **argv)
                        break;
                }
        }
-       /*NOTREACHED*/
+
+       exit(EX_IOERR);
 }
 
 
@@ -499,7 +413,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
        */
        int trailln = strlen(trailcmd) + 3;
        if (ln < 0 || ln + trailln > bufsz)
-               adios(NULL, "arguments too long");
+               adios(EX_USAGE, NULL, "arguments too long");
 
        cp = buf + ln;
 
@@ -507,7 +421,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
                ln = strlen(*argp);
                /* +1 for leading space */
                if (ln + trailln + 1 > bufsz - (cp-buf))
-                       adios(NULL, "arguments too long");
+                       adios(EX_USAGE, NULL, "arguments too long");
                *cp++ = ' ';
                memcpy(cp, *argp, ln+1);
                cp += ln;
@@ -541,12 +455,12 @@ system_in_dir(const char *dir, const char *cmd)
        char olddir[BUFSIZ];
        int r;
        if (getcwd(olddir, sizeof(olddir)) == 0)
-               adios("getcwd", "could not get working directory");
+               adios(EX_OSERR, "getcwd", "could not get working directory");
        if (chdir(dir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        r = system(cmd);
        if (chdir(olddir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        return r;
 }
 
@@ -557,12 +471,12 @@ popen_in_dir(const char *dir, const char *cmd, const char *type)
        char olddir[BUFSIZ];
        FILE *f;
        if (getcwd(olddir, sizeof(olddir)) == 0)
-               adios("getcwd", "could not get working directory");
+               adios(EX_OSERR, "getcwd", "could not get working directory");
        if (chdir(dir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        f = popen(cmd, type);
        if (chdir(olddir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        return f;
 }
 
@@ -575,17 +489,10 @@ static char *edsave = NULL;  /* the editor we used previously */
 
 
 static int
-editfile(char **ed, char **arg, char *file, int use, struct msgs *mp,
-       char *altmsg, char *cwd)
+editfile(char **ed, char **arg, char *file)
 {
        int pid, status, vecp;
-       char altpath[BUFSIZ], linkpath[BUFSIZ];
        char *cp, *vec[MAXARGS];
-       struct stat st;
-
-#ifdef HAVE_LSTAT
-       int slinked = 0;
-#endif /* HAVE_LSTAT */
 
        if (!*ed || !**ed) {
                /* We have no explicit editor. */
@@ -605,66 +512,34 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp,
                }
        }
 
-       if (altmsg) {
-               if (!mp || *altmsg == '/' || !cwd)
-                       strncpy(altpath, altmsg, sizeof(altpath));
-               else
-                       snprintf(altpath, sizeof(altpath), "%s/%s",
-                                       mp->foldpath, altmsg);
-               if (!cwd)
-                       strncpy(linkpath, altmsglink, sizeof(linkpath));
-               else
-                       snprintf(linkpath, sizeof(linkpath), "%s/%s",
-                                       cwd, altmsglink);
-               unlink(linkpath);
-#ifdef HAVE_LSTAT
-               if (link(altpath, linkpath) == NOTOK) {
-                       symlink(altpath, linkpath);
-                       slinked = 1;
-               } else {
-                       slinked = 0;
-               }
-#else /* not HAVE_LSTAT */
-               link(altpath, linkpath);
-#endif /* not HAVE_LSTAT */
-       }
-
-       context_save();  /* save the context file */
+       context_save();
        fflush(stdout);
 
        switch (pid = fork()) {
        case NOTOK:
                advise("fork", "unable to");
-               status = NOTOK;
+               status = EX_OSERR;
                break;
 
        case OK:
-               if (cwd)
-                       chdir(cwd);
-               if (altmsg) {
-                       if (mp)
-                               m_putenv("mhfolder", mp->foldpath);
-                       m_putenv("editalt", altpath);
-               }
-
                vecp = 0;
                vec[vecp++] = mhbasename(*ed);
-               if (arg)
-                       while (*arg)
-                               vec[vecp++] = *arg++;
+               while (arg && *arg) {
+                       vec[vecp++] = *arg++;
+               }
                vec[vecp++] = file;
                vec[vecp] = NULL;
 
                execvp(*ed, vec);
                fprintf(stderr, "%s: unable to exec ", invo_name);
                perror(*ed);
-               _exit(-1);
+               _exit(EX_OSERR);
 
        default:
                if ((status = pidwait(pid, NOTOK))) {
                        if ((status & 0xff00) == 0xff00) {
                                /* cmd not found or pidwait() failed */
-                               status = -1;
+                               status = EX_SOFTWARE;
                                break;
                        }
                        if (status & 0x00ff) {
@@ -679,68 +554,17 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp,
                        status = -1;
                        break;
                }
-
-#ifdef HAVE_LSTAT
-               if (altmsg && mp && !is_readonly(mp) && (slinked ?
-                               lstat (linkpath, &st) != NOTOK &&
-                               S_ISREG(st.st_mode) &&
-                               copyf(linkpath, altpath) == NOTOK :
-                               stat(linkpath, &st) != NOTOK &&
-                               st.st_nlink == 1 &&
-                               (unlink(altpath) == NOTOK ||
-                               link(linkpath, altpath) == NOTOK)))
-                       advise(linkpath, "unable to update %s from", altmsg);
-#else /* HAVE_LSTAT */
-               if (altmsg && mp && !is_readonly(mp) &&
-                               stat(linkpath, &st) != NOTOK &&
-                               st.st_nlink == 1 &&
-                               (unlink(altpath) == NOTOK ||
-                               link(linkpath, altpath) == NOTOK))
-                       advise(linkpath, "unable to update %s from", altmsg);
-#endif /* HAVE_LSTAT */
        }
 
        /* remember which editor we used */
-       edsave = getcpy(*ed);
+       edsave = mh_xstrdup(*ed);
 
        *ed = NULL;
-       if (altmsg) {
-               unlink(linkpath);
-       }
 
        return status;
 }
 
 
-#ifdef HAVE_LSTAT
-static int
-copyf(char *ifile, char *ofile)
-{
-       int i, in, out;
-       char buffer[BUFSIZ];
-
-       if ((in = open(ifile, O_RDONLY)) == NOTOK)
-               return NOTOK;
-       if ((out = open(ofile, O_WRONLY | O_TRUNC)) == NOTOK) {
-               admonish(ofile, "unable to open and truncate");
-               close(in);
-               return NOTOK;
-       }
-
-       while ((i = read(in, buffer, sizeof(buffer))) > OK)
-               if (write(out, buffer, i) != i) {
-                       advise(ofile, "may have damaged");
-                       i = NOTOK;
-                       break;
-               }
-
-       close(in);
-       close(out);
-       return i;
-}
-#endif /* HAVE_LSTAT */
-
-
 /*
 ** SEND
 */
@@ -748,36 +572,22 @@ copyf(char *ifile, char *ofile)
 static int
 sendfile(char **arg, char *file)
 {
-       pid_t child_id;
-       int vecp;
+       int vecp = 0;
        char *vec[MAXARGS];
 
-       context_save();  /* save the context file */
+       context_save();
        fflush(stdout);
 
-       switch (child_id = fork()) {
-       case NOTOK:
-               advise(NULL, "unable to fork, so sending directly...");
-               /* fall */
-       case OK:
-               vecp = 0;
-               vec[vecp++] = invo_name;
-               if (arg)
-                       while (*arg)
-                               vec[vecp++] = *arg++;
-               vec[vecp++] = file;
-               vec[vecp] = NULL;
-
-               execvp("send", vec);
-               fprintf(stderr, "%s: unable to exec ", invo_name);
-               perror("send");
-               _exit(-1);
-
-       default:
-               if (pidwait(child_id, OK) == 0)
-                       done(0);
-               return 1;
+       vec[vecp++] = "send";
+       while (arg && *arg) {
+               vec[vecp++] = *arg++;
        }
+       vec[vecp++] = file;
+       vec[vecp] = NULL;
+       execvp(*vec, vec);
+       fprintf(stderr, "%s: unable to exec ", invo_name);
+       perror("send");
+       _exit(EX_OSERR);
 }
 
 
@@ -787,11 +597,9 @@ sendfile(char **arg, char *file)
 static int
 refile(char **arg, char *file)
 {
-       pid_t pid;
-       register int vecp;
+       int vecp = 0;
        char *vec[MAXARGS];
 
-       vecp = 0;
        vec[vecp++] = "refile";
        vec[vecp++] = "-nolink";  /* override bad .mh_profile defaults */
        vec[vecp++] = "-file";
@@ -802,23 +610,10 @@ refile(char **arg, char *file)
        }
        vec[vecp] = NULL;
 
-       context_save();  /* save the context file */
+       context_save();
        fflush(stdout);
 
-       switch (pid = fork()) {
-       case -1:
-               advise("fork", "unable to");
-               return -1;
-
-       case 0:
-               execvp(*vec, vec);
-               fprintf(stderr, "%s: unable to exec ", invo_name);
-               perror(*vec);
-               _exit(-1);
-
-       default:
-               return (pidwait(pid, -1));
-       }
+       return execprog(*vec, vec);
 }
 
 
@@ -830,7 +625,7 @@ static int
 removefile(char *drft)
 {
        if (unlink(drft) == NOTOK)
-               adios(drft, "unable to unlink");
+               adios(EX_IOERR, drft, "unable to unlink");
 
        return OK;
 }