X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/012d05c2b62332eb400d66b806e48216d39358c6..792d7e1e:/uip/mhstoresbr.c?ds=inline diff --git a/uip/mhstoresbr.c b/uip/mhstoresbr.c index 62b2f4af..515699d8 100644 --- a/uip/mhstoresbr.c +++ b/uip/mhstoresbr.c @@ -40,10 +40,13 @@ 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 = mh_xmalloc (sizeof *info); + mhstoreinfo_t info; + NEW(info); info->cts = ct; info->cwd = pwd; info->autosw = asw; @@ -115,7 +118,7 @@ store_all_messages (mhstoreinfo_t info) * store any contents. */ if ((cp = context_find (nmhstorage)) && *cp) - info->dir = getcpy (cp); + info->dir = mh_xstrdup(cp); else info->dir = getcpy (info->cwd); @@ -291,7 +294,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); @@ -344,9 +347,7 @@ store_partial (CT ct, mhstoreinfo_t info) return NOTOK; } - if ((base = (CT *) mh_xcalloc ((size_t) (i + 1), sizeof(*base))) == NULL) - adios (NULL, "out of memory"); - + base = mh_xcalloc(i + 1, sizeof *base); ctq = base; for (ctp = info->cts; *ctp; ctp++) { p = *ctp; @@ -396,7 +397,7 @@ missing_part: ct = *ctq++; if (store_content (ct, NULL, info) == NOTOK) { losing: - free ((char *) base); + free(base); return NOTOK; } @@ -406,7 +407,7 @@ losing: goto losing; } - free ((char *) base); + free(base); return OK; } @@ -432,16 +433,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); } } @@ -457,7 +453,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); @@ -538,7 +534,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; @@ -576,7 +572,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]) @@ -610,7 +606,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; } @@ -651,7 +647,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 { @@ -675,7 +671,7 @@ got_filename: int cwdlen = strlen (info->cwd); fprintf (stderr, " as file %s\n", - strncmp (ct->c_storage, info->cwd, cwdlen) + !HasPrefix(ct->c_storage, info->cwd) || ct->c_storage[cwdlen] != '/' ? ct->c_storage : ct->c_storage + cwdlen + 1); } @@ -836,7 +832,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; @@ -907,7 +903,7 @@ output_content_folder (char *folder, char *filename) /* Read the folder. */ if ((mp = folder_read (folder, 0))) { /* Link file into folder */ - msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, (char *)0); + msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, NULL); } else { advise (NULL, "unable to read folder %s", folder); return NOTOK; @@ -1069,18 +1065,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); } /* @@ -1089,17 +1080,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); } @@ -1139,19 +1125,22 @@ static enum clobber_policy_t clobber_policy (const char *value) { if (value == NULL || ! strcasecmp (value, "always")) { - } else if (! strcasecmp (value, "auto")) { + return NMH_CLOBBER_ALWAYS; + } + if (! strcasecmp (value, "auto")) { return NMH_CLOBBER_AUTO; - } else if (! strcasecmp (value, "suffix")) { + } + if (! strcasecmp (value, "suffix")) { return NMH_CLOBBER_SUFFIX; - } else if (! strcasecmp (value, "ask")) { + } + if (! strcasecmp (value, "ask")) { return NMH_CLOBBER_ASK; - } else if (! strcasecmp (value, "never")) { + } + if (! strcasecmp (value, "never")) { return NMH_CLOBBER_NEVER; - } else { - adios (NULL, "invalid argument, %s, to clobber", value); } - return NMH_CLOBBER_ALWAYS; + adios (NULL, "invalid argument, %s, to clobber", value); } @@ -1239,7 +1228,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) { @@ -1285,7 +1274,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) { if (isatty (fileno (stdin))) { char *prompt = concat ("Overwrite \"", file, "\" [y/n/rename]? ", NULL); - ans = getans (prompt, answer); + ans = read_switch_multiword (prompt, answer); free (prompt); } else { /* Overwrite, that's what nmh used to do. And warn. */ @@ -1309,20 +1298,17 @@ clobber_check (char *original_file, mhstoreinfo_t info) { file = NULL; ++info->files_not_clobbered; } else { - char *newline = strchr (buf, '\n'); - if (newline) { - *newline = '\0'; - } + TrimSuffixC(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; @@ -1352,5 +1338,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 */ /******************************************************************************/