]> diplodocus.org Git - nmh/blobdiff - uip/mhbuild.c
eliminate use of fgets() in mhparse.c
[nmh] / uip / mhbuild.c
index 0af3c56ff5dc7b0bea7ebbfe9a2c028d608187f3..065777405ede3fcdbd125d6f6265a119a17d41a5 100644 (file)
     X("norfc934mode", 0, NRFC934SW) \
     X("verbose", 0, VERBSW) \
     X("noverbose", 0, NVERBSW) \
+    X("disposition", 0, DISPOSW) \
+    X("nodisposition", 0, NDISPOSW) \
     X("rcache policy", 0, RCACHESW) \
     X("wcache policy", 0, WCACHESW) \
     X("contentid", 0, CONTENTIDSW) \
     X("nocontentid", 0, NCONTENTIDSW) \
     X("headerencoding encoding-algorithm", 0, HEADERENCSW) \
     X("autoheaderencoding", 0, AUTOHEADERENCSW) \
+    X("maxunencoded", 0, MAXUNENCSW) \
     X("version", 0, VERSIONSW) \
     X("help", 0, HELPSW) \
     X("debug", -5, DEBUGSW) \
+    X("dist", -4, DISTSW) \
 
 #define X(sw, minchars, id) id,
 DEFINE_SWITCH_ENUM(MHBUILD);
@@ -65,9 +69,6 @@ DEFINE_SWITCH_ENUM(MIMEENCODING);
 DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches);
 #undef X
 
-/* mhbuildsbr.c */
-extern char *tmp;      /* directory to place temp files */
-
 /* mhcachesbr.c */
 extern int rcachesw;
 extern int wcachesw;
@@ -75,7 +76,6 @@ extern char *cache_public;
 extern char *cache_private;
 
 int debugsw = 0;
-int verbosw = 0;
 
 int listsw   = 0;
 int rfc934sw = 0;
@@ -96,14 +96,13 @@ static void unlink_done (int) NORETURN;
 int output_message (CT, char *);
 int output_message_fp (CT, FILE *, char*);
 
-/* mhlistsbr.c */
-int list_all_messages (CT *, int, int, int, int);
-
 
 int
 main (int argc, char **argv)
 {
-    int sizesw = 1, headsw = 1, directives = 1, autobuild = 0;
+    int sizesw = 1, headsw = 1, directives = 1, autobuild = 0, dist = 0;
+    int verbosw = 0, dispo = 0;
+    size_t maxunencoded = MAXTEXTPERLN;
     int *icachesw;
     char *cp, buf[BUFSIZ];
     char buffer[BUFSIZ], *compfile = NULL;
@@ -113,13 +112,9 @@ main (int argc, char **argv)
     FILE *fp_out = NULL;
     int header_encoding = CE_UNKNOWN;
 
-    done=unlink_done;
-
-    setlocale(LC_ALL, "");
-    invo_name = r1bindex (argv[0], '/');
+    if (nmh_init(argv[0], 1)) { return 1; }
 
-    /* read user profile/context */
-    context_read();
+    done=unlink_done;
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
@@ -259,15 +254,33 @@ main (int argc, char **argv)
                header_encoding = CE_UNKNOWN;
                continue;
 
+           case MAXUNENCSW:
+               if (!(cp = *argp++) || *cp == '-')
+                   adios (NULL, "missing argument to %s", argp[-2]);
+               if ((maxunencoded = atoi(cp)) < 1)
+                   adios (NULL, "Invalid argument for %s: %s", argp[-2], cp);
+               if (maxunencoded > 998)
+                   adios (NULL, "limit of -maxunencoded is 998");
+               continue;
+
            case VERBSW: 
                verbosw++;
                continue;
            case NVERBSW: 
                verbosw = 0;
                continue;
+           case DISPOSW:
+               dispo = 1;
+               continue;
+           case NDISPOSW:
+               dispo = 0;
+               continue;
            case DEBUGSW:
                debugsw = 1;
                continue;
+           case DISTSW:
+               dist = 1;
+               continue;
            }
        }
        if (compfile)
@@ -305,16 +318,6 @@ main (int argc, char **argv)
        cache_private = ".cache";
     cache_private = getcpy (m_maildir (cache_private));
 
-    /*
-     * Check for storage directory.  If defined, we
-     * will store temporary files there.  Else we
-     * store them in standard nmh directory.
-     */
-    if ((cp = context_find (nmhstorage)) && *cp)
-       tmp = concat (cp, "/", invo_name, NULL);
-    else
-       tmp = add (m_maildir (invo_name), NULL);
-
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
 
@@ -326,15 +329,21 @@ main (int argc, char **argv)
      * Process the composition file from standard input.
      */
     if (compfile[0] == '-' && compfile[1] == '\0') {
+       if ((cp = m_mktemp2(NULL, invo_name, NULL, &fp)) == NULL) {
+           adios(NULL, "unable to create temporary file in %s",
+                 get_temp_dir());
+       }
+
        /* copy standard input to temporary file */
-       strncpy (infile, m_mktemp(invo_name, NULL, &fp), sizeof(infile));
+       strncpy (infile, cp, sizeof(infile));
        while (fgets (buffer, BUFSIZ, stdin))
            fputs (buffer, fp);
        fclose (fp);
        unlink_infile = 1;
 
        /* build the content structures for MIME message */
-       ct = build_mime (infile, autobuild, directives, header_encoding);
+       ct = build_mime (infile, autobuild, dist, directives, header_encoding,
+                        maxunencoded, verbosw);
 
        /*
         * If ct == NULL, that means that -auto was set and a MIME version
@@ -353,7 +362,7 @@ main (int argc, char **argv)
            free_content (ct);
        }
 
-       unlink (infile);
+       (void) m_unlink (infile);
        unlink_infile = 0;
 
        done (0);
@@ -364,7 +373,8 @@ main (int argc, char **argv)
      */
 
     /* build the content structures for MIME message */
-    ct = build_mime (compfile, autobuild, directives, header_encoding);
+    ct = build_mime (compfile, autobuild, dist, directives, header_encoding,
+                    maxunencoded, verbosw);
 
     /*
      * If ct == NULL, that means -auto was set and we found a MIME version
@@ -378,8 +388,10 @@ main (int argc, char **argv)
     cts[1] = NULL;
 
     /* output MIME message to this temporary file */
-    strncpy(outfile, m_mktemp2(compfile, invo_name, NULL, &fp_out),
-            sizeof(outfile));
+    if ((cp = m_mktemp2(compfile, invo_name, NULL, &fp_out)) == NULL) {
+       adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+    }
+    strncpy(outfile, cp, sizeof(outfile));
     unlink_outfile = 1;
 
     /* output the message */
@@ -390,7 +402,7 @@ main (int argc, char **argv)
      * List the message info
      */
     if (listsw)
-       list_all_messages (cts, headsw, sizesw, verbosw, debugsw);
+       list_all_messages (cts, headsw, sizesw, verbosw, debugsw, dispo);
 
     /* Rename composition draft */
     snprintf (buffer, sizeof(buffer), "%s.orig", m_backup (compfile));
@@ -420,9 +432,9 @@ unlink_done (int status)
      * temporary files.
      */
     if (unlink_infile)
-       unlink (infile);
+       (void) m_unlink (infile);
     if (unlink_outfile)
-       unlink (outfile);
+       (void) m_unlink (outfile);
 
     exit (status);
 }