X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/74e9deda951a5b0151e18225c87f567f72ee11a4..2c5098fd3abe23a163c487f175e84c045d4bd21a:/uip/mhfixmsg.c diff --git a/uip/mhfixmsg.c b/uip/mhfixmsg.c index 0548f1b2..ad4bf0df 100644 --- a/uip/mhfixmsg.c +++ b/uip/mhfixmsg.c @@ -53,7 +53,6 @@ int debugsw; /* Needed by 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 */ @@ -215,19 +214,16 @@ main (int argc, char **argv) { 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 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]); @@ -235,7 +231,6 @@ main (int argc, char **argv) { case NRPRCSW: rmmproc = NULL; 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); - } 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); @@ -264,16 +265,6 @@ main (int argc, char **argv) { 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")) @@ -298,7 +289,7 @@ main (int argc, char **argv) { 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); @@ -384,7 +375,6 @@ main (int argc, char **argv) { } free (outfile); - free (tmp); 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) { - 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"); } @@ -524,7 +514,7 @@ fix_boundary (CT *ct, int *message_mods) { 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); @@ -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 (). */ - 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, @@ -1101,7 +1091,7 @@ decode_part (CT ct) { 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. */ @@ -1620,8 +1610,15 @@ strip_crs (CT ct, int *message_mods) { 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; @@ -1683,7 +1680,7 @@ strip_crs (CT ct, int *message_mods) { 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); @@ -1704,12 +1701,11 @@ strip_crs (CT ct, int *message_mods) { write (fd, cp, 1); last_char_was_cr = 0; } - } } 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; @@ -1726,7 +1722,9 @@ strip_crs (CT ct, int *message_mods) { ++*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; } - 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; @@ -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]; - 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;