switch (ct->c_type) {
case CT_MULTIPART:
return store_multi (ct);
- break;
case CT_MESSAGE:
switch (ct->c_subtype) {
case MESSAGE_PARTIAL:
return store_partial (ct);
- break;
case MESSAGE_EXTERNAL:
return store_external (ct);
case MESSAGE_RFC822:
default:
return store_generic (ct);
- break;
}
- break;
case CT_APPLICATION:
return store_application (ct);
- break;
case CT_TEXT:
case CT_AUDIO:
case CT_IMAGE:
case CT_VIDEO:
return store_generic (ct);
- break;
default:
adios (NULL, "unknown content type %d", ct->c_type);
- break;
}
return OK; /* NOT REACHED */
static int
store_application (CT ct)
{
- char **ap, **ep;
CI ci = &ct->c_ctinfo;
+ PM pm;
/* Check if the content specifies a filename */
if (autosw)
if (!ct->c_storeproc && ct->c_subtype == APPLICATION_OCTETS) {
int tarP = 0, zP = 0, gzP = 0;
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
+ for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
/* check for "type=tar" attribute */
- if (!strcasecmp (*ap, "type")) {
- if (strcasecmp (*ep, "tar"))
+ if (!strcasecmp (pm->pm_name, "type")) {
+ if (strcasecmp (pm->pm_value, "tar"))
break;
tarP = 1;
}
/* check for "conversions=compress" attribute */
- if ((!strcasecmp (*ap, "conversions") || !strcasecmp (*ap, "x-conversions"))
- && (!strcasecmp (*ep, "compress") || !strcasecmp (*ep, "x-compress"))) {
+ if ((!strcasecmp (pm->pm_name, "conversions") ||
+ !strcasecmp (pm->pm_name, "x-conversions"))
+ && (!strcasecmp (pm->pm_value, "compress") ||
+ !strcasecmp (pm->pm_value, "x-compress"))) {
zP = 1;
continue;
}
/* check for "conversions=gzip" attribute */
- if ((!strcasecmp (*ap, "conversions") || !strcasecmp (*ap, "x-conversions"))
- && (!strcasecmp (*ep, "gzip") || !strcasecmp (*ep, "x-gzip"))) {
+ if ((!strcasecmp (pm->pm_name, "conversions") ||
+ !strcasecmp (pm->pm_name, "x-conversions"))
+ && (!strcasecmp (pm->pm_value, "gzip") ||
+ !strcasecmp (pm->pm_value, "x-gzip"))) {
gzP = 1;
continue;
}
char *tmpfilenam, *folder;
/* Store content in temporary file for now */
- tmpfilenam = m_mktemp(invo_name, NULL, NULL);
+ if ((tmpfilenam = m_mktemp(invo_name, NULL, NULL)) == NULL) {
+ adios(NULL, "unable to create temporary file in %s",
+ get_temp_dir());
+ }
ct->c_storage = add (tmpfilenam, NULL);
/* Get the folder name */
if ((ct->c_storage = clobber_check (add (buffer, NULL))) == NULL) {
return NOTOK;
}
- } /* else output filename was explicitly specified, so use it */
+ } else {
+ /* The output filename was explicitly specified, so use it. */
+ if ((ct->c_storage = clobber_check (add (ct->c_storage, NULL))) ==
+ NULL) {
+ return NOTOK;
+ }
+ }
got_filename:
/* flush the output stream */
*/
if (ct->c_folder && (!is_partial || last_partial)) {
msgnum = output_content_folder (ct->c_folder, ct->c_storage);
- unlink (ct->c_storage);
+ (void) m_unlink (ct->c_storage);
if (msgnum == NOTOK)
return NOTOK;
}
buflen--;
continue;
} else {
- char **ap, **ep;
+ PM pm;
char *s = "";
- for (ap = ci->ci_attrs, ep = ci->ci_values;
- *ap; ap++, ep++) {
- snprintf (bp, buflen, "%s%s=\"%s\"", s, *ap, *ep);
+ for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
+ snprintf (bp, buflen, "%s%s=\"%s\"", s,
+ pm->pm_name, pm->pm_value);
len = strlen (bp);
bp += len;
buflen -= len;
static void
get_storeproc (CT ct)
{
- char **ap, **ep, *cp;
+ char *cp;
CI ci;
+ PM pm;
/*
* If the storeproc has already been defined,
* use that (RFC-2183).
*/
if (ct->c_dispo) {
- char *cp = strchr (ct->c_dispo, ';');
- CI ci = calloc (1, sizeof *ci);
- int status;
int found_filename = 0;
- if (cp && parse_header_attrs (ct->c_file, strlen (invo_name) + 2, &cp,
- ci, &status) == OK) {
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- if (! strcasecmp (*ap, "filename")
- && *(cp = *ep) != '/'
+ for (pm = ct->c_dispo_first; pm; pm = pm->pm_next) {
+ if (! strcasecmp (pm->pm_name, "filename")
+ && *(cp = pm->pm_value) != '/'
&& *cp != '.'
&& *cp != '|'
&& *cp != '!'
&& !strchr (cp, '%')) {
- ct->c_storeproc = add (cp, NULL);
- found_filename = 1;
- }
- free (*ap);
+ ct->c_storeproc = add (cp, NULL);
+ found_filename = 1;
}
}
- free (ci);
if (found_filename) return;
}
* the storeproc.
*/
ci = &ct->c_ctinfo;
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- if (! strcasecmp (*ap, "name")
- && *(cp = *ep) != '/'
+ for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
+ if (! strcasecmp (pm->pm_name, "name")
+ && *(cp = pm->pm_value) != '/'
&& *cp != '.'
&& *cp != '|'
&& *cp != '!'