+static const char *const default_envok[] = {
+ "AUTH_TYPE",
+ "CONTENT_TYPE",
+ "CONTENT_LENGTH",
+ "DOCUMENT_ROOT",
+ "GATEWAY_INTERFACE",
+ "HTTP_*",
+ "HTTPS",
+ "PATH_INFO",
+ "PATH_TRANSLATED",
+ "QUERY_STRING",
+ "REDIRECT_*",
+ "REMOTE_*",
+ "REQUEST_METHOD",
+ "REQUEST_URI",
+ "SCRIPT_*",
+ "SERVER_*",
+ "SSL_*",
+ 0
+};
+
+struct buildargs {
+ const char **v;
+ int n, max;
+};
+
+static void addarg(struct buildargs *args, const char *a) {
+ if (args->n > args->max) error("too many arguments", 500);
+ args->v[args->n++]= a;
+}
+
+static void add_userv_var(const char *fulln,
+ const char *en, const char *ev, void *p) {
+ struct buildargs *args= p;
+ size_t l;
+ char *a;
+
+ l= strlen(ev);
+ if (l > MAX_ENVVAR_VALUE) error("environment variable too long", 500);
+ a= xmalloc(strlen(en)+l+6);
+ sprintf(a,"-DE_%s=%s",en,ev);
+ addarg(args, a);
+}
+