]> diplodocus.org Git - nmh/blobdiff - uip/mhbuildsbr.c
picksbr.c: fprintf function pointer with unsigned-long-long cast.
[nmh] / uip / mhbuildsbr.c
index 26f9e3bd5badc74b787705c5a1386bc2c545d712..7c957b08198c127750c1999cf8a86335c34b48ff 100644 (file)
 #include <h/md5.h>
 #include <h/mts.h>
 #include <h/tws.h>
+#include <h/fmt_scan.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 #include <h/utils.h>
 #include "../sbr/m_mktemp.h"
+#include "../sbr/message_id.h"
+#include "../sbr/mime_type.h"
 #include "mhfree.h"
+#include "mhshowsbr.h"
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -36,10 +40,6 @@ extern int listsw;
 extern int rfc934sw;
 extern int contentidsw;
 
-/* cache policies */
-extern int rcachesw;   /* mhcachesbr.c */
-extern int wcachesw;   /* mhcachesbr.c */
-
 static char prefix[] = "----- =_aaaaaaaaaa";
 
 struct attach_list {
@@ -134,7 +134,7 @@ build_mime (char *infile, int autobuild, int dist, int directives,
     CT ct;
     FILE *in;
     HF hp;
-    m_getfld_state_t gstate = 0;
+    m_getfld_state_t gstate;
     struct attach_list *attach_head = NULL, *attach_tail = NULL, *at_entry;
     convert_list *convert_head = NULL, *convert_tail = NULL, *convert;
 
@@ -163,10 +163,11 @@ build_mime (char *infile, int autobuild, int dist, int directives,
      * draft into the linked list of header fields for
      * the new MIME message.
      */
-    m_getfld_track_filepos (&gstate, in);
+    gstate = m_getfld_state_init(in);
+    m_getfld_track_filepos2(&gstate);
     for (compnum = 1;;) {
        int bufsz = sizeof buf;
-       switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) {
+       switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
        case FLD:
        case FLDPLUS:
            compnum++;
@@ -186,7 +187,7 @@ build_mime (char *infile, int autobuild, int dist, int directives,
            if (!strcasecmp (name, TYPE_FIELD)) {
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (&gstate, name, buf, &bufsz, in);
+                   state = m_getfld2(&gstate, name, buf, &bufsz);
                }
                goto finish_field;
            }
@@ -198,7 +199,7 @@ build_mime (char *infile, int autobuild, int dist, int directives,
            /* if necessary, get rest of field */
            while (state == FLDPLUS) {
                bufsz = sizeof buf;
-               state = m_getfld (&gstate, name, buf, &bufsz, in);
+               state = m_getfld2(&gstate, name, buf, &bufsz);
                vp = add (buf, vp);     /* add to previous value */
            }
 
@@ -249,7 +250,7 @@ build_mime (char *infile, int autobuild, int dist, int directives,
                 char *type = np + strlen (MHBUILD_FILE_PSEUDOHEADER);
                 char *filename = vp;
 
-                /* vp should begin with a space because m_getfld()
+                /* vp should begin with a space because m_getfld2()
                    includes the space after the colon in buf. */
                 while (isspace((unsigned char) *filename)) { ++filename; }
                 /* Trim trailing newline and any other whitespace. */
@@ -289,7 +290,7 @@ build_mime (char *infile, int autobuild, int dist, int directives,
                 char *type = np + strlen (MHBUILD_ARGS_PSEUDOHEADER);
                 char *argstring = vp;
 
-                /* vp should begin with a space because m_getfld()
+                /* vp should begin with a space because m_getfld2()
                    includes the space after the colon in buf. */
                 while (isspace((unsigned char) *argstring)) { ++argstring; }
                 /* Trim trailing newline and any other whitespace. */
@@ -331,7 +332,7 @@ finish_field:
 
        case BODY:
            fseek (in, (long) (-strlen (buf)), SEEK_CUR);
-           /* FALLTHRU */
+           break;
        case FILEEOF:
            break;
 
@@ -565,8 +566,7 @@ finish_field:
         } else {
            if (*++cp == 0)
                adios (NULL, "giving up trying to find a unique delimiter string");
-           else
-               (*cp)++;
+            (*cp)++;
        }
     }
 
@@ -645,7 +645,7 @@ user_content (FILE *in, char *buf, CT *ctp, const char *infilename)
 {
     int        extrnal, vrsn;
     char *cp, **ap;
-    char buffer[BUFSIZ];
+    char buffer[NMH_BUFSIZ];
     struct multipart *m;
     struct part **pp;
     struct stat st;
@@ -974,8 +974,7 @@ use_forw:
            if (*cp == '+' || *cp == '@') {
                if (folder)
                    adios (NULL, "only one folder per #forw directive");
-               else
-                   folder = pluspath (cp);
+                folder = pluspath (cp);
            }
        }
 
@@ -1918,7 +1917,7 @@ calculate_digest (CT ct, int asciiP)
        unsigned char *ep;
 
        fprintf (stderr, "MD5 digest=");
-       for (ep = (dp = digest) + sizeof(digest) / sizeof(digest[0]);
+       for (ep = (dp = digest) + sizeof digest;
                 dp < ep; dp++)
            fprintf (stderr, "%02x", *dp & 0xff);
        fprintf (stderr, "\n");
@@ -1926,7 +1925,7 @@ calculate_digest (CT ct, int asciiP)
 
     /* encode the digest using base64 */
     for (dp = digest, op = (char *) outbuf,
-                               cc = sizeof(digest) / sizeof(digest[0]);
+                               cc = sizeof digest;
                cc > 0; cc -= 3, op += 4) {
        unsigned long bits;
        char *bp;
@@ -2205,7 +2204,6 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
     struct str2init *s2i;
     CT reply_ct;
     struct part *part;
-    int eightbit = 0;
     int status;
 
     type_p = getcpy (type);
@@ -2220,15 +2218,13 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
     free (type_p);
 
     if (! (convert)) {
-        /* No mhbuild-convert- entry in mhn.defaults or profile
-           for type. */
+        /* No mhbuild-convert- entry in mhn.defaults or profile for type. */
         return;
     }
     /* reply_file is used to pass the output of the convert. */
     reply_file = getcpy (m_mktemp2 (NULL, invo_name, NULL, NULL));
     convert_command =
-        concat (convert, " ", FENDNULL(argstring), " >", reply_file,
-                NULL);
+        concat (convert, " ", FENDNULL(argstring), " >", reply_file, NULL);
 
     /* Convert here . . . */
     ct->c_storeproc = mh_xstrdup(convert_command);
@@ -2251,19 +2247,6 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
         return;
     }
 
-    /* For text content only, see if it is 8-bit text. */
-    if (reply_ct->c_type == CT_TEXT) {
-        int fd;
-
-        if ((fd = open (reply_file, O_RDONLY)) == NOTOK  ||
-            scan_input (fd, &eightbit) == NOTOK) {
-            free (reply_file);
-            inform("failed to read %s, continuing...", reply_file);
-            return;
-        } 
-        (void) close (fd);
-    }
-
     /* This sets reply_ct->c_ctparams, and reply_ct->c_termproc if the
        charset can't be handled natively. */
     for (s2i = str2cts; s2i->si_key; s2i++) {
@@ -2276,45 +2259,22 @@ expand_pseudoheader (CT ct, CT *text_plain_ct, struct multipart *m,
         (*reply_ct->c_ctinitfnx)(reply_ct);
     }
 
-    if ((cp =
-         get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1))) {
+    if ((cp = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1))) {
         /* The reply Content-Type had the charset. */
         charset = cp;
     } else {
         set_charset (reply_ct, -1);
         charset = get_param (reply_ct->c_ctinfo.ci_first_pm, "charset", '?', 1);
-        if (reply_ct->c_reqencoding == CE_UNKNOWN  &&
-            reply_ct->c_type == CT_TEXT) {
-            /* Assume that 8bit is sufficient (for text).  In other words,
-               don't allow it to be encoded as quoted printable if lines
-               are too long.  This also sidesteps the check for whether
-               it needs to be encoded as binary; instead, it relies on
-               the applicable mhbuild-convert-text directive to ensure
-               that the resultant text is not binary. */
-            reply_ct->c_reqencoding = eightbit  ?  CE_8BIT  :  CE_7BIT;
-        }
     }
 
     /* Concatenate text/plain parts. */
-    if (reply_ct->c_type == CT_TEXT  &&
-        reply_ct->c_subtype == TEXT_PLAIN) {
+    if (reply_ct->c_type == CT_TEXT  &&  reply_ct->c_subtype == TEXT_PLAIN) {
         if (! *text_plain_ct  &&  m->mp_parts  &&  m->mp_parts->mp_part  &&
             m->mp_parts->mp_part->c_type == CT_TEXT  &&
             m->mp_parts->mp_part->c_subtype == TEXT_PLAIN) {
             *text_plain_ct = m->mp_parts->mp_part;
-            /* Make sure that the charset is set in the text/plain
-               part. */
+            /* Make sure that the charset is set in the text/plain part. */
             set_charset (*text_plain_ct, -1);
-            if ((*text_plain_ct)->c_reqencoding == CE_UNKNOWN) {
-                /* Assume that 8bit is sufficient (for text).  In other words,
-                   don't allow it to be encoded as quoted printable if lines
-                   are too long.  This also sidesteps the check for whether
-                   it needs to be encoded as binary; instead, it relies on
-                   the applicable mhbuild-convert-text directive to ensure
-                   that the resultant text is not binary. */
-                (*text_plain_ct)->c_reqencoding =
-                    eightbit  ?  CE_8BIT  :  CE_7BIT;
-            }
         }
 
         if (*text_plain_ct) {
@@ -2420,7 +2380,7 @@ extract_headers (CT ct, char *reply_file, FILE **reply_fp) {
         CT tmp_ct;
         char *tmp_file;
         FILE *tmp_f;
-        size_t n;
+        size_t n, written;
 
         /* Truncate buffer to just the C-T. */
         *end_of_header = '\0';
@@ -2434,14 +2394,15 @@ extract_headers (CT ct, char *reply_file, FILE **reply_fp) {
         /* Hack.  Use parse_mime() to detect the type/subtype of the
            reply, which we'll use below. */
         tmp_file = getcpy (m_mktemp2 (NULL, invo_name, NULL, NULL));
-        if ((tmp_f = fopen (tmp_file, "w"))  &&
-            fwrite (buffer, 1, n, tmp_f) == n) {
-            fclose (tmp_f);
-        } else {
+        tmp_f = fopen(tmp_file, "w");
+        if (!tmp_f)
+            goto failed_to_extract_ct;
+        written = fwrite(buffer, 1, n, tmp_f);
+        fclose(tmp_f);
+        if (written != n)
             goto failed_to_extract_ct;
-        }
-        tmp_ct = parse_mime (tmp_file);
 
+        tmp_ct = parse_mime (tmp_file);
         if (tmp_ct) {
             /* The type and subtype were detected from the reply
                using parse_mime() above. */