X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/71458b3b2492943349f7693a46792756d5013c69..9cc2510:/uip/whatnowsbr.c diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index 005095a8..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,11 +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], '/'); - /* read user profile/context */ - context_read(); - arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -238,7 +237,7 @@ WhatNow (int argc, char **argv) #else /* ! READLINE_SUPPORT */ if (!(argp = getans (prompt, aleqs))) { #endif /* READLINE_SUPPORT */ - unlink (LINK); + (void) m_unlink (LINK); done (1); } switch (smatch (*argp, aleqs)) { @@ -322,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'; @@ -358,6 +359,9 @@ WhatNow (int argc, char **argv) * -n numbers listing */ + if (checkmimeheader(drft)) + break; + l = (char *)0; n = 0; @@ -395,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; @@ -465,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; @@ -653,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) @@ -681,9 +691,11 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, snprintf (linkpath, sizeof(linkpath), "%s/%s", cwd, LINK); if (atfile) { - unlink (linkpath); + (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; @@ -701,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); @@ -747,7 +762,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, && copyf (linkpath, altpath) == NOTOK : stat (linkpath, &st) != NOTOK && st.st_nlink == 1 - && (unlink (altpath) == NOTOK + && (m_unlink (altpath) == NOTOK || link (linkpath, altpath) == NOTOK))) advise (linkpath, "unable to update %s from", altmsg); } @@ -758,7 +773,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, *ed = NULL; if (altmsg && atfile) - unlink (linkpath); + (void) m_unlink (linkpath); return status; } @@ -1194,8 +1209,12 @@ sendit (char *sp, char **arg, char *file, int pushed) #endif /* not lint */ && altmsg) { vec[vecp++] = "-dist"; - distfile = getcpy (m_mktemp2(altmsg, invo_name, NULL, NULL)); - unlink(distfile); + if ((cp = m_mktemp2(altmsg, invo_name, NULL, NULL)) == NULL) { + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); + } + distfile = getcpy (cp); + (void) m_unlink(distfile); if (link (altmsg, distfile) == NOTOK) adios (distfile, "unable to link %s to", altmsg); } else { @@ -1261,8 +1280,50 @@ whomfile (char **arg, char *file) static int removefile (char *drft) { - if (unlink (drft) == NOTOK) + if (m_unlink (drft) == NOTOK) adios (drft, "unable to unlink"); 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; +}