chiark / gitweb /
choose: Use a one-pass algorithm to select tracks.
[disorder] / server / cgi.c
index 21895325578242ec298bba528b8bc1c57a27ff46..2017d1b5fdf4f31b48f1d00d440dc5da1aa5e93a 100644 (file)
@@ -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 <url.static>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;