Added Content-Description header with the filename of the attachment.
[mmh] / uip / send.c
index c85ac8e..e39ab80 100644 (file)
@@ -67,33 +67,25 @@ static struct swit switches[] = {
        { "alias aliasfile", 0 },
 #define DEBUGSW  1
        { "debug", -5 },
-#define FILTSW  2
-       { "filter filterfile", 0 },
-#define NFILTSW  3
-       { "nofilter", 0 },
-#define FRMTSW  4
-       { "format", 0 },
-#define NFRMTSW  5
-       { "noformat", 0 },
-#define FORWSW  6
+#define FORWSW  2
        { "forward", 0 },
-#define NFORWSW  7
+#define NFORWSW  3
        { "noforward", 0 },
-#define PUSHSW  8
+#define PUSHSW  4
        { "push", 0 },
-#define NPUSHSW  9
+#define NPUSHSW  5
        { "nopush", 0 },
-#define VERBSW  10
+#define VERBSW  6
        { "verbose", 0 },
-#define NVERBSW  11
+#define NVERBSW  7
        { "noverbose", 0 },
-#define WATCSW  12
+#define WATCSW  8
        { "watch", 0 },
-#define NWATCSW  13
+#define NWATCSW  9
        { "nowatch", 0 },
-#define VERSIONSW  14
+#define VERSIONSW  10
        { "version", 0 },
-#define HELPSW  15
+#define HELPSW  11
        { "help", 0 },
        { NULL, 0 }
 };
@@ -105,6 +97,7 @@ main(int argc, char **argv)
        int msgp = 0, nfiles = 0, distsw = 0, vecp = 1;
        int msgnum, status;
        int in, out;
+       int n;
        char *cp, *maildir = NULL;
        char buf[BUFSIZ], **ap, **argp, **arguments;
        char *msgs[MAXARGS], *vec[MAXARGS];
@@ -172,16 +165,12 @@ main(int argc, char **argv)
 
                        case DEBUGSW:
                                debugsw++;  /* fall */
-                       case NFILTSW:
-                       case FRMTSW:
-                       case NFRMTSW:
                        case WATCSW:
                        case NWATCSW:
                                vec[vecp++] = --cp;
                                continue;
 
                        case ALIASW:
-                       case FILTSW:
                                vec[vecp++] = --cp;
                                if (!(cp = *argp++) || *cp == '-') {
                                        adios(NULL, "missing argument to %s",
@@ -264,27 +253,17 @@ main(int argc, char **argv)
 
        if ((cp = getenv("mhdist")) && *cp && (distsw = atoi(cp)) && altmsg) {
                vec[vecp++] = "-dist";
-               distfile = getcpy(m_mktemp2(altmsg, invo_name, NULL, NULL));
-               if (link(altmsg, distfile) == NOTOK) {
-                       if (errno != EXDEV) {
-                               adios(distfile, "unable to link %s to",
-                                               altmsg);
-                       }
-                       free(distfile);
-                       distfile = getcpy(m_mktemp2(NULL, invo_name,
-                                       NULL, NULL));
-                       if ((in = open(altmsg, O_RDONLY)) == NOTOK) {
-                               adios(altmsg, "unable to open");
-                       }
-                       fstat(in, &st2);
-                       if ((out = creat(distfile, (int)st2.st_mode & 0777)) ==
-                                       NOTOK) {
-                               adios(distfile, "unable to write");
-                       }
-                       cpydata(in, out, altmsg, distfile);
-                       close(in);
-                       close(out);
+               if ((in = open(altmsg, O_RDONLY)) == NOTOK) {
+                       adios(altmsg, "unable to open for reading");
                }
+               fstat(in, &st2);
+               distfile = getcpy(m_mktemp2(NULL, invo_name, NULL, NULL));
+               if ((out = creat(distfile, (int)st2.st_mode & 0777))==NOTOK) {
+                       adios(distfile, "unable to open for writing");
+               }
+               cpydata(in, out, altmsg, distfile);
+               close(in);
+               close(out);
        } else {
                distfile = NULL;
        }
@@ -295,11 +274,40 @@ main(int argc, char **argv)
                st.st_ino = 0;
        }
        if (pushsw) {
-               push();
+               /* push a fork into the background */
+               pid_t pid;
+
+               switch (pid = fork()) {
+               case -1:
+                       /* fork error */
+                       advise(NULL, "unable to fork, so can't push...");
+                       break;
+
+               default:
+                       /* parent, just exit */
+                       done(0);
+
+               case 0:
+                       /* child, block a few signals and continue */
+                       SIGNAL(SIGHUP, SIG_IGN);
+                       SIGNAL(SIGINT, SIG_IGN);
+                       SIGNAL(SIGQUIT, SIG_IGN);
+                       SIGNAL(SIGTERM, SIG_IGN);
+#ifdef SIGTSTP
+                       SIGNAL(SIGTSTP, SIG_IGN);
+                       SIGNAL(SIGTTIN, SIG_IGN);
+                       SIGNAL(SIGTTOU, SIG_IGN);
+#endif
+                       freopen("/dev/null", "r", stdin);
+                       freopen("/dev/null", "w", stdout);
+                       break;
+               }
        }
        status = 0;
-       vec[0] = mhbasename(postproc);
-       closefds(3);
+       vec[0] = "spost";
+       for (n=3; n<OPEN_MAX; n++) {
+               close(n);
+       }
 
        for (msgnum = 0; msgnum < nfiles; msgnum++) {
                switch (sendsbr(vec, vecp, files[msgnum], &st, 1)) {
@@ -507,7 +515,7 @@ attach(char *draft_file_name)
                fclose(body_file);
 
                /* Add a mhbuild MIME composition file line for the body */
-               /* charset will be discovered/guessed by buildmimeproc */
+               /* charset will be discovered/guessed by mhbuild */
                fprintf(composition_file, "#text/plain %s\n", body_file_name);
        }
 
@@ -534,12 +542,8 @@ attach(char *draft_file_name)
        }
        fclose(composition_file);
 
-       /*
-       ** We're ready to roll!  Run mhbuild on the composition file.
-       ** Note that mhbuild is in the context as buildmimeproc.
-       */
-       sprintf(buf, "%s %s", buildmimeproc, composition_file_name);
-
+       /* We're ready to roll! */
+       sprintf(buf, "mhbuild %s", composition_file_name);
        if (system(buf) != 0) {
                /* some problem */
                clean_up_temporary_files();
@@ -626,9 +630,9 @@ make_mime_composition_file_entry(char *file_name)
                adios(NULL, "unable to access file `%s'", file_name);
        }
 
-       fprintf(composition_file, "#%s; name=\"%s\" <>{attachment}",
-               content_type,
-               (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1);
+       cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1;
+       fprintf(composition_file, "#%s; name=\"%s\" <> [%s] {attachment}",
+                       content_type, cp, cp);
 
        fprintf(composition_file, " %s\n", file_name);
 
@@ -637,17 +641,17 @@ make_mime_composition_file_entry(char *file_name)
 
 /*
 ** The back-end of the message sending back-end.
-** Annotate original message, and call `postproc' to send message.
+** Annotate original message, and call `spost' to send message.
 */
 static int
 sendaux(char **vec, int vecp, char *drft, struct stat *st)
 {
        pid_t child_id;
-       int i, status, fd;
+       int status, fd;
        char backup[BUFSIZ];
 
        /*
-       ** fd collects the output of postproc, and is used for the
+       ** fd collects the output of spost, and is used for the
        ** failure notice if we need to send one in alert().
        */
        fd = pushsw ? tmp_fd() : NOTOK;
@@ -658,10 +662,7 @@ sendaux(char **vec, int vecp, char *drft, struct stat *st)
        }
        vec[vecp] = NULL;
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) {
-               sleep(5);
-       }
-       switch (child_id) {
+       switch (child_id = fork()) {
        case -1:
                /* oops -- fork error */
                adios("fork", "unable to");
@@ -679,9 +680,9 @@ sendaux(char **vec, int vecp, char *drft, struct stat *st)
                        dup2(fd, fileno(stderr));
                        close(fd);
                }
-               execvp(postproc, vec);
+               execvp(*vec, vec);
                fprintf(stderr, "unable to exec ");
-               perror(postproc);
+               perror(*vec);
                _exit(-1);
                break;  /* NOT REACHED */
 
@@ -693,7 +694,7 @@ sendaux(char **vec, int vecp, char *drft, struct stat *st)
                        }
                } else {
                        /*
-                       ** If postproc failed, and we have good fd (which
+                       ** If spost failed, and we have good fd (which
                        ** means we pushed), then mail error message
                        ** (and possibly the draft) back to the user.
                        */
@@ -720,20 +721,16 @@ sendaux(char **vec, int vecp, char *drft, struct stat *st)
 
 /*
 ** Mail error notification (and possibly a copy of the
-** message) back to the user, using the mailproc
+** message) back to the user, using mhmail(1).
 */
 static void
 alert(char *file, int out)
 {
        pid_t child_id;
-       int i, in;
+       int in;
        char buf[BUFSIZ];
 
-       for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) {
-               sleep(5);
-       }
-
-       switch (child_id) {
+       switch (child_id = fork()) {
        case NOTOK:
                /* oops -- fork error */
                advise("fork", "unable to");
@@ -768,11 +765,10 @@ alert(char *file, int out)
                /* create subject for error notification */
                snprintf(buf, sizeof(buf), "send failed on %s",
                                forwsw ? "enclosed draft" : file);
-
-               execlp(mailproc, mhbasename(mailproc), getusername(),
+               execlp("mhmail", "mhmail", getusername(),
                                "-subject", buf, NULL);
                fprintf(stderr, "unable to exec ");
-               perror(mailproc);
+               perror("mhmail");
                _exit(-1);
 
        default:  /* no waiting... */