X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fwhatnow.c;h=7217096afe7a095598d5a5b6cf6ac5f738083e36;hp=efdf02d4b7176195df17488f47f8398e70205fbd;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=a8a894a102eb7f31662d49355312d6e64e081664 diff --git a/uip/whatnow.c b/uip/whatnow.c index efdf02d..7217096 100644 --- a/uip/whatnow.c +++ b/uip/whatnow.c @@ -45,13 +45,11 @@ static struct swit whatnowswitches[] = { #define EDITRSW 0 { "editor editor", 0 }, -#define NEDITSW 1 - { "noedit", 0 }, -#define PRMPTSW 2 +#define PRMPTSW 1 { "prompt string", 4 }, -#define VERSIONSW 3 - { "version", 0 }, -#define HELPSW 4 +#define VERSIONSW 2 + { "Version", 0 }, +#define HELPSW 3 { "help", 0 }, { NULL, 0 } }; @@ -95,7 +93,7 @@ static char *myprompt = "\nWhat now? "; ** static prototypes */ static int editfile(char **, char **, char *, int, struct msgs *, - char *, char *, int); + char *, char *); static int sendfile(char **, char *); static int refile(char **, char *); static int removefile(char *); @@ -113,7 +111,7 @@ static int copyf(char *, char *); int main(int argc, char **argv) { - int nedit = 0, use = 0; + int use = 0; char *cp; char *ed = NULL, *drft = NULL, *msgnam = NULL; char buf[BUFSIZ], prompt[BUFSIZ]; @@ -168,10 +166,6 @@ main(int argc, char **argv) if (!(ed = *argp++) || *ed == '-') adios(NULL, "missing argument to %s", argp[-2]); - nedit = 0; - continue; - case NEDITSW: - nedit++; continue; case PRMPTSW: @@ -196,15 +190,20 @@ main(int argc, char **argv) if ((cp = getenv("mhuse")) && *cp) use = atoi(cp); - if (!ed && (!(ed = getenv("mheditor")) || !*ed)) { - 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, use, NULL, msgnam, NULL) <0) { + if (!use) { + unlink(drft); + } + advise(NULL, "Try again."); + done(1); + } + } snprintf(prompt, sizeof(prompt), myprompt, invo_name); for (;;) { @@ -228,9 +227,7 @@ 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, NOUSE, NULL, msgnam, NULL); break; case LISTSW: @@ -574,13 +571,12 @@ 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) + char *altmsg, char *cwd) { int pid, status, vecp; char altpath[BUFSIZ], linkpath[BUFSIZ]; @@ -591,21 +587,22 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, 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 (!*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))) *ed = cp; + } else { + /* set initial editor */ + *ed = defaulteditor; } - } else if (!*ed) { - /* set initial editor */ - *ed = defaulteditor; } if (altmsg) { @@ -659,25 +656,30 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, vec[vecp] = NULL; execvp(*ed, vec); - fprintf(stderr, "unable to exec "); + fprintf(stderr, "%s: unable to exec ", invo_name); perror(*ed); _exit(-1); 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 = -1; + 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 && @@ -698,13 +700,13 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, #endif /* HAVE_LSTAT */ } - /* normally, we remember which editor we used */ - if (save_editor) - edsave = getcpy(*ed); + /* remember which editor we used */ + edsave = getcpy(*ed); *ed = NULL; - if (altmsg) + if (altmsg) { unlink(linkpath); + } return status; } @@ -767,7 +769,7 @@ sendfile(char **arg, char *file) vec[vecp] = NULL; execvp("send", vec); - fprintf(stderr, "unable to exec "); + fprintf(stderr, "%s: unable to exec ", invo_name); perror("send"); _exit(-1); @@ -810,7 +812,7 @@ refile(char **arg, char *file) case 0: execvp(*vec, vec); - fprintf(stderr, "unable to exec "); + fprintf(stderr, "%s: unable to exec ", invo_name); perror(*vec); _exit(-1);