chiark / gitweb /
www-cgi: Introduce `?DEFAULTS' pattern to match the default set.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 19 Feb 2013 20:22:14 +0000 (20:22 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 19 Feb 2013 20:41:37 +0000 (20:41 +0000)
www-cgi/ucgi.c
www-cgi/ucgi.h
www-cgi/ucgicommon.c
www-cgi/ucgitarget.c

index 5e6a1b8..980bec5 100644 (file)
@@ -76,7 +76,7 @@ static void add_userv_var(const char *fulln,
 int main(int argc, const char **argv) {
   char *username;
   const char *slash2, *pathi, *ev, *av;
-  const char *const *envok;
+  const char *const *envok = 0;
   size_t usernamelen, l;
   struct buildargs args;
   pid_t child, rchild;
@@ -97,10 +97,8 @@ int main(int argc, const char **argv) {
   ev= getenv("UCGI_ENV_FILTER");
   if (ev)
     envok= load_filters(LOADF_MUST, ev, LF_END);
-  else {
+  else
     envok= load_filters(0, "/etc/userv/ucgi.env-filter", LF_END);
-    if (!envok) envok= default_envok;
-  }
 
   pathi= getenv("PATH_INFO");
   if (!pathi) error("PATH_INFO not found");
@@ -126,7 +124,8 @@ int main(int argc, const char **argv) {
   addarg(&args, "userv");
   if (debugmode) addarg(&args, "-DDEBUG=1");
 
-  filter_environment(FILTF_WILDCARD, "", envok, add_userv_var, &args);
+  filter_environment(FILTF_WILDCARD, "", envok, default_envok,
+                    add_userv_var, &args);
 
   addarg(&args, username);
   addarg(&args, "www-cgi");
index 765367a..9fbf70c 100644 (file)
@@ -48,6 +48,7 @@ const char **load_filters(unsigned flags, const char *first, ...);
 
 void filter_environment(unsigned flags, const char *prefix_in,
                        const char *const *patv,
+                       const char *const *defaults,
                        void (*foundone)(const char *fulln, const char *en,
                                         const char *ev, void *p),
                        void *p);
index 4bba186..73565b5 100644 (file)
@@ -18,6 +18,7 @@
  * $Id$
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -126,16 +127,28 @@ opened:
 
 static int envvar_match(unsigned flags, const char *en,
                        const char *const *patv,
+                       const char *const *defaults,
                        const char **ev)
 {
   const char *const *patp;
   const char *q, *pat;
   int acceptp;
+  int rc;
 
+  if (!patv) { patv= defaults; defaults= 0; }
   for (patp= patv; (pat= *patp); patp++) {
     q= en;
     acceptp= 1;
     if (*pat == '!' && (flags & FILTF_WILDCARD)) { acceptp= 0; pat++; }
+    else if (*pat == '?') {
+      if (strcmp(pat + 1, "DEFAULTS") == 0) {
+       assert(defaults);
+       rc= envvar_match(flags, en, defaults, 0, ev);
+       if (rc) return rc;
+      } else
+       error("unknown pattern directive");
+      continue;
+    }
 
     for (;;) {
       if (!*pat) {
@@ -174,6 +187,7 @@ match:
 
 void filter_environment(unsigned flags, const char *prefix_in,
                        const char *const *patv,
+                       const char *const *defaults,
                        void (*foundone)(const char *fulln,
                                         const char *en, const char *ev,
                                         void *p),
@@ -191,7 +205,7 @@ void filter_environment(unsigned flags, const char *prefix_in,
       D( if (debugmode) printf(";;     doesn't match prefix\n"); )
       continue;
     }
-    if (envvar_match(flags, en + pn, patv, &ev) > 0) {
+    if (envvar_match(flags, en + pn, patv, defaults, &ev) > 0) {
       n= strcspn(en, "=");
       if (n >= sizeof(enbuf))
        error("environment variable name too long");
index 030f068..2b6a222 100644 (file)
@@ -135,10 +135,9 @@ int main(int argc, char **argv) {
                        ".userv/ucgitarget.env-filter",
                        "/etc/userv/ucgitarget.env-filter",
                        LF_END);
-    if (!envok) envok= default_envok;
   }
 
-  filter_environment(0, "USERV_U_E_", envok, setenvar, 0);
+  filter_environment(0, "USERV_U_E_", envok, default_envok, setenvar, 0);
 
   scriptpath= 0;
   pathi= getenv("PATH_INFO");