Activated Jon's attachment system by default and steamlined it.
[mmh] / uip / whatnowsbr.c
index aefe67f..d07c37e 100644 (file)
@@ -5,9 +5,9 @@
 ** COPYRIGHT file in the root directory of the nmh distribution for
 ** complete copyright information.
 **
-**  Several options have been added to ease the inclusion of attachments
-**  using the header field name mechanism added to anno and send.  The
-**  -attach option is used to specify the header field name for attachments.
+**  The inclusion of attachments is eased by
+**  using the header field name mechanism added to anno and send.
+**  The header field name for attachments is predefined.
 **
 **  Several commands have been added at the whatnow prompt:
 **
@@ -54,8 +54,6 @@ static struct swit whatnowswitches[] = {
        { "version", 0 },
 #define HELPSW  4
        { "help", 0 },
-#define ATTACHSW  5
-       { "attach header-field-name", 0 },
        { NULL, 0 }
 };
 
@@ -128,7 +126,6 @@ WhatNow(int argc, char **argv)
        char buf[BUFSIZ], prompt[BUFSIZ];
        char **argp, **arguments;
        struct stat st;
-       char *attach = NULL;  /* attachment header field name */
        char cwd[MAXPATHLEN + 1];  /* current working directory */
        char file[MAXPATHLEN + 1];  /* file name buffer */
        char shell[MAXPATHLEN + 1];  /* shell response buffer */
@@ -187,13 +184,6 @@ WhatNow(int argc, char **argv)
                                                        argp[-2]);
                                continue;
 
-                       case ATTACHSW:
-                               if (attach != NULL)
-                                       adios(NULL, "only one attachment header field name at a time!");
-                               if (!(attach = *argp++) || *attach == '-')
-                                       adios(NULL, "missing argument to %s",
-                                                       argp[-2]);
-                               continue;
                        }
                }
                if (drft)
@@ -203,7 +193,7 @@ WhatNow(int argc, char **argv)
        }
 
        if ((drft == NULL && (drft = getenv("mhdraft")) == NULL) || *drft == 0)
-               drft = getcpy(m_draft("cur"));
+               drft = getcpy(m_draft(seq_cur));
 
        msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL;
 
@@ -344,11 +334,6 @@ WhatNow(int argc, char **argv)
                        ** -n    numbers listing
                        */
 
-                       if (attach == NULL) {
-                               advise(NULL, "can't list because no header field name was given.");
-                               break;
-                       }
-
                        l = NULL;
                        n = 0;
 
@@ -373,7 +358,7 @@ WhatNow(int argc, char **argv)
                                advise(NULL, "usage is alist [-ln].");
 
                        else
-                               annolist(drft, attach, l, n);
+                               annolist(drft, attach_hdr, l, n);
 
                        break;
 
@@ -382,11 +367,6 @@ WhatNow(int argc, char **argv)
                        ** Attach files to current draft.
                        */
 
-                       if (attach == NULL) {
-                               advise(NULL, "can't attach because no header field name was given.");
-                               break;
-                       }
-
                        if (*(argp+1) == NULL) {
                                advise(NULL, "attach command requires file argument(s).");
                                break;
@@ -416,13 +396,15 @@ WhatNow(int argc, char **argv)
                                        *(strchr(shell, '\n')) = '\0';
 
                                        if (*shell == '/')
-                                               annotate(drft, attach, shell,
-                                                               1, 0, -2, 1);
+                                               annotate(drft, attach_hdr,
+                                                               shell, 1, 0,
+                                                               -2, 1);
                                        else {
                                                sprintf(file, "%s/%s", cwd,
                                                                shell);
-                                               annotate(drft, attach, file,
-                                                               1, 0, -2, 1);
+                                               annotate(drft, attach_hdr,
+                                                               file, 1, 0,
+                                                               -2, 1);
                                        }
                                }
 
@@ -436,14 +418,7 @@ WhatNow(int argc, char **argv)
                case DETACHCMDSW:
                        /*
                        ** Detach files from current draft.
-                       */
-
-                       if (attach == NULL) {
-                               advise(NULL, "can't detach because no header field name was given.");
-                               break;
-                       }
-
-                       /*
+                       **
                        ** Scan the arguments for a -n.  Mixed file
                        ** names and numbers aren't allowed, so this
                        ** catches a -n anywhere in the argument list.
@@ -475,8 +450,9 @@ WhatNow(int argc, char **argv)
 
                                        if (**arguments != '\0') {
                                                n = atoi(*arguments);
-                                               annotate(drft, attach, NULL,
-                                                               1, 0, n, 1);
+                                               annotate(drft, attach_hdr,
+                                                               NULL, 1, 0,
+                                                               n, 1);
 
                                                for (argp = arguments + 1; *argp != NULL; argp++) {
                                                        if (atoi(*argp) > n) {
@@ -507,7 +483,7 @@ WhatNow(int argc, char **argv)
                                while (fgets(shell, sizeof (shell), f)
                                                != NULL) {
                                        *(strchr(shell, '\n')) = '\0';
-                                       annotate(drft, attach, shell,
+                                       annotate(drft, attach_hdr, shell,
                                                        1, 0, 0, 1);
                                }
                                pclose(f);
@@ -703,77 +679,75 @@ editfile(char **ed, char **arg, char *file, int use, struct msgs *mp,
        context_save();  /* save the context file */
        fflush(stdout);
 
-       switch (pid = vfork()) {
-               case NOTOK:
-                       advise("fork", "unable to");
-                       status = NOTOK;
-                       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)
-                               while (*arg)
-                                       vec[vecp++] = *arg++;
-                       vec[vecp++] = file;
-                       vec[vecp] = NULL;
-
-                       execvp(*ed, vec);
-                       fprintf(stderr, "unable to exec ");
-                       perror(*ed);
-                       _exit(-1);
+       switch (pid = fork()) {
+       case NOTOK:
+               advise("fork", "unable to");
+               status = NOTOK;
+               break;
+
+       case OK:
+               if (cwd)
+                       chdir(cwd);
+               if (altmsg) {
+                       if (mp)
+                               m_putenv("mhfolder", mp->foldpath);
+                       m_putenv("editalt", altpath);
+               }
 
-               default:
-                       if ((status = pidwait(pid, NOTOK))) {
+               vecp = 0;
+               vec[vecp++] = mhbasename(*ed);
+               if (arg)
+                       while (*arg)
+                               vec[vecp++] = *arg++;
+               vec[vecp++] = file;
+               vec[vecp] = NULL;
+
+               execvp(*ed, vec);
+               fprintf(stderr, "unable to exec ");
+               perror(*ed);
+               _exit(-1);
+
+       default:
+               if ((status = pidwait(pid, NOTOK))) {
 #ifdef ATTVIBUG
-                               if ((cp = mhbasename(*ed)) &&
-                                               strcmp(cp, "vi") == 0 &&
-                                               (status & 0x00ff) == 0)
-                                       status = 0;
-                               else {
+                       if ((cp = mhbasename(*ed)) && strcmp(cp, "vi") == 0 &&
+                                       (status & 0x00ff) == 0)
+                               status = 0;
+                       else {
 #endif
-                               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)
+                               && (!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);
                                }
-                               status = -2;  /* maybe "reedit ? -2 : -1"? */
-                               break;
+                       }
+                       status = -2;  /* maybe "reedit ? -2 : -1"? */
+                       break;
 #ifdef ATTVIBUG
-                               }
-#endif
                        }
+#endif
+               }
 
-                       reedit++;
+               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);
+               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);
+               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 */
        }
 
@@ -830,7 +804,7 @@ sendfile(char **arg, char *file, int pushsw)
        char *cp, *sp, *vec[MAXARGS];
 
        /* Translate MIME composition file, if necessary */
-       if ((cp = context_find("automimeproc")) && (!strcmp(cp, "1")) &&
+       if ((cp = context_find("automimeproc")) && (strcmp(cp, "1")==0) &&
                        !getenv("NOMHNPROC") && check_draft(file) &&
                        (buildfile(NULL, file) == NOTOK))
                return 0;
@@ -855,31 +829,31 @@ sendfile(char **arg, char *file, int pushsw)
        context_save();  /* save the context file */
        fflush(stdout);
 
-       for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++)
+       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
                sleep(5);
        switch (child_id) {
-               case NOTOK:
-                       advise(NULL, "unable to fork, so sending directly...");
-               case OK:
-                       vecp = 0;
-                       vec[vecp++] = invo_name;
-                       if (pushsw)
-                               vec[vecp++] = "-push";
-                       if (arg)
-                               while (*arg)
-                                       vec[vecp++] = *arg++;
-                       vec[vecp++] = file;
-                       vec[vecp] = NULL;
-
-                       execvp(sendproc, vec);
-                       fprintf(stderr, "unable to exec ");
-                       perror(sendproc);
-                       _exit(-1);
-
-               default:
-                       if (pidwait(child_id, OK) == 0)
-                               done(0);
-                       return 1;
+       case NOTOK:
+               advise(NULL, "unable to fork, so sending directly...");
+       case OK:
+               vecp = 0;
+               vec[vecp++] = invo_name;
+               if (pushsw)
+                       vec[vecp++] = "-push";
+               if (arg)
+                       while (*arg)
+                               vec[vecp++] = *arg++;
+               vec[vecp++] = file;
+               vec[vecp] = NULL;
+
+               execvp(sendproc, vec);
+               fprintf(stderr, "unable to exec ");
+               perror(sendproc);
+               _exit(-1);
+
+       default:
+               if (pidwait(child_id, OK) == 0)
+                       done(0);
+               return 1;
        }
 }
 
@@ -939,41 +913,42 @@ check_draft(char *msgnam)
                return 0;
        for (state = FLD;;)
                switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) {
-                       case FLD:
-                       case FLDPLUS:
-                       case FLDEOF:
-                               /*
-                               ** If draft already contains any of the
-                               ** Content-XXX fields, then assume it already
-                               ** been converted.
-                               */
-                               if (uprf(name, XXX_FIELD_PRF)) {
-                                       fclose(fp);
-                                       return 0;
-                               }
-                               while (state == FLDPLUS)
-                                       state = m_getfld(state, name, buf,
-                                                       sizeof(buf), fp);
-                               break;
+               case FLD:
+               case FLDPLUS:
+               case FLDEOF:
+                       /*
+                       ** If draft already contains any of the
+                       ** Content-XXX fields, then assume it already
+                       ** been converted.
+                       */
+                       if (uprf(name, XXX_FIELD_PRF)) {
+                               fclose(fp);
+                               return 0;
+                       }
+                       while (state == FLDPLUS)
+                               state = m_getfld(state, name, buf,
+                                               sizeof(buf), fp);
+                       break;
 
-                       case BODY:
-                               do {
-                                       char *bp;
+               case BODY:
+                       do {
+                               char *bp;
 
-                                       for (bp = buf; *bp; bp++)
-                                               if (*bp != ' ' && *bp != '\t' && *bp != '\n') {
-                                                       fclose(fp);
-                                                       return 1;
-                                               }
+                               for (bp = buf; *bp; bp++)
+                                       if (*bp != ' ' && *bp != '\t' &&
+                                                       *bp != '\n') {
+                                               fclose(fp);
+                                               return 1;
+                                       }
 
-                                       state = m_getfld(state, name, buf,
-                                                       sizeof(buf), fp);
-                               } while (state == BODY);
-                               /* and fall... */
+                               state = m_getfld(state, name, buf,
+                                               sizeof(buf), fp);
+                       } while (state == BODY);
+                       /* and fall... */
 
-                       default:
-                               fclose(fp);
-                               return 0;
+               default:
+                       fclose(fp);
+                       return 0;
                }
 }
 
@@ -1043,11 +1018,7 @@ static struct swit  sendswitches[] = {
        { "server host", 6 },
 #define SNOOPSW  31
        { "snoop", -5 },
-#define SNDATTACHSW  32
-       { "attach file", 6 },
-#define SNDATTACHFORMAT   33
-       { "attachformat", 7 },
-#define PORTSW  34
+#define PORTSW  32
        { "port server-port-name/number", 4 },
        { NULL, 0 }
 };
@@ -1072,8 +1043,6 @@ sendit(char *sp, char **arg, char *file, int pushed)
        char *cp, buf[BUFSIZ], **argp;
        char **arguments, *vec[MAXARGS];
        struct stat st;
-       char *attach = NULL;  /* attachment header field name */
-       int attachformat = 0;  /* mhbuild format specifier for attachments */
 
 #ifndef lint
        int distsw = 0;
@@ -1131,106 +1100,87 @@ sendit(char *sp, char **arg, char *file, int pushed)
        while ((cp = *argp++)) {
                if (*cp == '-') {
                        switch (smatch(++cp, sendswitches)) {
-                               case AMBIGSW:
-                                       ambigsw(cp, sendswitches);
-                                       return;
-                               case UNKWNSW:
-                                       advise(NULL, "-%s unknown\n", cp);
-                                       return;
+                       case AMBIGSW:
+                               ambigsw(cp, sendswitches);
+                               return;
+                       case UNKWNSW:
+                               advise(NULL, "-%s unknown\n", cp);
+                               return;
 
-                               case SHELPSW:
-                                       snprintf(buf, sizeof(buf),
-                                                       "%s [switches]", sp);
-                                       print_help(buf, sendswitches, 1);
-                                       return;
-                               case SVERSIONSW:
-                                       print_version(invo_name);
-                                       return;
+                       case SHELPSW:
+                               snprintf(buf, sizeof(buf),
+                                               "%s [switches]", sp);
+                               print_help(buf, sendswitches, 1);
+                               return;
+                       case SVERSIONSW:
+                               print_version(invo_name);
+                               return;
 
-                               case SPSHSW:
-                                       pushed++;
-                                       continue;
-                               case NSPSHSW:
-                                       pushed = 0;
-                                       continue;
-
-                               case UNIQSW:
-                                       unique++;
-                                       continue;
-                               case NUNIQSW:
-                                       unique = 0;
-                                       continue;
-                               case FORWSW:
-                                       forwsw++;
-                                       continue;
-                               case NFORWSW:
-                                       forwsw = 0;
-                                       continue;
-
-                               case VERBSW:
-                                       verbsw++;
-                                       vec[vecp++] = --cp;
-                                       continue;
-                               case NVERBSW:
-                                       verbsw = 0;
-                                       vec[vecp++] = --cp;
-                                       continue;
-
-                               case DEBUGSW:
-                                       debugsw++;  /* fall */
-                               case NFILTSW:
-                               case FRMTSW:
-                               case NFRMTSW:
-                               case BITSTUFFSW:
-                               case NBITSTUFFSW:
-                               case MIMESW:
-                               case NMIMESW:
-                               case MSGDSW:
-                               case NMSGDSW:
-                               case WATCSW:
-                               case NWATCSW:
-                               case MAILSW:
-                               case SAMLSW:
-                               case SSNDSW:
-                               case SOMLSW:
-                               case SNOOPSW:
-                                       vec[vecp++] = --cp;
-                                       continue;
-
-                               case ALIASW:
-                               case FILTSW:
-                               case WIDTHSW:
-                               case CLIESW:
-                               case SERVSW:
-                               case PORTSW:
-                                       vec[vecp++] = --cp;
-                                       if (!(cp = *argp++) || *cp == '-') {
-                                               advise(NULL, "missing argument to %s", argp[-2]);
-                                               return;
-                                       }
-                                       vec[vecp++] = cp;
-                                       continue;
-
-                               case SNDATTACHSW:
-                                       if (!(attach = *argp++) ||
-                                                       *attach == '-') {
-                                               advise(NULL, "missing argument to %s", argp[-2]);
-                                               return;
-                                       }
-                                       continue;
+                       case SPSHSW:
+                               pushed++;
+                               continue;
+                       case NSPSHSW:
+                               pushed = 0;
+                               continue;
+
+                       case UNIQSW:
+                               unique++;
+                               continue;
+                       case NUNIQSW:
+                               unique = 0;
+                               continue;
+                       case FORWSW:
+                               forwsw++;
+                               continue;
+                       case NFORWSW:
+                               forwsw = 0;
+                               continue;
+
+                       case VERBSW:
+                               verbsw++;
+                               vec[vecp++] = --cp;
+                               continue;
+                       case NVERBSW:
+                               verbsw = 0;
+                               vec[vecp++] = --cp;
+                               continue;
+
+                       case DEBUGSW:
+                               debugsw++;  /* fall */
+                       case NFILTSW:
+                       case FRMTSW:
+                       case NFRMTSW:
+                       case BITSTUFFSW:
+                       case NBITSTUFFSW:
+                       case MIMESW:
+                       case NMIMESW:
+                       case MSGDSW:
+                       case NMSGDSW:
+                       case WATCSW:
+                       case NWATCSW:
+                       case MAILSW:
+                       case SAMLSW:
+                       case SSNDSW:
+                       case SOMLSW:
+                       case SNOOPSW:
+                               vec[vecp++] = --cp;
+                               continue;
+
+                       case ALIASW:
+                       case FILTSW:
+                       case WIDTHSW:
+                       case CLIESW:
+                       case SERVSW:
+                       case PORTSW:
+                               vec[vecp++] = --cp;
+                               if (!(cp = *argp++) || *cp == '-') {
+                                       advise(NULL, "missing argument to %s",
+                                                       argp[-2]);
+                                       return;
+                               }
+                               vec[vecp++] = cp;
+                               continue;
 
-                               case SNDATTACHFORMAT:
-                                       if (! *argp || **argp == '-')
-                                               adios(NULL, "missing argument to %s", argp[-1]);
-                                       else {
-                                               attachformat = atoi(*argp);
-                                               if (attachformat < 0 || attachformat > ATTACHFORMATS - 1) {
-                                                       advise(NULL, "unsupported attachformat %d", attachformat);
-                                                       continue;
-                                               }
-                                       }
-                                       ++argp;
-                                       continue;
                        }
                }
                advise(NULL, "usage: %s [switches]", sp);
@@ -1295,7 +1245,7 @@ sendit(char *sp, char **arg, char *file, int pushed)
        vec[0] = mhbasename(postproc);
        closefds(3);
 
-       if (sendsbr(vec, vecp, file, &st, 1, attach, attachformat) == OK)
+       if (sendsbr(vec, vecp, file, &st, 1) == OK)
                done(0);
 }