diff -ur thttpd-2.21b-orig/Makefile.in thttpd-2.21b/Makefile.in --- thttpd-2.21b-orig/Makefile.in Thu Mar 29 20:36:21 2001 +++ thttpd-2.21b/Makefile.in Mon Aug 13 23:50:27 2001 @@ -46,13 +46,15 @@ # You shouldn't need to edit anything below here. +include php_makefile + CC = @CC@ CCOPT = @V_CCOPT@ DEFS = @DEFS@ INCLS = -I. CFLAGS = $(CCOPT) $(DEFS) $(INCLS) -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ +LDFLAGS = @LDFLAGS@ $(PHP_LDFLAGS) +LIBS = @LIBS@ $(PHP_LIBS) NETLIBS = @V_NETLIBS@ INSTALL = @INSTALL@ @@ -62,7 +64,7 @@ @rm -f $@ $(CC) $(CFLAGS) -c $*.c -SRC = thttpd.c libhttpd.c fdwatch.c mmc.c timers.c match.c tdate_parse.c syslog.c +SRC = thttpd.c libhttpd.c fdwatch.c mmc.c timers.c match.c tdate_parse.c syslog.c php_thttpd.c OBJ = $(SRC:.c=.o) @LIBOBJS@ @@ -151,6 +153,9 @@ tags: ctags -wtd *.c *.h + +php_thttpd.o: php_thttpd.c + $(CC) $(PHP_CFLAGS) $(CFLAGS) -c php_thttpd.c tar: @name=`sed -n -e '/SERVER_SOFTWARE/!d' -e 's,.*thttpd/,thttpd-,' -e 's, .*,,p' version.h` ; \ diff -ur thttpd-2.21b-orig/config.h thttpd-2.21b/config.h --- thttpd-2.21b-orig/config.h Mon Apr 9 23:57:36 2001 +++ thttpd-2.21b/config.h Mon Aug 13 23:51:00 2001 @@ -316,7 +316,7 @@ /* CONFIGURE: A list of index filenames to check. The files are searched ** for in this order. */ -#define INDEX_NAMES "index.html", "index.htm", "Default.htm", "index.cgi" +#define INDEX_NAMES "index.php", "index.html", "index.htm", "Default.htm", "index.cgi" /* CONFIGURE: If this is defined then thttpd will automatically generate ** index pages for directories that don't have an explicit index file. diff -ur thttpd-2.21b-orig/fdwatch.c thttpd-2.21b/fdwatch.c --- thttpd-2.21b-orig/fdwatch.c Fri Apr 13 07:36:08 2001 +++ thttpd-2.21b/fdwatch.c Tue Aug 14 00:00:10 2001 @@ -460,7 +460,7 @@ ridx = 0; for ( i = 0; i < npollfds; ++i ) - if ( pollfds[i].revents & ( POLLIN | POLLOUT ) ) + if ( pollfds[i].revents & ( POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL ) ) poll_rfdidx[ridx++] = pollfds[i].fd; return r; @@ -472,8 +472,8 @@ { switch ( fd_rw[fd] ) { - case FDW_READ: return pollfds[poll_fdidx[fd]].revents & POLLIN; - case FDW_WRITE: return pollfds[poll_fdidx[fd]].revents & POLLOUT; + case FDW_READ: return pollfds[poll_fdidx[fd]].revents & ( POLLIN | POLLERR | POLLHUP | POLLNVAL ); + case FDW_WRITE: return pollfds[poll_fdidx[fd]].revents & ( POLLOUT | POLLERR | POLLHUP | POLLNVAL ); default: return 0; } } diff -ur thttpd-2.21b-orig/libhttpd.c thttpd-2.21b/libhttpd.c --- thttpd-2.21b-orig/libhttpd.c Tue Apr 24 00:42:40 2001 +++ thttpd-2.21b/libhttpd.c Tue Aug 14 00:00:07 2001 @@ -85,6 +85,8 @@ #include "match.h" #include "tdate_parse.h" +#include "php_thttpd.h" + #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif @@ -242,6 +244,8 @@ free( (void*) hs->cwd ); if ( hs->cgi_pattern != (char*) 0 ) free( (void*) hs->cgi_pattern ); + if ( hs->php_pattern != (char*) 0 ) + free( (void*) hs->php_pattern ); if ( hs->charset != (char*) 0 ) free( (void*) hs->charset ); if ( hs->url_pattern != (char*) 0 ) @@ -249,6 +253,7 @@ if ( hs->local_pattern != (char*) 0 ) free( (void*) hs->local_pattern ); free( (void*) hs ); + thttpd_php_shutdown(); } @@ -312,6 +317,7 @@ } hs->port = port; + hs->php_pattern = strdup("**.php"); if ( cgi_pattern == (char*) 0 ) hs->cgi_pattern = (char*) 0; else @@ -385,6 +391,8 @@ return (httpd_server*) 0; } + thttpd_php_init(); + /* Done initializing. */ if ( hs->binding_hostname == (char*) 0 ) syslog( LOG_INFO, "%.80s starting on port %d", SERVER_SOFTWARE, hs->port ); @@ -2353,7 +2361,10 @@ { make_log_entry( hc, nowP ); - if ( hc->file_address != (char*) 0 ) + if ( hc->file_address == (char*) 1 ) + { + thttpd_closed_conn(hc->conn_fd); + } else if ( hc->file_address != (char*) 0 ) { mmc_unmap( hc->file_address, &(hc->sb), nowP ); hc->file_address = (char*) 0; @@ -3026,11 +3037,9 @@ post_post_garbage_hack( httpd_conn* hc ) { char buf[2]; - int r; - r = recv( hc->conn_fd, buf, sizeof(buf), MSG_PEEK ); - if ( r > 0 ) - (void) read( hc->conn_fd, buf, r ); + fcntl(hc->conn_fd, F_SETFL, O_NONBLOCK); + (void) read( hc->conn_fd, buf, 2 ); } @@ -3560,6 +3569,11 @@ ( hc->sb.st_mode & S_IXOTH ) && match( hc->hs->cgi_pattern, hc->expnfilename ) ) return cgi( hc ); + + if ( hc->hs->php_pattern != (char*) 0 && + match( hc->hs->php_pattern, hc->expnfilename)) { + return thttpd_php_request( hc ); + } /* It's not CGI. If it's executable or there's pathinfo, someone's ** trying to either serve or run a non-CGI file as CGI. Either case Only in thttpd-2.21b: libhttpd.c~ diff -ur thttpd-2.21b-orig/libhttpd.h thttpd-2.21b/libhttpd.h --- thttpd-2.21b-orig/libhttpd.h Tue Apr 24 00:36:50 2001 +++ thttpd-2.21b/libhttpd.h Mon Aug 13 23:50:27 2001 @@ -69,6 +69,7 @@ char* server_hostname; int port; char* cgi_pattern; + char* php_pattern; char* charset; char* cwd; int listen4_fd, listen6_fd; diff -ur thttpd-2.21b-orig/thttpd.c thttpd-2.21b/thttpd.c --- thttpd-2.21b-orig/thttpd.c Tue Apr 24 00:41:57 2001 +++ thttpd-2.21b/thttpd.c Mon Aug 13 23:50:27 2001 @@ -1333,7 +1333,7 @@ clear_connection( c, tvP ); return; } - hc->read_idx += sz; + if (sz > 0) hc->read_idx += sz; /* Do we have a complete request yet? */ switch ( httpd_got_request( hc ) ) @@ -1387,6 +1387,12 @@ clear_connection( c, tvP ); return; } + if (hc->file_address == (char *) 1) { + tmr_cancel( c->idle_read_timer ); + c->idle_read_timer = (Timer*) 0; + c->wouldblock_delay = 0; + return; + } if ( c->bytes_sent >= c->bytes_to_send ) { /* There's nothing to send. */ @@ -1500,7 +1506,7 @@ { /* Yes; move the unwritten part to the front of the buffer. */ int newlen = hc->responselen - sz; - (void) memcpy( hc->response, &(hc->response[sz]), newlen ); + (void) memmove( hc->response, &(hc->response[sz]), newlen ); hc->responselen = newlen; sz = 0; } diff -ur thttpd-2.21b-plain/mime_encodings.txt thttpd-2.21b/mime_encodings.txt --- thttpd-2.21b-plain/mime_encodings.txt Wed May 10 03:22:28 2000 +++ thttpd-2.21b/mime_encodings.txt Mon Dec 10 15:10:25 2001 @@ -3,6 +3,6 @@ # A list of file extensions followed by the corresponding MIME encoding. # Extensions not found in the table proceed to the mime_types table. -Z x-compress -gz x-gzip +Z compress +gz gzip uu x-uuencode diff -ur thttpd-2.21b-plain/libhttpd.c thttpd-2.21b/libhttpd.c --- thttpd-2.21b-plain/libhttpd.c Tue Apr 24 00:42:40 2001 +++ thttpd-2.21b/libhttpd.c Mon Dec 10 14:32:26 2001 @@ -3611,14 +3611,18 @@ } else { + char *extraheads = ""; hc->file_address = mmc_map( hc->expnfilename, &(hc->sb), nowP ); if ( hc->file_address == (char*) 0 ) { httpd_send_err( hc, 500, err500title, "", err500form, hc->encodedurl ); return -1; } + if (strncmp(hc->decodedurl, "/nocache/", sizeof("/nocache/")-1) == 0) + extraheads = "Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\n"; + send_mime( - hc, 200, ok200title, hc->encodings, "", hc->type, hc->sb.st_size, + hc, 200, ok200title, hc->encodings, extraheads, hc->type, hc->sb.st_size, hc->sb.st_mtime ); }