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;
/* 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);
ct = *ctq++;
if (store_content (ct, NULL, info) == NOTOK) {
losing:
- free ((char *) base);
+ free(base);
return NOTOK;
}
goto losing;
}
- free ((char *) base);
+ free(base);
return OK;
}
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);
}
}
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);
/* 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;
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])
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;
}
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 {
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);
}
}
}
- while (fgets (buffer, sizeof(buffer) - 1, ct->c_fp)) {
+ while (fgets (buffer, sizeof buffer, ct->c_fp)) {
if ((pos += strlen (buffer)) > last) {
int diff;
* 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);
}
/*
* 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);
}
/* 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) {
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;
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 */
/******************************************************************************/