X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/6207d2f3bcf38c072c2bcaa7c9e8dbd469b5e8e6..9bce81d175de1bc9aa90a4fbf24e3121ea294fa6:/lib/mime.c diff --git a/lib/mime.c b/lib/mime.c index 8776647..90372c9 100644 --- a/lib/mime.c +++ b/lib/mime.c @@ -35,6 +35,7 @@ #include "hex.h" #include "log.h" #include "base64.h" +#include "kvp.h" /** @brief Match whitespace characters */ static int whitespace(int c) { @@ -208,17 +209,17 @@ static const char *parsetoken(const char *s, char **valuep, /** @brief Parse a MIME content-type field * @param s Start of field * @param typep Where to store type - * @param parameternamep Where to store parameter name - * @param parametervaluep Wher to store parameter value + * @param parametersp Where to store parameter list * @return 0 on success, non-0 on error * * See RFC 2045 s5. */ int mime_content_type(const char *s, char **typep, - char **parameternamep, - char **parametervaluep) { + struct kvp **parametersp) { struct dynstr type, parametername; + struct kvp *parameters = 0; + char *parametervalue; dynstr_init(&type); if(!(s = skipwhite(s, 1))) return -1; @@ -233,7 +234,7 @@ int mime_content_type(const char *s, dynstr_append(&type, tolower((unsigned char)*s++)); if(!(s = skipwhite(s, 1))) return -1; - if(*s == ';') { + while(*s == ';') { dynstr_init(¶metername); ++s; if(!(s = skipwhite(s, 1))) return -1; @@ -243,14 +244,14 @@ int mime_content_type(const char *s, if(!(s = skipwhite(s, 1))) return -1; if(*s++ != '=') return -1; if(!(s = skipwhite(s, 1))) return -1; - if(!(s = parseword(s, parametervaluep, tspecial))) return -1; + if(!(s = parseword(s, ¶metervalue, tspecial))) return -1; if(!(s = skipwhite(s, 1))) return -1; dynstr_terminate(¶metername); - *parameternamep = parametername.vec; - } else - *parametervaluep = *parameternamep = 0; + kvp_set(¶meters, parametername.vec, parametervalue); + } dynstr_terminate(&type); *typep = type.vec; + *parametersp = parameters; return 0; }