]> diplodocus.org Git - nmh/blobdiff - uip/whatnowsbr.c
prevent spurious errors when requesting specific message parts
[nmh] / uip / whatnowsbr.c
index 4a3c2647e9a2974ebef9e085c05caf5a7182194d..2c2d2043bd5dfc508aa80e7f227e9bcfbfc62cd2 100644 (file)
@@ -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;
+}