X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fwhatnow.c;h=be046ac79f632fadc3dfb6838abab206988ed4c7;hp=afe4129333387549b9999f40f315c6443d577661;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=fb0594cb913cab5e14e2c295b79eb48cc675bbbf diff --git a/uip/whatnow.c b/uip/whatnow.c index afe4129..be046ac 100644 --- a/uip/whatnow.c +++ b/uip/whatnow.c @@ -4,37 +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 [-ln] This option lists the attachments on the -** draft. -l gets long listings, -n gets -** numbered listings. -** -** detach files This option removes attachments from the -** detach -n numbers draft. This can be done by file name or -** by attachment number. */ #include @@ -42,53 +11,61 @@ #include #include #include +#include +#include +#include +#include + +#ifdef HAVE_SYS_PARAM_H +# include +#endif -static struct swit whatnowswitches[] = { +static struct swit switches[] = { #define EDITRSW 0 { "editor editor", 0 }, -#define NEDITSW 1 - { "noedit", 0 }, -#define PRMPTSW 2 - { "prompt string", 4 }, -#define VERSIONSW 3 - { "version", 0 }, -#define HELPSW 4 +#define PRMPTSW 1 + { "prompt string", 0 }, +#define VERSIONSW 2 + { "Version", 0 }, +#define HELPSW 3 { "help", 0 }, { NULL, 0 } }; +char *version=VERSION; + /* ** Options at the "whatnow" prompt */ static struct swit aleqs[] = { #define EDITSW 0 - { "edit [ ]", 0 }, -#define REFILEOPT 1 - { "refile [] +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 []", 0 }, -#define PUSHSW 5 - { "push []", 0 }, -#define QUITSW 6 - { "quit", 0 }, -#define DELETESW 7 + { "send", 0 }, +#define REFILEOPT 5 + { "refile +folder", 0 }, +#define DELETESW 6 { "delete", 0 }, +#define QUITSW 7 + { "quit", 0 }, #define CDCMDSW 8 { "cd [directory]", 0 }, #define PWDCMDSW 9 { "pwd", 0 }, #define LSCMDSW 10 { "ls", 0 }, -#define ATTACHCMDSW 11 - { "attach", 0 }, -#define DETACHCMDSW 12 - { "detach [-n]", 2 }, -#define ALISTCMDSW 13 - { "alist [-ln] ", 2 }, +#define ALISTCMDSW 11 + { "alist", 0 }, +#define ATTACHCMDSW 12 + { "attach files", 0 }, +#define DETACHCMDSW 13 + { "detach numbers", 0 }, { NULL, 0 } }; @@ -97,27 +74,22 @@ static char *myprompt = "\nWhat now? "; /* ** static prototypes */ -static int editfile(char **, char **, char *, int, struct msgs *, - char *, char *, int); -static int sendfile(char **, char *, int); +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 nedit = 0, 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; @@ -125,13 +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 */ - char *l; /* set on -l to alist command */ - int n; /* set on -n to alist command */ -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif - invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -144,84 +111,77 @@ main(int argc, char **argv) ** Get the initial current working directory. */ - if (getcwd(cwd, sizeof (cwd)) == NULL) { - adios("getcwd", "could not get working directory"); + if (!getcwd(cwd, sizeof (cwd))) { + 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]); - nedit = 0; - continue; - case NEDITSW: - nedit++; 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 == NULL && (drft = getenv("mhdraft")) == NULL) || *drft == 0) - drft = getcpy(m_draft(seq_cur)); - - msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL; + if ((!drft && !(drft = getenv("mhdraft"))) || !*drft) + drft = mh_xstrdup(m_draft(seq_cur)); if ((cp = getenv("mhuse")) && *cp) use = atoi(cp); - if (ed == NULL && ((ed = getenv("mheditor")) == NULL || *ed == 0)) { - ed = NULL; - nedit++; + if (!ed && !(ed = getenv("mheditor"))) { + ed = ""; /* Don't initially edit the draft */ } - /* start editing the draft, unless -noedit was given */ - if (!nedit && editfile(&ed, NULL, drft, use, NULL, msgnam, NULL, 1) - < 0) - done(1); + /* start editing the draft, unless editor is the empty string */ + if (*ed) { + if (editfile(&ed, NULL, drft) <0) { + if (!use) { + unlink(drft); + } + 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'", - lproc, msgnam); - system(buf); + if ((cp = getenv("mhaltmsg")) && *cp) { + execprogl(listproc, listproc, "-file", cp, + (char *)NULL); } else { advise(NULL, "no alternate message to display"); } @@ -231,15 +191,13 @@ main(int argc, char **argv) /* Call an editor on the draft file */ if (*++argp) ed = *argp++; - if (editfile(&ed, argp, drft, NOUSE, NULL, - msgnam, NULL, 1) == NOTOK) - done(1); + editfile(&ed, argp, drft); break; case LISTSW: /* display the draft file */ - snprintf(buf, sizeof buf, "%s '%s'", lproc, drft); - system(buf); + execprogl(listproc, listproc, "-file", drft, + (char *)NULL); break; case QUITSW: @@ -247,28 +205,23 @@ 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); - - case PUSHSW: - /* Send draft in background */ - if (sendfile(++argp, drft, 1)) - done(1); - break; + exit(EX_OK); case SENDSW: /* Send draft */ - sendfile(++argp, drft, 0); + sendfile(++argp, drft); break; case REFILEOPT: /* Refile the draft */ - if (refile(++argp, drft) == 0) - done(0); + if (refile(++argp, drft) == 0) { + exit(EX_OK); + } break; case CDCMDSW: @@ -286,11 +239,11 @@ main(int argc, char **argv) } else { writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } - if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { + if ((f = popen_in_dir(cwd, buf, "r"))) { fgets(cwd, sizeof (cwd), f); - if (strchr(cwd, '\n') != NULL) - *strchr(cwd, '\n') = '\0'; + if (strchr(cwd, '\n')) + *strchr(cwd, '\n') = '\0'; pclose(f); } else { @@ -319,38 +272,13 @@ main(int argc, char **argv) case ALISTCMDSW: /* - ** List attachments on current draft. Options are: - ** - ** -l long listing (full path names) - ** -n numbers listing + ** List attachments on current draft. */ - - l = NULL; - n = 0; - - while (*++argp != NULL) { - if (strcmp(*argp, "-l") == 0) - l = "/"; - - else if (strcmp(*argp, "-n") == 0) - n = 1; - - else if (strcmp(*argp, "-ln") == 0 || - strcmp(*argp, "-nl") == 0) { - l = "/"; - n = 1; - } else { - n = -1; - break; - } + if (execprogl("anno", "anno", "-list", "-comp", + attach_hdr, "-number", drft, + (char *)NULL) != 0) { + advise(NULL, "Could not list attachment headers."); } - - if (n == -1) - advise(NULL, "usage is alist [-ln]."); - - else - annolist(drft, attach_hdr, l, n); - break; case ATTACHCMDSW: @@ -380,107 +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")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) - != NULL) { - *(strchr(shell, '\n')) = '\0'; - - if (*shell == '/') - annotate(drft, attach_hdr, - shell, 0, - -2, 1); - else { - sprintf(file, "%s/%s", cwd, - shell); - annotate(drft, attach_hdr, - file, 0, - -2, 1); - } - } - - pclose(f); - } else { + 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'; + + 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); 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. */ + for (arguments=argp+1; *arguments; arguments++) { + int n; - if (n == 1) { - for (arguments = argp + 1; - *arguments != NULL; - arguments++) { - if (strcmp(*arguments, "-n") == 0) - continue; - - if (**arguments != '\0') { - n = atoi(*arguments); - annotate(drft, attach_hdr, - NULL, 0, - n, 1); - - for (argp = arguments + 1; *argp != NULL; argp++) { - if (atoi(*argp) > n) { - if (atoi(*argp) == 1) - *argp = ""; - else - sprintf(*argp, "%d", atoi(*argp) - 1); - } - } - } + if (**arguments == '\0') { + continue; } - } - /* - ** 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")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) - != NULL) { - *(strchr(shell, '\n')) = '\0'; - annotate(drft, attach_hdr, shell, - 0, 0, 1); + 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: @@ -489,7 +380,8 @@ main(int argc, char **argv) break; } } - /*NOTREACHED*/ + + exit(EX_IOERR); } @@ -521,15 +413,15 @@ 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; - while (*++argp != NULL) { + while (*++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; @@ -563,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; } @@ -579,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; } @@ -593,216 +485,135 @@ popen_in_dir(const char *dir, const char *cmd, const char *type) ** EDIT */ -static int reedit = 0; /* have we been here before? */ 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, int save_editor) +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 */ - /* Was there a previous edit session? */ - if (reedit) { - if (!*ed) { /* no explicit editor */ - *ed = edsave; /* so use the previous one */ - if ((cp = mhbasename(*ed)) == NULL) + if (!*ed || !**ed) { + /* We have no explicit editor. */ + if (edsave) { + /* Use the previous editor ... */ + *ed = edsave; + if (!(cp = mhbasename(*ed))) cp = *ed; - /* unless we've specified it via "editor-next" */ + /* but prefer one specified via "editor-next" */ cp = concat(cp, "-next", NULL); - if ((cp = context_find(cp)) != NULL) + if ((cp = context_find(cp))) *ed = cp; - } - } else { - /* set initial editor */ - if (*ed == NULL && (*ed = context_find("editor")) == NULL) - *ed = defaulteditor; - } - - if (altmsg) { - if (mp == NULL || *altmsg == '/' || cwd == NULL) - strncpy(altpath, altmsg, sizeof(altpath)); - else - snprintf(altpath, sizeof(altpath), "%s/%s", - mp->foldpath, altmsg); - if (cwd == NULL) - strncpy(linkpath, altmsglink, sizeof(linkpath)); - else - snprintf(linkpath, sizeof(linkpath), "%s/%s", - cwd, altmsglink); - } - - if (altmsg) { - unlink(linkpath); -#ifdef HAVE_LSTAT - if (link(altpath, linkpath) == NOTOK) { - symlink(altpath, linkpath); - slinked = 1; } else { - slinked = 0; + /* set initial editor */ + *ed = defaulteditor; } -#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, "unable to exec "); + 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) - && (!reedit || (status & 0x00ff))) { - if (!use && (status & 0xff00) && (rename(file, cp = m_backup (file)) != NOTOK)) { - advise(NULL, "problems with edit--draft left in %s", cp); - } else { - advise(NULL, "problems with edit--%s preserved", file); - } + if ((status & 0xff00) == 0xff00) { + /* cmd not found or pidwait() failed */ + status = EX_SOFTWARE; + break; + } + if (status & 0x00ff) { + /* terminated by signal */ + advise(NULL, "%s terminated by signal %d", + *ed, status & 0x7f); + } else { + /* failure exit */ + advise(NULL, "%s exited with return code %d", + *ed, (status & 0xff00) >> 8); } - status = -2; /* maybe "reedit ? -2 : -1"? */ + status = -1; break; } - - reedit++; -#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 */ } - /* normally, we remember which editor we used */ - if (save_editor) - edsave = getcpy(*ed); + /* remember which editor we used */ + edsave = mh_xstrdup(*ed); *ed = NULL; - if (altmsg) - unlink(linkpath); return status; } -#ifdef HAVE_LSTAT +/* +** SEND +*/ + static int -copyf(char *ifile, char *ofile) +sendfile(char **arg, char *file) { - 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; - } + int vecp = 0; + char *vec[MAXARGS]; - while ((i = read(in, buffer, sizeof(buffer))) > OK) - if (write(out, buffer, i) != i) { - advise(ofile, "may have damaged"); - i = NOTOK; - break; - } + context_save(); + fflush(stdout); - close(in); - close(out); - return i; + 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); } -#endif /* HAVE_LSTAT */ /* -** SEND +** refile msg into another folder */ - static int -sendfile(char **arg, char *file, int pushsw) +refile(char **arg, char *file) { - pid_t child_id; - int i, vecp; + int vecp = 0; char *vec[MAXARGS]; - context_save(); /* save the context file */ - fflush(stdout); + vec[vecp++] = "refile"; + vec[vecp++] = "-nolink"; /* override bad .mh_profile defaults */ + vec[vecp++] = "-file"; + vec[vecp++] = file; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep(5); - switch (child_id) { - case NOTOK: - advise(NULL, "unable to fork, so sending directly..."); - /* fall */ - case OK: - vecp = 0; - vec[vecp++] = invo_name; - if (pushsw) - vec[vecp++] = "-push"; - if (arg) - while (*arg) - vec[vecp++] = *arg++; - vec[vecp++] = file; - vec[vecp] = NULL; + while (arg && *arg) { + vec[vecp++] = *arg++; + } + vec[vecp] = NULL; - execvp(sendproc, vec); - fprintf(stderr, "unable to exec "); - perror(sendproc); - _exit(-1); + context_save(); + fflush(stdout); - default: - if (pidwait(child_id, OK) == 0) - done(0); - return 1; - } + return execprog(*vec, vec); } @@ -814,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; }