+void yf::CGI::Rep::child(Z_HTTP_Request *hreq, const CGI::Exec *it)
+{
+ const char *path_cstr = hreq->path;
+ std::string path(path_cstr);
+ const char *program_cstr = it->program.c_str();
+ std::string script_name(path, 0, it->path.length());
+ std::string rest(path, it->path.length());
+ std::string query_string;
+ std::string path_info;
+ size_t qpos = rest.find('?');
+ if (qpos == std::string::npos)
+ path_info = rest;
+ else
+ {
+ query_string.assign(rest, qpos + 1, std::string::npos);
+ path_info.assign(rest, 0, qpos);
+ }
+ setenv("REQUEST_METHOD", hreq->method, 1);
+ setenv("REQUEST_URI", path_cstr, 1);
+ setenv("SCRIPT_NAME", script_name.c_str(), 1);
+ setenv("PATH_INFO", path_info.c_str(), 1);
+ setenv("QUERY_STRING", query_string.c_str(), 1);
+ const char *v;
+ v = z_HTTP_header_lookup(hreq->headers, "Cookie");
+ if (v)
+ setenv("HTTP_COOKIE", v, 1);
+ v = z_HTTP_header_lookup(hreq->headers, "User-Agent");
+ if (v)
+ setenv("HTTP_USER_AGENT", v, 1);
+ v = z_HTTP_header_lookup(hreq->headers, "Accept");
+ if (v)
+ setenv("HTTP_ACCEPT", v, 1);
+ v = z_HTTP_header_lookup(hreq->headers, "Accept-Encoding");
+ if (v)
+ setenv("HTTP_ACCEPT_ENCODING", v, 1);
+ setenv("DOCUMENT_ROOT", documentroot.c_str(), 1);
+ setenv("GATEWAY_INTERFACE", "CGI/1.1", 1);
+ // apply user-defined environment
+ std::map<std::string,std::string>::const_iterator it_e;
+ for (it_e = env_map.begin();
+ it_e != env_map.end(); it_e++)
+ setenv(it_e->first.c_str(), it_e->second.c_str(), 1);
+ // change directory to configuration root
+ // then to CGI program directory (could be relative)
+ chdir(documentroot.c_str());
+ char *program = xstrdup(program_cstr);
+ char *cp = strrchr(program, '/');
+ if (cp)
+ {
+ *cp++ = '\0';
+ chdir(program);
+ }
+ else
+ cp = program;
+ int r = execl(cp, cp, (char *) 0);
+ if (r == -1)
+ exit(1);
+ exit(0);
+}
+