]> diplodocus.org Git - nmh/blobdiff - uip/mhfixmsg.c
Replaced use of m_mktemp() with m_mktemp2() so that tmp files created
[nmh] / uip / mhfixmsg.c
index 0548f1b2233ba3a0bc7d0c05d9fa813ebc454e7a..ad4bf0df13f36ba666424377273ffa1dc6b8c42d 100644 (file)
@@ -53,7 +53,6 @@ int debugsw; /* Needed by mhparse.c. */
 #define quitser pipeser
 
 /* mhparse.c */
 #define quitser pipeser
 
 /* mhparse.c */
-extern char *tmp;                             /* directory to place tmp files */
 extern int skip_mp_cte_check;                 /* flag to InitMultiPart */
 extern int suppress_bogus_mp_content_warning; /* flag to InitMultiPart */
 extern int bogus_mp_content;                  /* flag from InitMultiPart */
 extern int skip_mp_cte_check;                 /* flag to InitMultiPart */
 extern int suppress_bogus_mp_content_warning; /* flag to InitMultiPart */
 extern int bogus_mp_content;                  /* flag from InitMultiPart */
@@ -215,19 +214,16 @@ main (int argc, char **argv) {
             case NREPLACETEXTPLAINSW:
                 fx.replacetextplain = 0;
                 continue;
             case NREPLACETEXTPLAINSW:
                 fx.replacetextplain = 0;
                 continue;
-
             case FILESW:
                 if (! (cp = *argp++) || (*cp == '-' && cp[1]))
                     adios (NULL, "missing argument to %s", argp[-2]);
                 file = *cp == '-'  ?  add (cp, NULL)  :  path (cp, TFILE);
                 continue;
             case FILESW:
                 if (! (cp = *argp++) || (*cp == '-' && cp[1]))
                     adios (NULL, "missing argument to %s", argp[-2]);
                 file = *cp == '-'  ?  add (cp, NULL)  :  path (cp, TFILE);
                 continue;
-
             case OUTFILESW:
                 if (! (cp = *argp++) || (*cp == '-' && cp[1]))
                     adios (NULL, "missing argument to %s", argp[-2]);
                 outfile = *cp == '-'  ?  add (cp, NULL)  :  path (cp, TFILE);
                 continue;
             case OUTFILESW:
                 if (! (cp = *argp++) || (*cp == '-' && cp[1]))
                     adios (NULL, "missing argument to %s", argp[-2]);
                 outfile = *cp == '-'  ?  add (cp, NULL)  :  path (cp, TFILE);
                 continue;
-
             case RPROCSW:
                 if (!(rmmproc = *argp++) || *rmmproc == '-')
                     adios (NULL, "missing argument to %s", argp[-2]);
             case RPROCSW:
                 if (!(rmmproc = *argp++) || *rmmproc == '-')
                     adios (NULL, "missing argument to %s", argp[-2]);
@@ -235,7 +231,6 @@ main (int argc, char **argv) {
             case NRPRCSW:
                 rmmproc = NULL;
                 continue;
             case NRPRCSW:
                 rmmproc = NULL;
                 continue;
-
             case VERBSW:
                 verbosw = 1;
                 continue;
             case VERBSW:
                 verbosw = 1;
                 continue;
@@ -249,8 +244,14 @@ main (int argc, char **argv) {
                 adios (NULL, "only one folder at a time!");
             else
                 folder = pluspath (cp);
                 adios (NULL, "only one folder at a time!");
             else
                 folder = pluspath (cp);
-        } else
-                app_msgarg(&msgs, cp);
+        } else {
+            if (*cp == '/') {
+                /* Interpret a full path as a filename, not a message. */
+                file = add (cp, NULL);
+            } else {
+                app_msgarg (&msgs, cp);
+            }
+        }
     }
 
     SIGNAL (SIGQUIT, quitser);
     }
 
     SIGNAL (SIGQUIT, quitser);
@@ -264,16 +265,6 @@ main (int argc, char **argv) {
         fclose (fp);
     }
 
         fclose (fp);
     }
 
-    /*
-     * Check for storage directory.  If specified,
-     * then 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);
-
     suppress_bogus_mp_content_warning = skip_mp_cte_check = 1;
 
     if (! context_find ("path"))
     suppress_bogus_mp_content_warning = skip_mp_cte_check = 1;
 
     if (! context_find ("path"))
@@ -298,7 +289,7 @@ main (int argc, char **argv) {
 
             using_stdin = 1;
 
 
             using_stdin = 1;
 
-            if ((cp = m_mktemp2 (tmp, invo_name, &fd, NULL)) == NULL) {
+            if ((cp = m_mktemp2 (NULL, invo_name, &fd, NULL)) == NULL) {
                 adios (NULL, "unable to create temporary file");
             } else {
                 free (file);
                 adios (NULL, "unable to create temporary file");
             } else {
                 free (file);
@@ -384,7 +375,6 @@ main (int argc, char **argv) {
     }
 
     free (outfile);
     }
 
     free (outfile);
-    free (tmp);
     free (file);
 
     /* done is freects_done, which will clean up all of cts. */
     free (file);
 
     /* done is freects_done, which will clean up all of cts. */
@@ -406,7 +396,7 @@ mhfixmsgsbr (CT *ctp, const fix_transformations *fx, char *outfile) {
         modify_inplace = 1;
 
         if ((*ctp)->c_file) {
         modify_inplace = 1;
 
         if ((*ctp)->c_file) {
-            outfile = add (m_mktemp2 (tmp, invo_name, NULL, NULL), NULL);
+            outfile = add (m_mktemp2 (NULL, invo_name, NULL, NULL), NULL);
         } else {
             adios (NULL, "missing both input and output filenames\n");
         }
         } else {
             adios (NULL, "missing both input and output filenames\n");
         }
@@ -524,7 +514,7 @@ fix_boundary (CT *ct, int *message_mods) {
             if (get_multipart_boundary (*ct, &part_boundary) == OK) {
                 char *fixed;
 
             if (get_multipart_boundary (*ct, &part_boundary) == OK) {
                 char *fixed;
 
-                if ((fixed = m_mktemp2 (tmp, invo_name, NULL, &(*ct)->c_fp))) {
+                if ((fixed = m_mktemp2 (NULL, invo_name, NULL, &(*ct)->c_fp))) {
                     if (replace_boundary (*ct, fixed, part_boundary) == OK) {
                         char *filename = add ((*ct)->c_file, NULL);
 
                     if (replace_boundary (*ct, fixed, part_boundary) == OK) {
                         char *filename = add ((*ct)->c_file, NULL);
 
@@ -1029,7 +1019,7 @@ build_text_plain_part (CT encoded_part) {
            contains the decoded contents.  And the decoding function, such
            as openQuoted, will have set ...->ce_unlink to 1 so that it will
            be unlinked by free_content (). */
            contains the decoded contents.  And the decoding function, such
            as openQuoted, will have set ...->ce_unlink to 1 so that it will
            be unlinked by free_content (). */
-        tmp_plain_file = add (m_mktemp2 (tmp, invo_name, NULL, NULL), NULL);
+        tmp_plain_file = add (m_mktemp2 (NULL, invo_name, NULL, NULL), NULL);
         if (reformat_part (tp_part, tmp_plain_file,
                            tp_part->c_ctinfo.ci_type,
                            tp_part->c_ctinfo.ci_subtype,
         if (reformat_part (tp_part, tmp_plain_file,
                            tp_part->c_ctinfo.ci_type,
                            tp_part->c_ctinfo.ci_subtype,
@@ -1101,7 +1091,7 @@ decode_part (CT ct) {
     char *tmp_decoded;
     int status;
 
     char *tmp_decoded;
     int status;
 
-    tmp_decoded = add (m_mktemp2 (tmp, invo_name, NULL, NULL), NULL);
+    tmp_decoded = add (m_mktemp2 (NULL, invo_name, NULL, NULL), NULL);
     /* The following call will load ct->c_cefile.ce_file with the tmp
        filename of the decoded content.  tmp_decoded will contain the
        encoded output, get rid of that. */
     /* The following call will load ct->c_cefile.ce_file with the tmp
        filename of the decoded content.  tmp_decoded will contain the
        encoded output, get rid of that. */
@@ -1620,8 +1610,15 @@ strip_crs (CT ct, int *message_mods) {
     char *codeset = upcase (content_codeset (ct));
     int status = OK;
 
     char *codeset = upcase (content_codeset (ct));
     int status = OK;
 
-    /* Only strip carriage returns if content is ASCII. */
-    if (! strcmp (norm_charmap (codeset), "US-ASCII")) {
+    /* Only strip carriage returns if content is ASCII or another
+       codeset that has the same readily recognizable CR followed by a
+       LF.  We can include UTF-8 here because if the high-order bit of
+       a UTF-8 byte is 0, then it must be a single-byte ASCII
+       character. */
+    if (! strcmp (norm_charmap (codeset), "US-ASCII")  ||
+        ! strncmp (norm_charmap (codeset), "ISO-8859-", 9)  ||
+        ! strncmp (norm_charmap (codeset), "UTF-8", 5)  ||
+        ! strncmp (norm_charmap (codeset), "WINDOWS-12", 10)) {
         char **file = NULL;
         FILE **fp = NULL;
         size_t begin;
         char **file = NULL;
         FILE **fp = NULL;
         size_t begin;
@@ -1683,7 +1680,7 @@ strip_crs (CT ct, int *message_mods) {
             if (has_crs) {
                 int fd;
                 char *stripped_content_file =
             if (has_crs) {
                 int fd;
                 char *stripped_content_file =
-                    add (m_mktemp2 (tmp, invo_name, &fd, NULL), NULL);
+                    add (m_mktemp2 (NULL, invo_name, &fd, NULL), NULL);
 
                 /* Strip each CR before a LF from the content. */
                 fseeko (*fp, begin, SEEK_SET);
 
                 /* Strip each CR before a LF from the content. */
                 fseeko (*fp, begin, SEEK_SET);
@@ -1704,12 +1701,11 @@ strip_crs (CT ct, int *message_mods) {
                             write (fd, cp, 1);
                             last_char_was_cr = 0;
                         }
                             write (fd, cp, 1);
                             last_char_was_cr = 0;
                         }
-
                     }
                 }
 
                 if (close (fd)) {
                     }
                 }
 
                 if (close (fd)) {
-                    admonish (NULL, "unable to write temporaty file %s",
+                    admonish (NULL, "unable to write temporary file %s",
                               stripped_content_file);
                     unlink (stripped_content_file);
                     status = NOTOK;
                               stripped_content_file);
                     unlink (stripped_content_file);
                     status = NOTOK;
@@ -1726,7 +1722,9 @@ strip_crs (CT ct, int *message_mods) {
 
                     ++*message_mods;
                     if (verbosw) {
 
                     ++*message_mods;
                     if (verbosw) {
-                        report (NULL, *file, "stripped CRs");
+                        report (ct->c_partno,
+                                begin == 0 && end == 0  ?  ""  :  *file,
+                                "stripped CRs");
                     }
                 }
             }
                     }
                 }
             }
@@ -1841,7 +1839,7 @@ convert_codeset (CT ct, char *dest_codeset, int *message_mods) {
             return -1;
         }
 
             return -1;
         }
 
-        dest = add (m_mktemp2 (tmp, invo_name, &fd, NULL), NULL);
+        dest = add (m_mktemp2 (NULL, invo_name, &fd, NULL), NULL);
 
         if (ct->c_cefile.ce_file) {
             file = &ct->c_cefile.ce_file;
 
         if (ct->c_cefile.ce_file) {
             file = &ct->c_cefile.ce_file;
@@ -1875,7 +1873,8 @@ convert_codeset (CT ct, char *dest_codeset, int *message_mods) {
                                      min (bytes_to_read, sizeof src_buffer),
                                      *fp)) > 0) {
                 char dest_buffer[BUFSIZ];
                                      min (bytes_to_read, sizeof src_buffer),
                                      *fp)) > 0) {
                 char dest_buffer[BUFSIZ];
-                char *ib = src_buffer, *ob = dest_buffer;
+                ICONV_CONST char *ib = src_buffer;
+                char *ob = dest_buffer;
                 size_t outbytes = sizeof dest_buffer;
                 size_t outbytes_before = outbytes;
 
                 size_t outbytes = sizeof dest_buffer;
                 size_t outbytes_before = outbytes;