Activated Jon's attachment system by default and steamlined it.
[mmh] / uip / viamail.c
index bb5b12c..76450ac 100644 (file)
@@ -1,9 +1,10 @@
-
 /*
- * viamail.c -- send multiple files in a MIME message
- *
- * $Id$
- */
+** viamail.c -- send multiple files in a MIME message
+**
+** This code is Copyright (c) 2002, by the authors of nmh.  See the
+** COPYRIGHT file in the root directory of the nmh distribution for
+** complete copyright information.
+*/
 
 #include <h/mh.h>
 #include <fcntl.h>
@@ -11,8 +12,8 @@
 #include <h/md5.h>
 #include <errno.h>
 #include <signal.h>
-#include <zotnet/mts/mts.h>
-#include <zotnet/tws/tws.h>
+#include <h/mts.h>
+#include <h/tws.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 
 #endif
 
 static struct swit switches[] = {
-#define        TOSW                    0
-    { "to mailpath", 0 },
-#define        FROMSW                  1
-    { "from mailpath", 0 },
-#define        SUBJECTSW               2
-    { "subject subject", 0 },
-#define        PARAMSW                 3
-    { "parameters arguments", 0 },
-#define        DESCRIPTSW              4
-    { "description text", 0 },
-#define        COMMENTSW               5
-    { "comment text", 0 },
-#define        DELAYSW                 6
-    { "delay seconds", 0 },
-#define        VERBSW                  7
-    { "verbose", 0 },
-#define        NVERBSW                 8
-    { "noverbose", 0 },
-#define VERSIONSW               9
-    { "version", 0 },
-#define        HELPSW                 10
-    { "help", 4 },
-#define DEBUGSW                11
-    { "debug", -5 },
-    { NULL, 0 }
+#define TOSW  0
+       { "to mailpath", 0 },
+#define FROMSW  1
+       { "from mailpath", 0 },
+#define SUBJECTSW  2
+       { "subject subject", 0 },
+#define PARAMSW  3
+       { "parameters arguments", 0 },
+#define DESCRIPTSW  4
+       { "description text", 0 },
+#define COMMENTSW  5
+       { "comment text", 0 },
+#define VERBSW  6
+       { "verbose", 0 },
+#define NVERBSW  7
+       { "noverbose", 0 },
+#define VERSIONSW  8
+       { "version", 0 },
+#define HELPSW  9
+       { "help", 0 },
+#define DEBUGSW  10
+       { "debug", -5 },
+       { NULL, 0 }
 };
 
-extern int errno;
 extern int debugsw;
-extern int splitsw;
 extern int verbsw;
 
-int ebcdicsw = 0;      /* hack for linking purposes */
+int ebcdicsw = 0;  /* hack for linking purposes */
 
 /* mhmisc.c */
-void set_endian (void);
+void set_endian(void);
 
 /* mhoutsbr.c */
-int writeBase64aux (FILE *, FILE *);
+int writeBase64aux(FILE *, FILE *);
 
 /*
- * static prototypes
- */
-static int via_mail (char *, char *, char *, char *, char *, int, char *);
+** static prototypes
+*/
+static int via_mail(char *, char *, char *, char *, char *, char *);
 
 
 int
-main (int argc, char **argv)
+main(int argc, char **argv)
 {
-    int delay = 0;
-    char *f1 = NULL, *f2 = NULL, *f3 = NULL;
-    char *f4 = NULL, *f5 = NULL, *f7 = NULL;
-    char *cp, buf[BUFSIZ];
-    char **argp, **arguments;
+       char *f1 = NULL, *f2 = NULL, *f3 = NULL;
+       char *f4 = NULL, *f5 = NULL, *f7 = NULL;
+       char *cp, buf[BUFSIZ];
+       char **argp, **arguments;
 
 #ifdef LOCALE
-    setlocale(LC_ALL, "");
+       setlocale(LC_ALL, "");
 #endif
-    invo_name = r1bindex (argv[0], '/');
-
-    /* foil search of user profile/context */
-    if (context_foil (NULL) == -1)
-       done (1);
-
-    arguments = getarguments (invo_name, argc, argv, 0);
-    argp = arguments;
-
-    while ((cp = *argp++)) {
-       if (*cp == '-') {
-           switch (smatch (++cp, switches)) {
-           case AMBIGSW: 
-               ambigsw (cp, switches);
-               done (1);
-           case UNKWNSW: 
-               adios (NULL, "-%s unknown", cp);
-
-           case HELPSW: 
-               snprintf (buf, sizeof(buf), "%s [switches]", invo_name);
-               print_help (buf, switches, 1);
-               done (1);
-           case VERSIONSW:
-               print_version(invo_name);
-               done (1);
-    
-           case TOSW:
-               if (!(f1 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-           case SUBJECTSW:
-               if (!(f2 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-           case PARAMSW:
-               if (!(f3 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-           case DESCRIPTSW:
-               if (!(f4 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-           case COMMENTSW:
-               if (!(f5 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-           case DELAYSW:
-               if (!(cp = *argp++) || *cp == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
-
-               /*
-                * If there is an error, just reset the delay parameter
-                * to -1.  We will set a default delay later.
-                */
-               if (sscanf (cp, "%d", &delay) != 1)
-                   delay = -1;
-               continue;
-           case FROMSW:
-               if (!(f7 = *argp++))
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               continue;
-
-           case VERBSW: 
-               verbsw = 1;
-               continue;
-           case NVERBSW: 
-               verbsw = 0;
-               continue;
-
-           case DEBUGSW:
-               debugsw = 1;
-               continue;
-           }
+       invo_name = mhbasename(argv[0]);
+
+       /* foil search of user profile/context */
+       if (context_foil(NULL) == -1)
+               done(1);
+
+       arguments = getarguments(invo_name, argc, argv, 0);
+       argp = arguments;
+
+       while ((cp = *argp++)) {
+               if (*cp == '-') {
+                       switch (smatch(++cp, switches)) {
+                       case AMBIGSW:
+                               ambigsw(cp, switches);
+                               done(1);
+                       case UNKWNSW:
+                               adios(NULL, "-%s unknown", cp);
+
+                       case HELPSW:
+                               snprintf(buf, sizeof(buf), "%s [switches]",
+                                               invo_name);
+                               print_help(buf, switches, 1);
+                               done(1);
+                       case VERSIONSW:
+                               print_version(invo_name);
+                               done(1);
+
+                       case TOSW:
+                               if (!(f1 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                                       argp[-2]);
+                               continue;
+                       case SUBJECTSW:
+                               if (!(f2 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                               argp[-2]);
+                               continue;
+                       case PARAMSW:
+                               if (!(f3 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                               argp[-2]);
+                               continue;
+                       case DESCRIPTSW:
+                               if (!(f4 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                               argp[-2]);
+                               continue;
+                       case COMMENTSW:
+                               if (!(f5 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                               argp[-2]);
+                               continue;
+                       case FROMSW:
+                               if (!(f7 = *argp++))
+                                       adios(NULL, "missing argument to %s",
+                                               argp[-2]);
+                               continue;
+
+                       case VERBSW:
+                               verbsw = 1;
+                               continue;
+                       case NVERBSW:
+                               verbsw = 0;
+                               continue;
+
+                       case DEBUGSW:
+                               debugsw = 1;
+                               continue;
+                       }
+               }
        }
-    }
 
-    set_endian ();
+       set_endian();
 
-    if (!f1)
-       adios (NULL, "missing -viamail \"mailpath\" switch");
+       if (!f1)
+               adios(NULL, "missing -viamail \"mailpath\" switch");
 
-    via_mail (f1, f2, f3, f4, f5, delay, f7);
-    /* NOTREACHED */
+       via_mail(f1, f2, f3, f4, f5, f7);
+       return 0;  /* dead code to satisfy the compiler */
 }
 
 
 /*
- * VIAMAIL
- */
+** VIAMAIL
+*/
 
 static int
-via_mail (char *mailsw, char *subjsw, char *parmsw, char *descsw,
-          char *cmntsw, int delay, char *fromsw)
+via_mail(char *mailsw, char *subjsw, char *parmsw, char *descsw,
+       char *cmntsw, char *fromsw)
 {
-    int        status, vecp = 1;
-    char tmpfil[BUFSIZ];
-    char *vec[MAXARGS];
-    struct stat st;
-    FILE *fp;
-
-    umask (~m_gmprot ());
-
-    strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil));
-    if ((fp = fopen (tmpfil, "w+")) == NULL)
-       adios (tmpfil, "unable to open for writing");
-    chmod (tmpfil, 0600);
-
-    if (!strchr(mailsw, '@'))
-       mailsw = concat (mailsw, "@", LocalName (), NULL);
-    fprintf (fp, "To: %s\n", mailsw);
-
-    if (subjsw)
-       fprintf (fp, "Subject: %s\n", subjsw);
-
-    if (fromsw) {
-       if (!strchr(fromsw, '@'))
-           fromsw = concat (fromsw, "@", LocalName (), NULL);
-       fprintf (fp, "From: %s\n", fromsw);
-    }
-
-    fprintf (fp, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
-    fprintf (fp, "%s: application/octet-stream", TYPE_FIELD);
+       int status, vecp = 1;
+       char tmpfil[BUFSIZ];
+       char *vec[MAXARGS];
+       struct stat st;
+       FILE *fp;
+       char *tfile = NULL;
+
+       umask(~m_gmprot());
+
+       tfile = m_mktemp2(NULL, invo_name, NULL, &fp);
+       if (tfile == NULL)
+               adios("viamail", "unable to create temporary file");
+       chmod(tfile, 0600);
+       strncpy(tmpfil, tfile, sizeof(tmpfil));
+
+       if (!strchr(mailsw, '@'))
+               mailsw = concat(mailsw, "@", LocalName(), NULL);
+       fprintf(fp, "To: %s\n", mailsw);
+
+       if (subjsw)
+               fprintf(fp, "Subject: %s\n", subjsw);
+
+       if (fromsw) {
+               if (!strchr(fromsw, '@'))
+                       fromsw = concat(fromsw, "@", LocalName(), NULL);
+               fprintf(fp, "From: %s\n", fromsw);
+       }
 
-    if (parmsw)
-       fprintf (fp, "; %s", parmsw);
+       fprintf(fp, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
+       fprintf(fp, "%s: application/octet-stream", TYPE_FIELD);
 
-    if (cmntsw)
-       fprintf (fp, "\n\t(%s)", cmntsw);
+       if (parmsw)
+               fprintf(fp, "; %s", parmsw);
 
-    if (descsw)
-       fprintf (fp, "\n%s: %s", DESCR_FIELD, descsw);
+       if (cmntsw)
+               fprintf(fp, "\n\t(%s)", cmntsw);
 
-    fprintf (fp, "\n%s: %s\n\n", ENCODING_FIELD, "base64");
+       if (descsw)
+               fprintf(fp, "\n%s: %s", DESCR_FIELD, descsw);
 
-    if (fflush (fp))
-       adios (tmpfil, "error writing to");
+       fprintf(fp, "\n%s: %s\n\n", ENCODING_FIELD, "base64");
 
-    writeBase64aux (stdin, fp);
-    if (fflush (fp))
-       adios (tmpfil, "error writing to");
+       if (fflush(fp))
+               adios(tmpfil, "error writing to");
 
-    if (fstat (fileno (fp), &st) == NOTOK)
-       adios ("failed", "fstat of %s", tmpfil);
+       writeBase64aux(stdin, fp);
+       if (fflush(fp))
+               adios(tmpfil, "error writing to");
 
-    if (delay < 0)
-       splitsw = 10;
-    else
-       splitsw = delay;
+       if (fstat(fileno(fp), &st) == NOTOK)
+               adios("failed", "fstat of %s", tmpfil);
 
-    status = 0;
-    vec[0] = r1bindex (postproc, '/');
-    if (verbsw)
-       vec[vecp++] = "-verbose";
+       status = 0;
+       vec[0] = mhbasename(postproc);
+       if (verbsw)
+               vec[vecp++] = "-verbose";
 
-    switch (sendsbr (vec, vecp, tmpfil, &st, 0)) {
+       switch (sendsbr(vec, vecp, tmpfil, &st, 0)) {
        case DONE:
        case NOTOK:
-           status++;
-           break;
+               status++;
+               break;
        case OK:
-           break;
-    }
+               break;
+       }
 
-    fclose (fp);
-    if (unlink (tmpfil) == -1)
-       advise (NULL, "unable to remove temp file %s", tmpfil);
-    done (status);
+       fclose(fp);
+       if (unlink(tmpfil) == -1)
+               advise(NULL, "unable to remove temp file %s", tmpfil);
+       done(status);
+       return 1;
 }