X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv-utils.git;a=blobdiff_plain;f=www-cgi%2Fucgitarget.c;h=6c579b69ff5aad5ee7ba6f1c0488f43d68b929af;hp=9780e360f3f17b371f01d13db05ea49edf5a71f7;hb=f7b4be5ac332970bb5937ae586cea6de64d14f66;hpb=a8e8db26410497a781ca36f59951201d55711f3a diff --git a/www-cgi/ucgitarget.c b/www-cgi/ucgitarget.c index 9780e36..6c579b6 100644 --- a/www-cgi/ucgitarget.c +++ b/www-cgi/ucgitarget.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,7 @@ #include "ucgi.h" -static const char *const envok[]= { +static const char *const default_envok[]= { "AUTH_TYPE", "CONTENT_LENGTH", "CONTENT_TYPE", @@ -85,13 +86,15 @@ static void setenvar(const char *fulln, unsetenv(fulln); } -int main(int argc, const char **argv) { +int main(int argc, char **argv) { char *scriptpath, *newvar; const char *nextslash, *lastslash, *pathi, *ev, *ev2, *scriptdir, *av; + const char *const *envok; const char **arguments; size_t scriptdirlen, scriptpathlen, l; struct stat stab; - int r, nargs; + int i, r, nargs; + const char *filters= 0; ev= getenv("USERV_U_DEBUG"); if (ev && *ev) debugmode= 1; @@ -99,7 +102,16 @@ int main(int argc, const char **argv) { D( if (debugmode) printf(";;; UCGITARGET\n"); ) if (argc > MAX_ARGS) error("too many arguments"); - if (!*++argv) error("no script directory argument"); + for (;;) { + i= getopt(argc, argv, "+e:"); if (i < 0) break; + switch (i) { + case 'e': filters= optarg; break; + default: error("bad command line"); break; + } + } + argc -= optind; argv += optind; + + if (!*argv) error("no script directory argument"); ev= getenv("HOME"); if (!ev) error("no HOME env. var"); l= strlen(*argv)+strlen(ev); newvar= xmalloc(l+2); @@ -107,6 +119,16 @@ int main(int argc, const char **argv) { scriptdir= newvar; scriptdirlen= strlen(scriptdir); + if (filters) + envok= load_filters(LOADF_MUST, filters, LF_END); + else { + envok= load_filters(0, + ".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); scriptpath= 0;