X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6bc64765f773ce75454ec1592a86779e3547fe46..9cc2510:/uip/whatnowsbr.c?ds=inline diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index 4a3c2647..2c2d2043 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -106,6 +106,7 @@ static void sendit (char *, char **, char *, int); static int buildfile (char **, char *); static int whomfile (char **, char *); static int removefile (char *); +static int checkmimeheader (char *); static void writelscmd(char *, int, char *, 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); @@ -129,6 +130,9 @@ WhatNow (int argc, char **argv) char *l; /* set on -l to alist command */ int n; /* set on -n to alist command */ + /* Need this if called from what_now(). */ + invo_name = r1bindex (argv[0], '/'); + arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -317,7 +321,9 @@ WhatNow (int argc, char **argv) writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - fgets(cwd, sizeof (cwd), f); + if (fgets(cwd, sizeof (cwd), f) == NULL) { + advise (buf, "fgets"); + } if (strchr(cwd, '\n') != (char *)0) *strchr(cwd, '\n') = '\0'; @@ -353,6 +359,9 @@ WhatNow (int argc, char **argv) * -n numbers listing */ + if (checkmimeheader(drft)) + break; + l = (char *)0; n = 0; @@ -390,6 +399,9 @@ WhatNow (int argc, char **argv) int verbose = 0; char **ap; + if (checkmimeheader(drft)) + break; + for (ap = argp+1; *ap; ++ap) { if (strcmp(*ap, "-v") == 0) { ++argp; @@ -460,6 +472,9 @@ WhatNow (int argc, char **argv) * so this catches a -n anywhere in the argument list. */ + if (checkmimeheader(drft)) + break; + for (n = 0, arguments = argp + 1; *arguments != (char *)0; arguments++) { if (strcmp(*arguments, "-n") == 0) { n = 1; @@ -648,7 +663,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, int slinked = 0; /* Was there a previous edit session? */ - if (reedit) { + if (reedit && (*ed || edsave)) { if (!*ed) { /* no explicit editor */ *ed = edsave; /* so use the previous one */ if ((cp = r1bindex (*ed, '/')) == NULL) @@ -678,7 +693,9 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, if (atfile) { (void) m_unlink (linkpath); if (link (altpath, linkpath) == NOTOK) { - symlink (altpath, linkpath); + if (symlink (altpath, linkpath) < 0) { + adios (linkpath, "symlink"); + } slinked = 1; } else { slinked = 0; @@ -696,8 +713,11 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, break; case OK: - if (cwd) - chdir (cwd); + if (cwd) { + if (chdir (cwd) < 0) { + advise (cwd, "chdir"); + } + } if (altmsg) { if (mp) m_putenv ("mhfolder", mp->foldpath); @@ -1265,3 +1285,45 @@ removefile (char *drft) return OK; } + + +/* + * Return 1 if we already have a MIME-Verson header, 0 otherwise. + */ + +static int +checkmimeheader (char *drft) +{ + FILE *f; + m_getfld_state_t gstate = 0; + char buf[BUFSIZ], name[NAMESZ]; + int state, retval = 0; + + if ((f = fopen(drft, "r")) == NULL) { + admonish(drft, "unable to read draft"); + return (0); + } + + for (;;) { + int bufsz = sizeof(buf); + switch (state = m_getfld(&gstate, name, buf, &bufsz, f)) { + case FLD: + case FLDPLUS: + if (strcasecmp(name, VRSN_FIELD) == 0) { + advise(NULL, "Cannot use attach commands with already-" + "formatted MIME message \"%s\"", drft); + retval = 1; + break; + } + continue; + default: + break; + } + break; + } + + m_getfld_state_destroy(&gstate); + fclose(f); + + return retval; +}