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 );
 	}
 
