X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=libs%2Fshttpd%2Fcompat_unix.c;fp=libs%2Fshttpd%2Fcompat_unix.c;h=b0777e94bdcd35c7e8b52ec2166e7dbeec61d646;hb=1dee4e3cd008a27789bbce05b0eb47b0eb5d121a;hp=649d0c8f21f4ec98b227e005b5d40827c4beec77;hpb=3dc3ac3cfe10b7196a7977e9c041c29fa141c35e;p=fms.git diff --git a/libs/shttpd/compat_unix.c b/libs/shttpd/compat_unix.c index 649d0c8..b0777e9 100644 --- a/libs/shttpd/compat_unix.c +++ b/libs/shttpd/compat_unix.c @@ -74,8 +74,9 @@ int 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 */ @@ -87,6 +88,7 @@ spawn_process(struct conn *c, const char *prog, char *envblk, } else if (pid == 0) { /* Child */ + (void) chdir(dir); (void) dup2(sock, 0); (void) dup2(sock, 1); @@ -96,19 +98,22 @@ spawn_process(struct conn *c, const char *prog, char *envblk, 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 {