summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wooding <mdw@distorted.org.uk>2013-02-19 20:22:14 +0000
committerMark Wooding <mdw@distorted.org.uk>2013-02-19 20:41:37 +0000
commitaa0bce91c04ffd1923a623819e5bbe1ccf609a81 (patch)
treecb6e115fc12c878b27da8dedb1026573a73272ed
parent92fc834ef77fe48782f2fb1b0f5c52a22127374c (diff)
downloaduserv-utils-aa0bce91c04ffd1923a623819e5bbe1ccf609a81.tar.gz
www-cgi: Introduce `?DEFAULTS' pattern to match the default set.
-rw-r--r--www-cgi/ucgi.c9
-rw-r--r--www-cgi/ucgi.h1
-rw-r--r--www-cgi/ucgicommon.c16
-rw-r--r--www-cgi/ucgitarget.c3
4 files changed, 21 insertions, 8 deletions
diff --git a/www-cgi/ucgi.c b/www-cgi/ucgi.c
index 5e6a1b8..980bec5 100644
--- a/www-cgi/ucgi.c
+++ b/www-cgi/ucgi.c
@@ -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");
diff --git a/www-cgi/ucgi.h b/www-cgi/ucgi.h
index 765367a..9fbf70c 100644
--- a/www-cgi/ucgi.h
+++ b/www-cgi/ucgi.h
@@ -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);
diff --git a/www-cgi/ucgicommon.c b/www-cgi/ucgicommon.c
index 4bba186..73565b5 100644
--- a/www-cgi/ucgicommon.c
+++ b/www-cgi/ucgicommon.c
@@ -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");
diff --git a/www-cgi/ucgitarget.c b/www-cgi/ucgitarget.c
index 030f068..2b6a222 100644
--- a/www-cgi/ucgitarget.c
+++ b/www-cgi/ucgitarget.c
@@ -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");