X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/116b286a03fe33db3db24a56fa3518d237f5b8c2..44ce2010:/uip/mhstoresbr.c?ds=inline diff --git a/uip/mhstoresbr.c b/uip/mhstoresbr.c index 7e91563f..a651d01a 100644 --- a/uip/mhstoresbr.c +++ b/uip/mhstoresbr.c @@ -1,6 +1,4 @@ - -/* - * mhstoresbr.c -- routines to save/store the contents of MIME messages +/* mhstoresbr.c -- routines to save/store the contents of MIME messages * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -40,6 +38,8 @@ struct mhstoreinfo { enum clobber_policy_t clobber_policy; /* -clobber selection */ }; +static bool use_param_as_filename(const char *p); + mhstoreinfo_t mhstoreinfo_create (CT *ct, char *pwd, const char *csw, int asw, int vsw) { mhstoreinfo_t info; @@ -292,7 +292,7 @@ store_multi (CT ct, mhstoreinfo_t info) /* Support mhstore -outfile. The MIME parser doesn't load c_storage, so we know that p->c_storage is NULL here. */ - p->c_storage = add (ct->c_storage, NULL); + p->c_storage = mh_xstrdup(ct->c_storage); } result = store_switch (p, info); @@ -341,7 +341,7 @@ store_partial (CT ct, mhstoreinfo_t info) } if (hi == 0) { - advise (NULL, "missing (at least) last part of multipart message"); + inform("missing (at least) last part of multipart message"); return NOTOK; } @@ -364,22 +364,21 @@ store_partial (CT ct, mhstoreinfo_t info) for (ctq = base; *ctq; ctq++) { p = *ctq; pm = (struct partial *) p->c_ctparams; - if (pm->pm_marked != cur) { - if (pm->pm_marked == cur - 1) { - admonish (NULL, - "duplicate part %d of %d part multipart message", - pm->pm_marked, hi); - continue; - } + if (pm->pm_marked == cur) { + cur++; + continue; + } + + if (pm->pm_marked == cur - 1) { + inform("duplicate part %d of %d part multipart message, continuing...", + pm->pm_marked, hi); + continue; + } missing_part: - advise (NULL, - "missing %spart %d of %d part multipart message", - cur != hi ? "(at least) " : "", cur, hi); - goto losing; - } - else - cur++; + inform("missing %spart %d of %d part multipart message", + cur != hi ? "(at least) " : "", cur, hi); + goto losing; } if (hi != --cur) { cur = hi; @@ -395,7 +394,7 @@ missing_part: ct = *ctq++; if (store_content (ct, NULL, info) == NOTOK) { losing: - free ((char *) base); + free(base); return NOTOK; } @@ -405,7 +404,7 @@ losing: goto losing; } - free ((char *) base); + free(base); return OK; } @@ -431,16 +430,11 @@ store_external (CT ct, mhstoreinfo_t info) if (info->autosw) { char *cp; - if ((cp = e->eb_name) - && *cp != '/' - && *cp != '.' - && *cp != '|' - && *cp != '!' - && !strchr (cp, '%')) { + if ((cp = e->eb_name) && use_param_as_filename(cp)) { if (!ct->c_storeproc) - ct->c_storeproc = add (cp, NULL); + ct->c_storeproc = mh_xstrdup(cp); if (!p->c_storeproc) - p->c_storeproc = add (cp, NULL); + p->c_storeproc = mh_xstrdup(cp); } } @@ -456,7 +450,7 @@ store_external (CT ct, mhstoreinfo_t info) if (ct->c_storage) { /* Support mhstore -outfile. The MIME parser doesn't load c_storage, so we know that p->c_storage is NULL here. */ - p->c_storage = add (ct->c_storage, NULL); + p->c_storage = mh_xstrdup(ct->c_storage); } result = store_switch (p, info); @@ -537,7 +531,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) /* record the folder name */ if (p->c_folder) { - ct->c_folder = add (p->c_folder, NULL); + ct->c_folder = mh_xstrdup(p->c_folder); } } goto got_filename; @@ -575,7 +569,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) adios(NULL, "unable to create temporary file in %s", get_temp_dir()); } - ct->c_storage = add (tmpfilenam, NULL); + ct->c_storage = mh_xstrdup(tmpfilenam); /* Get the folder name */ if (cp[1]) @@ -587,7 +581,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) create_folder(m_mailpath(folder), 0, exit); /* Record the folder name */ - ct->c_folder = add (folder, NULL); + ct->c_folder = mh_xstrdup(folder); if (cp[1]) free (folder); @@ -609,7 +603,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info) return show_content_aux (ct, 0, buffer + 1, info->dir, NULL); /* record the filename */ - if ((ct->c_storage = clobber_check (add (buffer, NULL), info)) == + if ((ct->c_storage = clobber_check (mh_xstrdup(buffer), info)) == NULL) { return NOTOK; } @@ -650,7 +644,7 @@ got_filename: if (first_partial) fprintf (stderr, "reassembling partials "); if (last_partial) - fprintf (stderr, "%s", ct->c_file); + fputs(ct->c_file, stderr); else fprintf (stderr, "%s,", ct->c_file); } else { @@ -674,7 +668,7 @@ got_filename: int cwdlen = strlen (info->cwd); fprintf (stderr, " as file %s\n", - strncmp (ct->c_storage, info->cwd, cwdlen) + !has_prefix(ct->c_storage, info->cwd) || ct->c_storage[cwdlen] != '/' ? ct->c_storage : ct->c_storage + cwdlen + 1); } @@ -709,7 +703,7 @@ output_content_file (CT ct, int appending) int cc, fd; if (!ct->c_ceopenfnx) { - advise (NULL, "don't know how to decode part %s of message %s", + inform("don't know how to decode part %s of message %s", ct->c_partno, ct->c_file); return NOTOK; } @@ -835,7 +829,7 @@ losing: } } - while (fgets (buffer, sizeof(buffer) - 1, ct->c_fp)) { + while (fgets (buffer, sizeof buffer, ct->c_fp)) { if ((pos += strlen (buffer)) > last) { int diff; @@ -908,7 +902,7 @@ output_content_folder (char *folder, char *filename) /* Link file into folder */ msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, NULL); } else { - advise (NULL, "unable to read folder %s", folder); + inform("unable to read folder %s", folder); return NOTOK; } @@ -974,7 +968,8 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) *bp = '\0'; buflen--; continue; - } else { + } + { PM pm; char *s = ""; @@ -1001,7 +996,7 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir) break; case 'p': - /* insert part number withouth leading dot */ + /* insert part number without leading dot */ if (ct->c_partno) strncpy (bp, ct->c_partno, buflen); break; @@ -1068,18 +1063,13 @@ get_storeproc (CT ct) * use that (RFC-2183). */ if (ct->c_dispo) { - if ((cp = get_param(ct->c_dispo_first, "filename", '_', 0)) - && *cp != '/' - && *cp != '.' - && *cp != '|' - && *cp != '!' - && !strchr (cp, '%')) { - ct->c_storeproc = add (cp, NULL); + if ((cp = get_param(ct->c_dispo_first, "filename", '_', 0)) && + use_param_as_filename(cp)) { + ct->c_storeproc = mh_xstrdup(cp); free(cp); return; } - if (cp) - free(cp); + mh_xfree(cp); } /* @@ -1088,17 +1078,12 @@ get_storeproc (CT ct) * the storeproc. */ ci = &ct->c_ctinfo; - if ((cp = get_param(ci->ci_first_pm, "name", '_', 0)) - && *cp != '/' - && *cp != '.' - && *cp != '|' - && *cp != '!' - && !strchr (cp, '%')) { - ct->c_storeproc = add (cp, NULL); + if ((cp = get_param(ci->ci_first_pm, "name", '_', 0)) && + use_param_as_filename(cp)) { + ct->c_storeproc = mh_xstrdup(cp); } - if (cp) - free(cp); + mh_xfree(cp); } @@ -1188,7 +1173,7 @@ next_version (char *file, enum clobber_policy_t clobber_policy) { default: /* Should never get here. */ - advise (NULL, "will not overwrite %s, invalid clobber policy", buffer); + inform("will not overwrite %s, invalid clobber policy", buffer); free (buffer); return NULL; } @@ -1209,7 +1194,7 @@ next_version (char *file, enum clobber_policy_t clobber_policy) { free (file); if (version >= max_versions) { - advise (NULL, "will not overwrite %s, too many versions", buffer); + inform("will not overwrite %s, too many versions", buffer); free (buffer); buffer = NULL; } @@ -1241,7 +1226,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { /* Save cwd for possible use in loop below. */ char *slash; - cwd = add (original_file, NULL); + cwd = mh_xstrdup(original_file); slash = strrchr (cwd, '/'); if (slash) { @@ -1291,7 +1276,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { free (prompt); } else { /* Overwrite, that's what nmh used to do. And warn. */ - advise (NULL, "-clobber ask but no tty, so overwrite %s", file); + inform("-clobber ask but no tty, so overwrite %s", file); break; } @@ -1311,17 +1296,17 @@ clobber_check (char *original_file, mhstoreinfo_t info) { file = NULL; ++info->files_not_clobbered; } else { - TrimSuffixC(buf, '\n'); + trim_suffix_c(buf, '\n'); } free (file); if (buf[0] == '/') { /* Full path, use it. */ - file = add (buf, NULL); + file = mh_xstrdup(buf); } else { /* Relative path. */ - file = cwd ? concat (cwd, "/", buf, NULL) : add (buf, NULL); + file = cwd ? concat (cwd, "/", buf, NULL) : mh_xstrdup(buf); } check_again = 1; @@ -1335,7 +1320,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { if (stat (file, &st) == OK) { /* Keep count of files that would have been clobbered, and return that as process exit status. */ - advise (NULL, "will not overwrite %s with -clobber never", file); + inform("will not overwrite %s with -clobber never", file); free (file); file = NULL; ++info->files_not_clobbered; @@ -1351,5 +1336,12 @@ clobber_check (char *original_file, mhstoreinfo_t info) { return file; } +static bool use_param_as_filename(const char *p) +{ + /* Preserve result of original test that considered an empty string + * OK. */ + return !*p || (!strchr("/.|!", *p) && !strchr(p, '%')); +} + /* -clobber support */ /******************************************************************************/