version 0.2.1
[fms.git] / libs / shttpd / compat_unix.c
index 649d0c8..b0777e9 100644 (file)
@@ -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 {