--- lighttpd-1.4.20.orig/src/spawn-fcgi.c 2008-09-30 10:53:27.000000000 +0200 +++ lighttpd-1.4.20/src/spawn-fcgi.c 2008-09-30 10:53:41.000000000 +0200 @@ -37,7 +37,7 @@ typedef int socklen_t; #endif #ifdef HAVE_SYS_UN_H -int fcgi_spawn_connection(char *appPath, char **appArgv, char *addr, unsigned short port, const char *unixsocket, int fork_count, int child_count, int pid_fd, int nofork) { +int fcgi_spawn_connection(char *appPath, const char *fcgi_dir, char **appArgv, char *addr, unsigned short port, const char *unixsocket, int fork_count, int child_count, int pid_fd, int nofork) { int fcgi_fd; int socket_type, status, rc = 0; struct timeval tv = { 0, 100 * 1000 }; @@ -184,6 +184,13 @@ int fcgi_spawn_connection(char *appPath, strcat(b, appPath); /* exec the cgi */ + if(fcgi_dir) + { + if(chdir(fcgi_dir) != 0) + { + exit(errno); + } + } execl("/bin/sh", "sh", "-c", b, (char *)NULL); } @@ -273,6 +280,7 @@ void show_help () { "\n" \ "Options:\n" \ " -f filename of the fcgi-application\n" \ +" -d chdir to directory before spawning\n" \ " -a bind to ip address\n" \ " -p bind to tcp-port\n" \ " -s bind to unix-domain socket\n" \ @@ -292,7 +300,7 @@ void show_help () { int main(int argc, char **argv) { - char *fcgi_app = NULL, *changeroot = NULL, *username = NULL, + char *fcgi_app = NULL, *fcgi_dir = NULL, *changeroot = NULL, *username = NULL, *groupname = NULL, *unixsocket = NULL, *pid_file = NULL, *addr = NULL; char **fcgi_app_argv = { NULL }; @@ -306,9 +314,10 @@ int main(int argc, char **argv) { i_am_root = (getuid() == 0); - while (-1 != (o = getopt(argc, argv, "c:f:g:hna:p:u:vC:F:s:P:"))) { + while(-1 != (o = getopt(argc, argv, "c:f:d:g:hna:p:u:vC:s:P:"))) { switch(o) { case 'f': fcgi_app = optarg; break; + case 'd': fcgi_dir = optarg; break; case 'a': addr = optarg;/* ip addr */ break; case 'p': port = strtol(optarg, NULL, 10);/* port */ break; case 'C': child_count = strtol(optarg, NULL, 10);/* */ break; @@ -471,7 +480,7 @@ int main(int argc, char **argv) { } } - return fcgi_spawn_connection(fcgi_app, fcgi_app_argv, addr, port, unixsocket, fork_count, child_count, pid_fd, nofork); + return fcgi_spawn_connection(fcgi_app, fcgi_dir, fcgi_app_argv, addr, port, unixsocket, fork_count, child_count, pid_fd, nofork); } #else int main() {