X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6f9d27d45bd1ba8299ed15d53cdb76a365d641c5..8c6e995a43e71e012ae133ff8ebea5719d9117fe:/uip/mhfixmsg.c?ds=sidebyside diff --git a/uip/mhfixmsg.c b/uip/mhfixmsg.c index a05177a3..25116206 100644 --- a/uip/mhfixmsg.c +++ b/uip/mhfixmsg.c @@ -9,11 +9,12 @@ #include #include #include +#include "h/done.h" #include #include -#include "../sbr/m_maildir.h" -#include "../sbr/m_mktemp.h" -#include "../sbr/mime_type.h" +#include "sbr/m_maildir.h" +#include "sbr/m_mktemp.h" +#include "sbr/mime_type.h" #include "mhmisc.h" #include "mhfree.h" #include "mhoutsbr.h" @@ -131,8 +132,8 @@ main (int argc, char **argv) { struct msgs *mp = NULL; CT *ctp; FILE *fp, *infp = NULL, *outfp = NULL; - int using_stdin = 0; - int chgflag = 1; + bool using_stdin = false; + bool chgflag = true; int status = OK; fix_transformations fx; fx.reformat = fx.fixcompositecte = fx.fixboundary = 1; @@ -143,7 +144,7 @@ main (int argc, char **argv) { fx.lf_line_endings = 0; fx.textcharset = NULL; - if (nmh_init(argv[0], 2)) { return 1; } + if (nmh_init(argv[0], true, false)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -158,7 +159,7 @@ main (int argc, char **argv) { ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof buf, "%s [+folder] [msgs] [switches]", @@ -171,7 +172,7 @@ main (int argc, char **argv) { case DECODETEXTSW: if (! (cp = *argp++) || *cp == '-') { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } if (! strcasecmp (cp, "8bit")) { fx.decodetext = CE_8BIT; @@ -180,7 +181,7 @@ main (int argc, char **argv) { } else if (! strcasecmp (cp, "binary")) { fx.decodetext = CE_BINARY; } else { - adios (NULL, "invalid argument to %s", argp[-2]); + die("invalid argument to %s", argp[-2]); } continue; case NDECODETEXTSW: @@ -188,7 +189,7 @@ main (int argc, char **argv) { continue; case DECODETYPESW: if (! (cp = *argp++) || *cp == '-') { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } fx.decodetypes = cp; continue; @@ -200,7 +201,7 @@ main (int argc, char **argv) { continue; case TEXTCHARSETSW: if (! (cp = *argp++) || (*cp == '-' && cp[1])) { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } fx.textcharset = cp; continue; @@ -221,13 +222,13 @@ main (int argc, char **argv) { continue; case FIXTYPESW: if (! (cp = *argp++) || (*cp == '-' && cp[1])) { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } if (! strncasecmp (cp, "multipart/", 10) || ! strncasecmp (cp, "message/", 8)) - adios (NULL, "-fixtype %s not allowed", cp); + die("-fixtype %s not allowed", cp); if (! strchr (cp, '/')) - adios (NULL, "-fixtype requires type/subtype"); + die("-fixtype requires type/subtype"); if (fx.fixtypes == NULL) { fx.fixtypes = svector_create (10); } svector_push_back (fx.fixtypes, cp); continue; @@ -245,29 +246,29 @@ main (int argc, char **argv) { continue; case FILESW: if (! (cp = *argp++) || (*cp == '-' && cp[1])) { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } file = *cp == '-' ? mh_xstrdup (cp) : path (cp, TFILE); continue; case OUTFILESW: if (! (cp = *argp++) || (*cp == '-' && cp[1])) { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } outfile = *cp == '-' ? mh_xstrdup (cp) : path (cp, TFILE); continue; case RPROCSW: if (!(rmmproc = *argp++) || *rmmproc == '-') { - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); } continue; case NRPRCSW: rmmproc = NULL; continue; case CHGSW: - chgflag = 1; + chgflag = true; continue; case NCHGSW: - chgflag = 0; + chgflag = false; continue; case VERBSW: verbosw = 1; @@ -279,7 +280,7 @@ main (int argc, char **argv) { } if (*cp == '+' || *cp == '@') { if (folder) - adios (NULL, "only one folder at a time!"); + die("only one folder at a time!"); folder = pluspath (cp); } else { if (*cp == '/') { @@ -298,7 +299,7 @@ main (int argc, char **argv) { * Read the standard profile setup */ if ((fp = fopen (cp = etcpath ("mhn.defaults"), "r"))) { - readconfig ((struct node **) 0, fp, cp, 0); + readconfig(NULL, fp, cp, 0); fclose (fp); } @@ -310,7 +311,7 @@ main (int argc, char **argv) { } if (file && msgs.size) { - adios (NULL, "cannot specify msg and file at same time!"); + die("cannot specify msg and file at same time!"); } if (outfile) { @@ -337,10 +338,10 @@ main (int argc, char **argv) { int fd; char *cp; - using_stdin = 1; + using_stdin = true; if ((cp = m_mktemp2 (NULL, invo_name, &fd, NULL)) == NULL) { - adios (NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); } else { free (file); @@ -350,7 +351,7 @@ main (int argc, char **argv) { if (close (fd)) { (void) m_unlink (file); - adios (NULL, "failed to write temporary file"); + die("failed to write temporary file"); } } @@ -405,12 +406,12 @@ main (int argc, char **argv) { /* read folder and create message structure */ if (! (mp = folder_read (folder, 1))) { - adios (NULL, "unable to read folder %s", folder); + die("unable to read folder %s", folder); } /* check for empty folder */ if (mp->nummsg == 0) { - adios (NULL, "no messages in %s", folder); + die("no messages in %s", folder); } /* parse all the message ranges/sequences and set SELECTED */ @@ -495,7 +496,7 @@ main (int argc, char **argv) { status = 1; } - mh_xfree(maildir); + free(maildir); free (cts); if (fx.fixtypes != NULL) { svector_free (fx.fixtypes); } @@ -522,7 +523,7 @@ mhfixmsgsbr (CT *ctp, char *maildir, const fix_transformations *fx, char *input_filename = maildir ? concat (maildir, "/", (*ctp)->c_file, NULL) : mh_xstrdup ((*ctp)->c_file); - int modify_inplace = 0; + bool modify_inplace = false; int message_mods = 0; int status = OK; @@ -534,19 +535,19 @@ mhfixmsgsbr (CT *ctp, char *maildir, const fix_transformations *fx, } if (outfile == NULL) { - modify_inplace = 1; + modify_inplace = true; if ((*ctp)->c_file) { char *tempfile; /* outfp will be closed by the caller */ if ((tempfile = m_mktemp2 (NULL, invo_name, NULL, outfp)) == NULL) { - adios (NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); } outfile = mh_xstrdup (tempfile); } else { - adios (NULL, "missing both input and output filenames\n"); + die("missing both input and output filenames\n"); } } /* else *outfp was defined by caller */ @@ -866,7 +867,7 @@ replace_boundary (CT ct, char *file, char *boundary) { fprintf (fpout, "%s:%s%s\n", np, new_ctline, FENDNULL(new_params)); free(new_ctline); - mh_xfree(new_params); + free(new_params); } free (vp); @@ -1114,7 +1115,7 @@ fix_composite_cte (CT ct, int *message_mods) { for (hf = ct->c_first_hf; hf; hf = hf->next) { char *name = hf->name; - for (; *name && isspace ((unsigned char) *name); ++name) { + for (; isspace((unsigned char)*name); ++name) { continue; } @@ -1182,7 +1183,7 @@ set_ce (CT ct, int encoding) { if (ctinit) { char *cte = concat (" ", ce, "\n", NULL); - int found_cte = 0; + bool found_cte = false; HF hf; /* Decoded contents might be in ct->c_cefile.ce_file, if the caller is decode_text_parts (). Save because we'll @@ -1209,7 +1210,7 @@ set_ce (CT ct, int encoding) { /* Update/add Content-Transfer-Encoding header field. */ for (hf = ct->c_first_hf; hf; hf = hf->next) { if (! strcasecmp (ENCODING_FIELD, hf->name)) { - found_cte = 1; + found_cte = true; free (hf->value); hf->value = cte; } @@ -1397,7 +1398,7 @@ find_textplain_sibling (CT parent, int replacetextplain, int *new_subpart_number) { struct multipart *mp = (struct multipart *) parent->c_ctparams; struct part *part, *prev; - int has_text_plain = 0; + bool has_text_plain = false; for (prev = part = mp->mp_parts; part; part = part->mp_next) { ++*new_subpart_number; @@ -1420,7 +1421,7 @@ find_textplain_sibling (CT parent, int replacetextplain, free_content (old_part->mp_part); free (old_part); } else { - has_text_plain = 1; + has_text_plain = true; } break; } @@ -1605,7 +1606,7 @@ decode_part (CT ct) { char *tempfile; if ((tempfile = m_mktemp2 (NULL, invo_name, NULL, &file)) == NULL) { - adios (NULL, "unable to create temporary file in %s", get_temp_dir()); + die("unable to create temporary file in %s", get_temp_dir()); } tmp_decoded = mh_xstrdup (tempfile); /* The following call will load ct->c_cefile.ce_file with the tmp @@ -1742,8 +1743,7 @@ build_multipart_alt (CT first_alt, CT new_part, int type, int subtype) { boundary_in_content (&new_part->c_cefile.ce_fp, new_part->c_cefile.ce_file, boundary)) == NOTOK) { - free_content (ct); - return NULL; + goto return_null; } } @@ -1754,8 +1754,7 @@ build_multipart_alt (CT first_alt, CT new_part, int type, int subtype) { boundary_in_content (&new_part->c_fp, new_part->c_file, boundary)) == NOTOK) { - free_content (ct); - return NULL; + goto return_null; } } @@ -1775,8 +1774,7 @@ build_multipart_alt (CT first_alt, CT new_part, int type, int subtype) { if (found_boundary) { inform("giving up trying to find a unique boundary"); - free_content (ct); - return NULL; + goto return_null; } } @@ -1821,6 +1819,11 @@ build_multipart_alt (CT first_alt, CT new_part, int type, int subtype) { free (boundary); return ct; + +return_null: + free_content(ct); + free(boundary); + return NULL; } @@ -1831,7 +1834,7 @@ static int boundary_in_content (FILE **fp, char *file, const char *boundary) { char buffer[NMH_BUFSIZ]; size_t bytes_read; - int found_boundary = 0; + bool found_boundary = false; /* free_content() will close *fp if we fopen it here. */ if (! *fp && (*fp = fopen (file, "r")) == NULL) { @@ -1842,7 +1845,7 @@ boundary_in_content (FILE **fp, char *file, const char *boundary) { fseeko (*fp, 0L, SEEK_SET); while ((bytes_read = fread (buffer, 1, sizeof buffer, *fp)) > 0) { if (find_str (buffer, bytes_read, boundary)) { - found_boundary = 1; + found_boundary = true; break; } } @@ -1906,7 +1909,7 @@ set_ct_type (CT ct, int type, int subtype, int encoding) { char *type_subtypename = concat (" ", typename, "/", subtypename, NULL); /* E.g, " text/plain\n" */ char *name_plus_nl = concat (type_subtypename, "\n", NULL); - int found_content_type = 0; + bool found_content_type = false; HF hf; const char *cp = NULL; char *ctline; @@ -1915,7 +1918,7 @@ set_ct_type (CT ct, int type, int subtype, int encoding) { /* Update/add Content-Type header field. */ for (hf = ct->c_first_hf; hf; hf = hf->next) { if (! strcasecmp (TYPE_FIELD, hf->name)) { - found_content_type = 1; + found_content_type = true; free (hf->value); hf->value = (cp = strchr (ct->c_ctline, ';')) ? concat (type_subtypename, cp, "\n", NULL) @@ -2085,18 +2088,18 @@ should_decode(const char *decodetypes, const char *type, const char *subtype) { decodetypes with commas, then search for ,type, and ,type/subtype, in it. */ - int found_match = 0; + bool found_match = false; char *delimited_decodetypes = concat(",", decodetypes, ",", NULL); char *delimited_type = concat(",", type, ",", NULL); if (nmh_strcasestr(delimited_decodetypes, delimited_type)) { - found_match = 1; + found_match = true; } else if (subtype != NULL) { char *delimited_type_subtype = concat(",", type, "/", subtype, ",", NULL); if (nmh_strcasestr(delimited_decodetypes, delimited_type_subtype)) { - found_match = 1; + found_match = true; } free(delimited_type_subtype); } @@ -2191,8 +2194,8 @@ strip_crs (CT ct, int *message_mods) { FILE **fp = NULL; size_t begin; size_t end; - int has_crs = 0; - int opened_input_file = 0; + bool has_crs = false; + bool opened_input_file = false; if (ct->c_cefile.ce_file) { file = &ct->c_cefile.ce_file; @@ -2211,7 +2214,7 @@ strip_crs (CT ct, int *message_mods) { advise (*file, "unable to open for reading"); status = NOTOK; } else { - opened_input_file = 1; + opened_input_file = true; } } } @@ -2231,13 +2234,13 @@ strip_crs (CT ct, int *message_mods) { modify the content. */ char *cp; size_t i; - int last_char_was_cr = 0; + bool last_char_was_cr = false; if (end > 0) { bytes_to_read -= bytes_read; } for (i = 0, cp = buffer; i < bytes_read; ++i, ++cp) { if (*cp == '\n' && last_char_was_cr) { - has_crs = 1; + has_crs = true; break; } @@ -2251,7 +2254,7 @@ strip_crs (CT ct, int *message_mods) { char *tempfile = m_mktemp2 (NULL, invo_name, &fd, NULL); if (tempfile == NULL) { - adios (NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); } stripped_content_file = mh_xstrdup (tempfile); @@ -2262,11 +2265,11 @@ strip_crs (CT ct, int *message_mods) { 0) { char *cp; size_t i; - int last_char_was_cr = 0; + bool last_char_was_cr = false; for (i = 0, cp = buffer; i < bytes_read; ++i, ++cp) { if (*cp == '\r') { - last_char_was_cr = 1; + last_char_was_cr = true; } else if (last_char_was_cr) { if (*cp != '\n') { if (write (fd, "\r", 1) < 0) { @@ -2276,12 +2279,12 @@ strip_crs (CT ct, int *message_mods) { if (write (fd, cp, 1) < 0) { advise (tempfile, "write"); } - last_char_was_cr = 0; + last_char_was_cr = false; } else { if (write (fd, cp, 1) < 0) { advise (tempfile, "write"); } - last_char_was_cr = 0; + last_char_was_cr = false; } } } @@ -2290,13 +2293,14 @@ strip_crs (CT ct, int *message_mods) { inform("unable to write temporary file %s, continuing...", stripped_content_file); (void) m_unlink (stripped_content_file); + free(stripped_content_file); status = NOTOK; } else { /* Replace the decoded file with the converted one. */ if (ct->c_cefile.ce_file && ct->c_cefile.ce_unlink) (void) m_unlink (ct->c_cefile.ce_file); - mh_xfree(ct->c_cefile.ce_file); + free(ct->c_cefile.ce_file); ct->c_cefile.ce_file = stripped_content_file; ct->c_cefile.ce_unlink = 1; @@ -2334,12 +2338,12 @@ update_cte (CT ct) { least_restrictive_enc != CE_7BIT) { char *cte = concat (" ", ce_str (least_restrictive_enc), "\n", NULL); HF hf; - int found_cte = 0; + bool found_cte = false; /* Update/add Content-Transfer-Encoding header field. */ for (hf = ct->c_first_hf; hf; hf = hf->next) { if (! strcasecmp (ENCODING_FIELD, hf->name)) { - found_cte = 1; + found_cte = true; free (hf->value); hf->value = cte; } @@ -2571,7 +2575,7 @@ fix_always (CT ct, int *message_mods) { */ static int fix_filename_param (char *name, char *value, PM *first_pm, PM *last_pm) { - int fixed = 0; + bool fixed = false; if (has_prefix(value, "=?") && has_suffix(value, "?=")) { /* Looks like an RFC 2047 encoded parameter. */ @@ -2580,7 +2584,7 @@ fix_filename_param (char *name, char *value, PM *first_pm, PM *last_pm) { if (decode_rfc2047 (value, decoded, sizeof decoded)) { /* Encode using RFC 2231. */ replace_param (first_pm, last_pm, name, decoded, 0); - fixed = 1; + fixed = true; } else { inform("failed to decode %s parameter %s", name, value); }