diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2010-08-14 00:54:24 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2010-08-14 00:54:24 +0000 |
commit | f2b534d341b5de0e8deb492e347ae7ad0b99f728 (patch) | |
tree | 8d0b10e569b8442856250d14d15eab8e7e45692c /package/uhttpd/src/uhttpd-cgi.c | |
parent | 63991ba875e46f40324352a5317d144465567833 (diff) | |
download | upstream-f2b534d341b5de0e8deb492e347ae7ad0b99f728.tar.gz upstream-f2b534d341b5de0e8deb492e347ae7ad0b99f728.tar.bz2 upstream-f2b534d341b5de0e8deb492e347ae7ad0b99f728.zip |
uhttpd: - more robust handling of network failures on static file serving - support unlimited amount of authentication realms, listener and client sockets - support for interpreters (.php => /usr/bin/php-cgi)
SVN-Revision: 22630
Diffstat (limited to 'package/uhttpd/src/uhttpd-cgi.c')
-rw-r--r-- | package/uhttpd/src/uhttpd-cgi.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/package/uhttpd/src/uhttpd-cgi.c b/package/uhttpd/src/uhttpd-cgi.c index 0861249162..f9dd9810da 100644 --- a/package/uhttpd/src/uhttpd-cgi.c +++ b/package/uhttpd/src/uhttpd-cgi.c @@ -135,8 +135,10 @@ static int uh_cgi_error_500(struct client *cl, struct http_request *req, const c } -void uh_cgi_request(struct client *cl, struct http_request *req, struct path_info *pi) -{ +void uh_cgi_request( + struct client *cl, struct http_request *req, + struct path_info *pi, struct interpreter *ip +) { int i, hdroff, bufoff; int hdrlen = 0; int buflen = 0; @@ -199,9 +201,9 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf dup2(rfd[1], 1); dup2(wfd[0], 0); - /* check for regular, world-executable file */ - if( (pi->stat.st_mode & S_IFREG) && - (pi->stat.st_mode & S_IXOTH) + /* check for regular, world-executable file _or_ interpreter */ + if( ((pi->stat.st_mode & S_IFREG) && + (pi->stat.st_mode & S_IXOTH)) || (ip != NULL) ) { /* build environment */ clearenv(); @@ -320,14 +322,17 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf if( chdir(pi->root) ) perror("chdir()"); - execl(pi->phys, pi->phys, NULL); + if( ip != NULL ) + execl(ip->path, ip->path, pi->phys, NULL); + else + execl(pi->phys, pi->phys, NULL); /* in case it fails ... */ printf( "Status: 500 Internal Server Error\r\n\r\n" "Unable to launch the requested CGI program:\n" " %s: %s\n", - pi->phys, strerror(errno) + ip ? ip->path : pi->phys, strerror(errno) ); } |