]> diplodocus.org Git - nmh/blobdiff - uip/whatnowsbr.c
Fixed typo in man page.
[nmh] / uip / whatnowsbr.c
index 774d130c7c7eeead1a4c1fce1eba30f114f494c3..303f1b8682c957af97576cdd54bf8ae70c4d2028 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);
@@ -232,9 +233,9 @@ WhatNow (int argc, char **argv)
     snprintf (prompt, sizeof(prompt), myprompt, invo_name);
     for (;;) {
 #ifdef READLINE_SUPPORT
-       if (!(argp = getans_via_readline (prompt, aleqs))) {
+       if (!(argp = read_switch_multiword_via_readline (prompt, aleqs))) {
 #else /* ! READLINE_SUPPORT */
-       if (!(argp = getans (prompt, aleqs))) {
+       if (!(argp = read_switch_multiword (prompt, aleqs))) {
 #endif /* READLINE_SUPPORT */
            (void) m_unlink (LINK);
            done (1);
@@ -320,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';
@@ -356,6 +359,9 @@ WhatNow (int argc, char **argv)
             *   -n     numbers listing
             */
 
+           if (checkmimeheader(drft))
+               break;
+
            l = (char *)0;
            n = 0;
 
@@ -393,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;
@@ -437,9 +446,6 @@ WhatNow (int argc, char **argv)
                    annotate(drft, ATTACH_FIELD, file, 1, 0, -2, 1);
                    if (verbose) {
                        ctype = mime_type(file);
-                   }
-
-                   if (verbose) {
                        printf ("Attaching %s as a %s\n", file, ctype);
                        free (ctype);
                    }
@@ -463,6 +469,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;
@@ -681,7 +690,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;
@@ -699,8 +710,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);
@@ -939,6 +953,7 @@ buildfile (char **argp, char *file)
     X("tls", TLSminc(-3), TLSSW) \
     X("initialtls", TLSminc(-10), INITTLSSW) \
     X("notls", TLSminc(-5), NTLSSW) \
+    X("sendmail program", 0, MTSSM) \
     X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \
     X("messageid localname|random", 2, MESSAGEIDSW) \
 
@@ -1128,6 +1143,7 @@ sendit (char *sp, char **arg, char *file, int pushed)
                case SASLMECHSW:
                case USERSW:
                case PORTSW:
+               case MTSSM:
                case MTSSW:
                case MESSAGEIDSW:
                    vec[vecp++] = --cp;
@@ -1239,10 +1255,10 @@ whomfile (char **arg, char *file)
 
        case OK:
            vec = argsplit(whomproc, &program, &vecp);
-           vec[vecp++] = file;
            if (arg)
                while (*arg)
                    vec[vecp++] = *arg++;
+           vec[vecp++] = file;
            vec[vecp] = NULL;
 
            execvp (program, vec);
@@ -1268,3 +1284,45 @@ removefile (char *drft)
 
     return OK;
 }
+
+
+/*
+ * Return 1 if we already have a MIME-Version 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;
+}