static size_t param_len(PM, int, size_t, int *);
static size_t encode_param(PM, char *, size_t, size_t, size_t, int);
static size_t normal_param(PM, char *, size_t, size_t, size_t);
-static int get_dispo (char *, CT);
+static int get_dispo (char *, CT, int);
struct str2init str2cts[] = {
{ "application", CT_APPLICATION, InitApplication },
}
else if (!strcasecmp (hp->name, DISPO_FIELD)) {
/* Get Content-Disposition field */
- if (get_dispo(hp->value, ct) == NOTOK)
+ if (get_dispo(hp->value, ct, 0) == NOTOK)
goto out;
}
* Get any {Content-Disposition} given in buffer.
*/
if (magic && *cp == '{') {
- ct->c_dispo = ++cp;
+ ++cp;
for (dp = cp + strlen (cp) - 1; dp >= cp; dp--)
if (*dp == '}')
break;
c = *dp;
*dp = '\0';
- if (*ct->c_dispo)
- ct->c_dispo = concat (ct->c_dispo, "\n", NULL);
- else
- ct->c_dispo = NULL;
+
+ if (get_dispo(cp, ct, 1) != OK)
+ return NOTOK;
+
*dp++ = c;
cp = dp;
* get_ctinfo().
*/
static int
-get_dispo (char *cp, CT ct)
+get_dispo (char *cp, CT ct, int buildflag)
{
- char *dp;
+ char *dp, *dispoheader;
char c;
int status;
- /* Save the whole copy of the Content-Disposition header */
+ /*
+ * Save the whole copy of the Content-Disposition header, unless we're
+ * processing a mhbuild directive. A NULL c_dispo will be a flag to
+ * mhbuild that the disposition header needs to be generated at that
+ * time.
+ */
- cp = ct->c_dispo = add(cp, NULL);
+ dispoheader = cp = add(cp, NULL);
while (isspace ((unsigned char) *cp)) /* trim leading spaces */
cp++;
if (debugsw)
fprintf (stderr, "%s: %s\n", DISPO_FIELD, cp);
- if (*cp == '(' && get_comment (ct->c_file, DISPO_FIELD, &cp, NULL) == NOTOK)
+ if (*cp == '(' && get_comment (ct->c_file, DISPO_FIELD, &cp, NULL) ==
+ NOTOK) {
+ free(dispoheader);
return NOTOK;
+ }
for (dp = cp; istoken (*dp); dp++)
continue;
if ((status = parse_header_attrs (ct->c_file, DISPO_FIELD, &cp,
&ct->c_dispo_first, &ct->c_dispo_last,
NULL)) != OK) {
- return status == NOTOK ? NOTOK : OK;
- }
-
- if (*cp) {
+ if (status == NOTOK) {
+ free(dispoheader);
+ return NOTOK;
+ }
+ } else if (*cp) {
advise (NULL,
"extraneous information in message %s's %s: field\n%*s(%s)",
ct->c_file, DISPO_FIELD, strlen(invo_name) + 2, "", cp);
}
+ if (buildflag)
+ free(dispoheader);
+ else
+ ct->c_dispo = dispoheader;
+
return OK;
}
while (curlen + 8 > CPERLIN - 1) {
int curvallen = strlen(params->pm_value + valoff) -
- (initialwidth + curlen - (CPERLIN - 1));
+ (curlen + 8 - (CPERLIN - 1));
*q++ = ';';
*q++ = '\n';
q += snprintf(q, sizeof(line) - (q - line), "%s*%d",
params->pm_name, index);
} else {
- q = strncpy(q, params->pm_name, sizeof(line) - (q - line));
+ strncpy(q, params->pm_name, sizeof(line) - (q - line));
+ q += strlen(q);
}
if (eightbit)