X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fwhatnow.c;h=bbb468dafb768bc16a206519265174e23da3b6fb;hb=ccf4f175ef4c4e7522f9510a4a1149c15d810dd9;hp=0576ff84add95b4ca02d6e68690747f5bd2b05aa;hpb=412b2e54251ff6e20537f83b95c8ee76ea8c5c40;p=mmh diff --git a/uip/whatnow.c b/uip/whatnow.c index 0576ff8..bbb468d 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 - { "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 } }; @@ -70,23 +68,21 @@ static struct swit aleqs[] = { { "list", 0 }, #define SENDSW 4 { "send []", 0 }, -#define PUSHSW 5 - { "push []", 0 }, -#define QUITSW 6 +#define QUITSW 5 { "quit", 0 }, -#define DELETESW 7 +#define DELETESW 6 { "delete", 0 }, -#define CDCMDSW 8 +#define CDCMDSW 7 { "cd [directory]", 0 }, -#define PWDCMDSW 9 +#define PWDCMDSW 8 { "pwd", 0 }, -#define LSCMDSW 10 +#define LSCMDSW 9 { "ls", 0 }, -#define ATTACHCMDSW 11 +#define ATTACHCMDSW 10 { "attach", 0 }, -#define DETACHCMDSW 12 +#define DETACHCMDSW 11 { "detach [-n]", 0 }, -#define ALISTCMDSW 13 +#define ALISTCMDSW 12 { "alist", 0 }, { NULL, 0 } }; @@ -96,9 +92,8 @@ 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 *, int); +static int sendfile(char **, char *); static int refile(char **, char *); static int removefile(char *); static void writelscmd(char *, int, char **); @@ -107,17 +102,12 @@ 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 - - int main(int argc, char **argv) { - int nedit = 0, use = 0; + int use = 0; 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; @@ -127,10 +117,7 @@ main(int argc, char **argv) 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 */ @@ -170,10 +157,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: @@ -193,33 +176,35 @@ main(int argc, char **argv) if ((!drft && !(drft = getenv("mhdraft"))) || !*drft) drft = getcpy(m_draft(seq_cur)); - msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL; - 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) <0) { + if (!use) { + unlink(drft); + } + advise(NULL, "Try again."); + done(1); + } + } snprintf(prompt, sizeof(prompt), myprompt, invo_name); for (;;) { if (!(argp = getans(prompt, aleqs))) { - unlink(altmsglink); done(1); } switch (smatch(*argp, aleqs)) { case DISPSW: /* display the msg being replied to or distributed */ - if (msgnam) { + if ((cp = getenv("mhaltmsg")) && *cp) { snprintf(buf, sizeof buf, "%s '%s'", - listproc, msgnam); + listproc, cp); system(buf); } else { advise(NULL, "no alternate message to display"); @@ -230,9 +215,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); break; case LISTSW: @@ -253,15 +236,9 @@ main(int argc, char **argv) removefile(drft); done(1); - case PUSHSW: - /* Send draft in background */ - if (sendfile(++argp, drft, 1)) - done(1); - break; - case SENDSW: /* Send draft */ - sendfile(++argp, drft, 0); + sendfile(++argp, drft); break; case REFILEOPT: @@ -582,65 +559,34 @@ 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 use) { 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 (!*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 if (!*ed) { - /* set initial editor */ - *ed = defaulteditor; - } - - 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; + /* 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()) { @@ -650,14 +596,6 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, 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) @@ -667,92 +605,46 @@ 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 && - 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 = getcpy(*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 */ static int -sendfile(char **arg, char *file, int pushsw) +sendfile(char **arg, char *file) { pid_t child_id; int vecp; @@ -768,8 +660,6 @@ sendfile(char **arg, char *file, int pushsw) case OK: vecp = 0; vec[vecp++] = invo_name; - if (pushsw) - vec[vecp++] = "-push"; if (arg) while (*arg) vec[vecp++] = *arg++; @@ -777,7 +667,7 @@ sendfile(char **arg, char *file, int pushsw) vec[vecp] = NULL; execvp("send", vec); - fprintf(stderr, "unable to exec "); + fprintf(stderr, "%s: unable to exec ", invo_name); perror("send"); _exit(-1); @@ -820,7 +710,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);