spawn_process(struct conn *c, const char *prog, char *envblk,
char *envp[], int sock, const char *dir)
{
- int ret;
- pid_t pid;
+ int ret;
+ pid_t pid;
+ const char *p, *interp = c->ctx->options[OPT_CGI_INTERPRETER];
envblk = NULL; /* unused */
} else if (pid == 0) {
/* Child */
+
(void) chdir(dir);
(void) dup2(sock, 0);
(void) dup2(sock, 1);
if (c->ctx->error_log)
(void) dup2(fileno(c->ctx->error_log), 2);
+ if ((p = strrchr(prog, '/')) != NULL)
+ p++;
+ else
+ p = prog;
+
/* Execute CGI program */
- if (c->ctx->cgi_interpreter == NULL) {
- (void) execle(prog, prog, NULL, envp);
+ if (interp == NULL) {
+ (void) execle(p, p, NULL, envp);
elog(E_FATAL, c, "redirect: exec(%s)", prog);
} else {
- (void) execle(c->ctx->cgi_interpreter,
- c->ctx->cgi_interpreter, prog, NULL, envp);
+ (void) execle(interp, interp, p, NULL, envp);
elog(E_FATAL, c, "redirect: exec(%s %s)",
- c->ctx->cgi_interpreter, prog);
+ interp, prog);
}
/* UNREACHED */
- ret = -1;
exit(EXIT_FAILURE);
} else {