From 0bf05c0c6b9df2c91bdd6e51780e564568a5a282 Mon Sep 17 00:00:00 2001 From: jow Date: Sat, 14 Aug 2010 00:54:24 +0000 Subject: [package] 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) git-svn-id: svn://svn.openwrt.org/openwrt/trunk/package/uhttpd/src@22630 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- uhttpd-cgi.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'uhttpd-cgi.c') diff --git a/uhttpd-cgi.c b/uhttpd-cgi.c index 0861249..f9dd981 100644 --- a/uhttpd-cgi.c +++ b/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) ); } -- cgit v1.2.1