* $Id$
*/
+#include <ctype.h>
+#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "ucgi.h"
-const char *const envok[]= {
- "AUTH_TYPE",
- "CONTENT_LENGTH",
- "CONTENT_TYPE",
- "DOCUMENT_ROOT",
- "GATEWAY_INTERFACE",
- "HTTP_ACCEPT",
- "HTTP_ACCEPT_CHARSET",
- "HTTP_ACCEPT_ENCODING",
- "HTTP_ACCEPT_LANGUAGE",
- "HTTP_CACHE_CONTROL",
- "HTTP_CONNECTION",
- "HTTP_CONTENT_ENCODING",
- "HTTP_COOKIE",
- "HTTP_DNT",
- "HTTP_HOST",
- "HTTP_KEEP_ALIVE",
- "HTTP_NEGOTIATE",
- "HTTP_PRAGMA",
- "HTTP_REFERER",
- "HTTP_USER_AGENT",
- "HTTP_VIA",
- "HTTP_X_FORWARDED_FOR",
- "HTTPS",
- "PATH_INFO",
- "PATH_TRANSLATED",
- "QUERY_STRING",
- "REMOTE_ADDR",
- "REMOTE_HOST",
- "REMOTE_USER",
- "REMOTE_IDENT",
- "REQUEST_METHOD",
- "REQUEST_URI",
- "SCRIPT_FILENAME",
- "SCRIPT_NAME",
- "SCRIPT_URI",
- "SCRIPT_URL",
- "SERVER_ADDR",
- "SERVER_ADMIN",
- "SERVER_NAME",
- "SERVER_PORT",
- "SERVER_PROTOCOL",
- "SERVER_SIGNATURE",
- "SERVER_SOFTWARE",
- 0
-};
-const int nenvok= sizeof(envok)/sizeof(envok[0]);
-
int debugmode= 0;
static void outerror(void) {
if (setenv(en,ev,overwrite)) syserror("setenv");
}
+const char **load_filters(unsigned flags, const char *first, ...)
+{
+ va_list ap;
+ const char *name, *p, *q, **v;
+ char *pp;
+ size_t l, n, sz;
+ FILE *fp;
+ char buf[MAX_ENVVAR_NAME];
+
+ D( if (debugmode) printf(";; load_filters...\n"); )
+ va_start(ap, first);
+ for (name= first; name; name= va_arg(ap, const char *)) {
+ fp= fopen(name, "r"); if (fp) goto opened;
+ D( if (debugmode)
+ printf(";; file `%s': %s\n", name, strerror(errno)); )
+ if (errno != ENOENT) syserror("failed to open environment filters");
+ }
+ va_end(ap);
+ if (flags & LOADF_MUST) syserror("failed to open environment filters");
+ D( if (debugmode) printf(";; using default filters\n"); )
+ return 0;
+
+opened:
+ va_end(ap);
+ D( if (debugmode) printf(";; file `%s': OK\n", name); )
+
+ n= 0; sz= 128; v= xmalloc(sz * sizeof(*v));
+ for (;;) {
+ if (!fgets(buf, sizeof(buf), fp)) break;
+ l= strlen(buf);
+ if (buf[l - 1] == '\n') buf[--l]= 0;
+ if (l + 1 == sizeof(buf))
+ error("line too long in environment filter file");
+ p= buf; q= p + l;
+ while (isspace((unsigned char)*p)) p++;
+ while (q > p && isspace((unsigned char)q[-1])) q--;
+ if (*p == '#' || p == q) continue;
+ l= q - p;
+ pp= xmalloc(l + 1);
+ memcpy(pp, p, l);
+ pp[l]= 0;
+ v[n++]= pp;
+ D( if (debugmode) printf(";; filter: `%s'\n", pp); )
+ if (n >= sz) {
+ sz *= 2;
+ v= xrealloc(v, sz * sizeof(*v));
+ }
+ }
+ if (ferror(fp)) syserror("failed to read environment filters");
+ fclose(fp);
+ return v;
+}
+
void filter_environment(unsigned flags, const char *prefix_in,
const char *const *patv,
void (*foundone)(const char *fulln,