X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/fbcfb25715ddbb522c8efac3faec1eca4811683d..74b1f70dbce97198dc741ddd61214e55138f826f:/server/cgi.c diff --git a/server/cgi.c b/server/cgi.c index 2189532..2017d1b 100644 --- a/server/cgi.c +++ b/server/cgi.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004, 2005, 2006 Richard Kettlewell + * Copyright (C) 2004-2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -152,13 +152,14 @@ static void cgi_parse_multipart(const char *boundary) { } static void cgi_parse_post(void) { - const char *ct; - char *q, *type, *pname, *pvalue; + const char *ct, *boundary; + char *q, *type; size_t n; + struct kvp *k; if(!(ct = getenv("CONTENT_TYPE"))) ct = "application/x-www-form-urlencoded"; - if(mime_content_type(ct, &type, &pname, &pvalue)) + if(mime_content_type(ct, &type, &k)) fatal(0, "invalid content type '%s'", ct); if(!strcmp(type, "application/x-www-form-urlencoded")) { cgi_input(&q, &n); @@ -166,10 +167,9 @@ static void cgi_parse_post(void) { return; } if(!strcmp(type, "multipart/form-data")) { - if(!pname || strcmp(pname, "boundary")) - fatal(0, "expected a boundary parameter, found %s", - pname ? pname : "nothing"); - cgi_parse_multipart(pvalue); + if(!(boundary = kvp_get(k, "boundary"))) + fatal(0, "no boundary parameter found"); + cgi_parse_multipart(boundary); return; } fatal(0, "unrecognized content type '%s'", type); @@ -585,14 +585,29 @@ const char *cgi_label(const char *key) { read_options(); if(!(label = kvp_get(labels, key))) { - if((label = strchr(key, '.'))) + /* No label found */ + if(!strncmp(key, "images.", 7)) { + static const char *url_static; + /* images.X defaults to X.png */ + + if(!url_static) + url_static = cgi_label("url.static"); + byte_xasprintf((char **)&label, "%s%s.png", url_static, key + 7); + } else if((label = strchr(key, '.'))) + /* X.Y defaults to Y */ ++label; else + /* otherwise default to label name */ label = key; } return label; } +int cgi_label_exists(const char *key) { + read_options(); + return kvp_get(labels, key) ? 1 : 0; +} + char **cgi_columns(const char *name, int *ncolumns) { struct column *c;