You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@hyperreal.org on 1999/10/21 22:46:42 UTC

cvs commit: apache-1.3/src/support htdigest.c htpasswd.c

stoddard    99/10/21 13:46:38

  Modified:    src/ap   ap_checkpass.c ap_getpass.c ap_snprintf.c
               src/include ap_config.h http_conf_globals.h httpd.h
                        multithread.h scoreboard.h
               src/main alloc.c buff.c http_core.c http_log.c http_main.c
                        http_request.c util.c util_script.c
               src/modules/proxy mod_proxy.c proxy_cache.c proxy_util.c
               src/modules/standard mod_auth_anon.c mod_cern_meta.c
                        mod_cgi.c mod_digest.c mod_expires.c mod_headers.c
                        mod_include.c mod_info.c mod_rewrite.c
                        mod_rewrite.h mod_speling.c mod_status.c
                        mod_userdir.c mod_usertrack.c
               src/support htdigest.c htpasswd.c
  Log:
  Apache port to Netware 5
  Submitted by:	Mike Gardiner
  Reviewed by:	Bill Stoddard
  
  Revision  Changes    Path
  1.6       +1 -1      apache-1.3/src/ap/ap_checkpass.c
  
  Index: ap_checkpass.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/ap/ap_checkpass.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ap_checkpass.c	1999/09/01 04:29:00	1.5
  +++ ap_checkpass.c	1999/10/21 20:44:07	1.6
  @@ -97,7 +97,7 @@
   	/*
   	 * It's not our algorithm, so feed it to crypt() if possible.
   	 */
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   	/*
   	 * On Windows, the only alternative to our MD5 algorithm is plain
   	 * text.
  
  
  
  1.2       +3 -1      apache-1.3/src/ap/ap_getpass.c
  
  Index: ap_getpass.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/ap/ap_getpass.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ap_getpass.c	1999/05/31 17:09:30	1.1
  +++ ap_getpass.c	1999/10/21 20:44:09	1.2
  @@ -62,7 +62,9 @@
    */
   
   #include "ap_config.h"
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <errno.h>
   #include "ap.h"
   
  @@ -104,7 +106,7 @@
   
   #endif
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   /*
    * Windows lacks getpass().  So we'll re-implement it here.
    */
  
  
  
  1.37      +3 -1      apache-1.3/src/ap/ap_snprintf.c
  
  Index: ap_snprintf.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/ap/ap_snprintf.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- ap_snprintf.c	1999/09/02 16:27:26	1.36
  +++ ap_snprintf.c	1999/10/21 20:44:10	1.37
  @@ -62,7 +62,9 @@
   
   #include <stdio.h>
   #include <ctype.h>
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <stdarg.h>
   #include <string.h>
   #include <stdlib.h>
  @@ -130,7 +132,7 @@
       register int r2;
       double fi, fj;
       register char *p, *p1;
  -
  +    
       if (ndigits >= NDIG - 1)
   	ndigits = NDIG - 2;
       r2 = 0;
  
  
  
  1.271     +41 -5     apache-1.3/src/include/ap_config.h
  
  Index: ap_config.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/ap_config.h,v
  retrieving revision 1.270
  retrieving revision 1.271
  diff -u -r1.270 -r1.271
  --- ap_config.h	1999/09/13 13:32:40	1.270
  +++ ap_config.h	1999/10/21 20:44:15	1.271
  @@ -72,7 +72,7 @@
   /*
    * Support for platform dependent autogenerated defines
    */
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
   #include "ap_config_auto.h"
   #else
   /* not available under WIN32, so provide important entries manually */
  @@ -81,9 +81,12 @@
   
   /* Have to include sys/stat.h before ../os/win32/os.h so we can override
   stat() properly */
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/stat.h>
   
  +
   /* So that we can use inline on some critical functions, and use
    * GNUC attributes (such as to get -Wall warnings for printf-like
    * functions).  Only do this in gcc 2.7 or later ... it may work
  @@ -113,7 +116,7 @@
   #include "os.h"
   #endif
   
  -#if !defined(QNX) && !defined(MPE) && !defined(WIN32) && !defined(TPF)
  +#if !defined(QNX) && !defined(MPE) && !defined(WIN32) && !defined(TPF) && !defined(NETWARE)
   #include <sys/param.h>
   #endif
   
  @@ -950,6 +953,9 @@
   #define NEED_INITGROUPS
   #define NO_SLACK
   
  +#elif defined(NETWARE)
  +#define USE_HSREGEX
  +/* Most all NetWare stuff is in os/NetWare/os.h */
   #else
   /* Unknown system - Edit these to match */
   #ifdef BSD
  @@ -1017,7 +1023,9 @@
    * file. If you have neither, I'm confused.
    */
   
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <stdarg.h>
   
   #if !defined(NEXT) && !defined(WIN32)
  @@ -1037,10 +1045,10 @@
   #include <strings.h>
   #endif
   #include "ap_ctype.h"
  -#if !defined(MPE) && !defined(WIN32) && !defined(TPF) && !defined(__TANDEM)
  +#if !defined(MPE) && !defined(WIN32) && !defined(TPF) && !defined(__TANDEM) && !defined(NETWARE)
   #include <sys/file.h>
   #endif
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
   #include <sys/socket.h>
   #ifdef HAVE_SYS_SELECT_H
   #include <sys/select.h>
  @@ -1065,17 +1073,45 @@
   #endif
   #endif /* ndef WIN32 */
   
  +/* This block is added for NETWARE... Should be moved to os.h? */
  +#ifdef NETWARE
  +#include <ws2nlm.h>
  +#include <winsock2.h>
  +#include <malloc.h>
  +#include <io.h>
  +#include <fcntl.h>
  +#endif
  +
   #include <limits.h>
   #include <time.h>		/* for ctime */
   #ifdef WIN32
   #define strftime(s,max,format,tm)  os_strftime(s,max,format,tm)
   #endif
   #include <signal.h>
  +#ifdef NETWARE
  +#undef SIGKILL
  +#undef SA_NOCLDSTOP
  +#undef SIGALRM
  +#undef SIGCHILD
  +#undef SIGCONT
  +#undef SIGHUP
  +#undef SIGPIPE
  +#undef SIGQUIT
  +#undef SIGSTOP
  +#undef SIGTSTP
  +#undef SIGTTIN
  +#undef SIGTTOU
  +#undef SIGUSR1
  +#undef SIGUSR2
  +#undef SIG_BLOCK
  +#undef SIG_SETMASK
  +#undef SIG_UNBLOCK
  +#endif
   #if defined(TPF) && defined(NSIG)
   #undef NSIG
   #endif
   #include <errno.h>
  -#if !defined(QNX) && !defined(CONVEXOS11) && !defined(NEXT) && !defined(TPF)
  +#if !defined(QNX) && !defined(CONVEXOS11) && !defined(NEXT) && !defined(TPF) && !defined(NETWARE)
   #include <memory.h>
   #endif
   
  
  
  
  1.40      +3 -0      apache-1.3/src/include/http_conf_globals.h
  
  Index: http_conf_globals.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/http_conf_globals.h,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- http_conf_globals.h	1999/06/29 15:13:11	1.39
  +++ http_conf_globals.h	1999/10/21 20:44:16	1.40
  @@ -72,6 +72,9 @@
   extern uid_t ap_user_id;
   extern char *ap_user_name;
   extern gid_t ap_group_id;
  +#ifdef NETWARE
  +extern unsigned int ap_thread_stack_size;
  +#endif
   #ifdef MULTIPLE_GROUPS
   extern gid_t group_id_list[NGROUPS_MAX];
   #endif
  
  
  
  1.296     +3 -1      apache-1.3/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/httpd.h,v
  retrieving revision 1.295
  retrieving revision 1.296
  diff -u -r1.295 -r1.296
  --- httpd.h	1999/08/16 18:55:31	1.295
  +++ httpd.h	1999/10/21 20:44:18	1.296
  @@ -87,6 +87,8 @@
   #define HTTPD_ROOT "/apache"
   #elif defined(BEOS)
   #define HTTPD_ROOT "/boot/home/apache"
  +#elif defined(NETWARE)
  +#define HTTPD_ROOT "sys:/apache"
   #else
   #define HTTPD_ROOT "/usr/local/apache"
   #endif
  @@ -928,7 +930,7 @@
       listen_rec *next;
       struct sockaddr_in local_addr;	/* local IP address and port */
       int fd;
  -    int used;			/* Only used during restart */
  +    int used;			/* Only used during restart */        
   /* more stuff here, like which protocol is bound to the port */
   };
   
  
  
  
  1.12      +4 -0      apache-1.3/src/include/multithread.h
  
  Index: multithread.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/multithread.h,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- multithread.h	1998/05/03 17:31:10	1.11
  +++ multithread.h	1999/10/21 20:44:20	1.12
  @@ -19,7 +19,11 @@
    * I believe this is terribly ugly
    */
   #ifdef MULTITHREAD
  +#ifdef NETWARE
  +#define APACHE_TLS
  +#else
   #define APACHE_TLS __declspec( thread )
  +#endif
   
   thread *create_thread(void (thread_fn) (void *thread_arg), void *thread_arg);
   int kill_thread(thread *thread_id);
  
  
  
  1.48      +2 -1      apache-1.3/src/include/scoreboard.h
  
  Index: scoreboard.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/scoreboard.h,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- scoreboard.h	1999/04/27 20:36:29	1.47
  +++ scoreboard.h	1999/10/21 20:44:23	1.48
  @@ -63,12 +63,13 @@
   #endif
   
   #ifndef WIN32
  -#ifdef TPF
  +#if defined(TPF) || defined(NETWARE)
   #include <time.h>
   #else
   #include <sys/times.h>
   #endif /* TPF */
   #endif
  +
   
   /* Scoreboard info on a process is, for now, kept very brief --- 
    * just status value and pid (the latter so that the caretaker process
  
  
  
  1.117     +7 -2      apache-1.3/src/main/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
  retrieving revision 1.116
  retrieving revision 1.117
  diff -u -r1.116 -r1.117
  --- alloc.c	1999/10/08 14:23:40	1.116
  +++ alloc.c	1999/10/21 20:44:28	1.117
  @@ -1992,7 +1992,7 @@
   
       ap_block_alarms();
       res = closesocket(sock);
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       errno = WSAGetLastError();
   #endif /* WIN32 */
       save_errno = errno;
  @@ -2072,7 +2072,7 @@
   #endif /* WIN32 */
   
   /* for ap_fdopen, to get binary mode */
  -#if defined (OS2) || defined (WIN32)
  +#if defined (OS2) || defined (WIN32) || defined (NETWARE)
   #define BINMODE	"b"
   #else
   #define BINMODE
  @@ -2197,6 +2197,10 @@
   	 */
   
       }
  +#elif defined(NETWARE)
  +     /* NetWare currently has no pipes yet. This will
  +        be solved with the new libc for NetWare soon. */
  +     pid = 0;
   #elif defined(OS2)
       {
           int save_in=-1, save_out=-1, save_err=-1;
  @@ -2658,6 +2662,7 @@
       for (p = procs; p; p = p->next) {
   	CloseHandle((HANDLE) p->pid);
       }
  +#elif defined(NETWARE)
   #else
   #ifndef NEED_WAITPID
       /* Pick up all defunct processes */
  
  
  
  1.89      +29 -14    apache-1.3/src/main/buff.c
  
  Index: buff.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/buff.c,v
  retrieving revision 1.88
  retrieving revision 1.89
  diff -u -r1.88 -r1.89
  --- buff.c	1999/07/29 18:13:40	1.88
  +++ buff.c	1999/10/21 20:44:32	1.89
  @@ -119,7 +119,7 @@
    * futher I/O will be done
    */
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   
   /*
     select() sometimes returns 1 even though the write will block. We must work around this.
  @@ -137,12 +137,13 @@
       if (!(tv.tv_sec = ap_check_alarm()))
   	return (send(sock, buf, len, flags));
   
  -    rv = ioctlsocket(sock, FIONBIO, &iostate);
  +    rv = ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
       iostate = 0;
       if (rv) {
   	err = WSAGetLastError();
   	ap_assert(0);
       }
  +
       rv = send(sock, buf, len, flags);
       if (rv == SOCKET_ERROR) {
   	err = WSAGetLastError();
  @@ -157,27 +158,36 @@
   		if (rv == SOCKET_ERROR)
   		    err = WSAGetLastError();
   		else if (rv == 0) {
  - 		    ioctlsocket(sock, FIONBIO, &iostate);
  + 		    ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
   		    if(ap_check_alarm() < 0) {
   			WSASetLastError(EINTR);	/* Simulate an alarm() */
   			return (SOCKET_ERROR);
   		    }
  -		}
  + 		}
   		else {
   		    rv = send(sock, buf, len, flags);
   		    if (rv == SOCKET_ERROR) {
   		        err = WSAGetLastError();
   			if(err == WSAEWOULDBLOCK) {
  -			    ap_log_error(APLOG_MARK,APLOG_DEBUG,NULL,
  -				"select claimed we could write, but in fact we couldn't. This is a bug in Windows.");
  +			    
   			    retry=1;
  +#ifdef NETWARE
  +                ap_log_error(APLOG_MARK,APLOG_DEBUG,NULL,
  +				    "select claimed we could write, but in fact we couldn't.");
  +				ThreadSwitchWithDelay();
  +#else
  +                ap_log_error(APLOG_MARK,APLOG_DEBUG,NULL,
  +				    "select claimed we could write, but in fact we couldn't. This is a bug in Windows.");
   			    Sleep(100);
  +#endif
   			}
   		    }
   		}
   	    } while(retry);
       }
  -    ioctlsocket(sock, FIONBIO, &iostate);
  +
  +    ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
  +
       if (rv == SOCKET_ERROR)
   	WSASetLastError(err);
       return (rv);
  @@ -195,9 +205,10 @@
       if (!(tv.tv_sec = ap_check_alarm()))
   	return (recv(sock, buf, len, flags));
   
  -    rv = ioctlsocket(sock, FIONBIO, &iostate);
  +    rv = ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
       iostate = 0;
       ap_assert(!rv);
  +
       rv = recv(sock, buf, len, flags);
       if (rv == SOCKET_ERROR) {
   	err = WSAGetLastError();
  @@ -209,7 +220,7 @@
   	    if (rv == SOCKET_ERROR)
   		err = WSAGetLastError();
   	    else if (rv == 0) {
  -		ioctlsocket(sock, FIONBIO, &iostate);
  +		ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
   		ap_check_alarm();
   		WSASetLastError(WSAEWOULDBLOCK);
   		return (SOCKET_ERROR);
  @@ -221,7 +232,9 @@
   	    }
   	}
       }
  -    ioctlsocket(sock, FIONBIO, &iostate);
  +
  +    ioctlsocket(sock, FIONBIO, (u_long*)&iostate);
  +
       if (rv == SOCKET_ERROR)
   	WSASetLastError(err);
       return (rv);
  @@ -251,7 +264,7 @@
   {
       int rv;
   
  -#if defined (WIN32)
  +#if defined (WIN32) || defined(NETWARE)
       if (fb->flags & B_SOCKET) {
   	rv = recvwithtimeout(fb->fd_in, buf, nbyte, 0);
   	if (rv == SOCKET_ERROR)
  @@ -312,7 +325,7 @@
   {
       int rv;
   
  -#if defined(WIN32)
  +#if defined(WIN32) || defined(NETWARE)
       if (fb->flags & B_SOCKET) {
   	rv = sendwithtimeout(fb->fd, buf, nbyte, 0);
   	if (rv == SOCKET_ERROR)
  @@ -1432,7 +1445,7 @@
   	rc1 = ap_bflush(fb);
       else
   	rc1 = 0;
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       if (fb->flags & B_SOCKET) {
   	rc2 = ap_pclosesocket(fb->pool, fb->fd);
   	if (fb->fd_in != fb->fd) {
  @@ -1442,10 +1455,12 @@
   	    rc3 = 0;
   	}
       }
  +#ifndef NETWARE
       else if (fb->hFH != INVALID_HANDLE_VALUE) {
   	    rc2 = ap_pcloseh(fb->pool, fb->hFH);
   	    rc3 = 0;
       }
  +#endif
       else {
   #elif defined(BEOS)
       if (fb->flags & B_SOCKET) {
  @@ -1465,7 +1480,7 @@
   	else {
   	    rc3 = 0;
   	}
  -#if defined(WIN32) || defined (BEOS)
  +#if defined(WIN32) || defined (BEOS) || defined(NETWARE)
       }
   #endif
   
  
  
  
  1.274     +21 -2     apache-1.3/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_core.c,v
  retrieving revision 1.273
  retrieving revision 1.274
  diff -u -r1.273 -r1.274
  --- http_core.c	1999/10/21 18:23:39	1.273
  +++ http_core.c	1999/10/21 20:44:35	1.274
  @@ -2171,6 +2171,8 @@
   {
   #ifdef WIN32
       fprintf(stderr, "WARNING: StartServers has no effect on Win32\n");
  +#elif defined(NETWARE)
  +    fprintf(stderr, "WARNING: StartServers has no effect on NetWare\n");
   #else
       const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
       if (err != NULL) {
  @@ -2390,12 +2392,25 @@
       return NULL;
   }
   
  +#ifdef NETWARE
  +static const char *set_threadstacksize(cmd_parms *cmd, void *dummy, char *stacksize)
  +{
  +    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
  +    if (err != NULL) {
  +        return err;
  +    }
  +    
  +    ap_thread_stack_size = atoi(stacksize);    
  +    return NULL;
  +}
  +#endif
  +
   static const char *set_listener(cmd_parms *cmd, void *dummy, char *ips)
   {
       listen_rec *new;
       char *ports;
       unsigned short port;
  -
  +    
       const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
       if (err != NULL) {
           return err;
  @@ -2881,6 +2896,10 @@
      OR_ALL, TAKE12, "soft/hard limits for max number of processes per uid" },
   { "BindAddress", set_bind_address, NULL, RSRC_CONF, TAKE1,
     "'*', a numeric IP address, or the name of a host with a unique IP address"},
  +#ifdef NETWARE
  +{ "ThreadStackSize", set_threadstacksize, NULL, RSRC_CONF, TAKE1,
  +  "Stack size each created thread will use."},
  +#endif
   { "Listen", set_listener, NULL, RSRC_CONF, TAKE1,
     "A port number or a numeric IP address and a port number"},
   { "SendBufferSize", set_send_buffer_size, NULL, RSRC_CONF, TAKE1,
  @@ -3054,7 +3073,7 @@
           return METHOD_NOT_ALLOWED;
       }
   	
  -#if defined(OS2) || defined(WIN32)
  +#if defined(OS2) || defined(WIN32) || defined(NETWARE)
       /* Need binary mode for OS/2 */
       f = ap_pfopen(r->pool, r->filename, "rb");
   #else
  
  
  
  1.81      +8 -2      apache-1.3/src/main/http_log.c
  
  Index: http_log.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_log.c,v
  retrieving revision 1.80
  retrieving revision 1.81
  diff -u -r1.80 -r1.81
  --- http_log.c	1999/09/01 04:29:04	1.80
  +++ http_log.c	1999/10/21 20:44:38	1.81
  @@ -168,7 +168,10 @@
       /* No concept of a child process on Win32 */
       signal(SIGHUP, SIG_IGN);
   #endif /* ndef SIGHUP */
  -#if defined(WIN32)
  +#if defined(NETWARE)
  +    child_pid = spawnlp(P_NOWAIT, SHELL_PATH, (char *)cmd);
  +    return(child_pid);
  +#elif defined(WIN32)
       child_pid = spawnl(_P_NOWAIT, SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
       return(child_pid);
   #elif defined(OS2)
  @@ -726,7 +729,10 @@
   #ifdef SIGHUP
       signal(SIGHUP, SIG_IGN);
   #endif
  -#if defined(WIN32)
  +#if defined(NETWARE)
  +    child_pid = spawnlp(P_NOWAIT, SHELL_PATH, (char *)cmd);
  +    return(child_pid);
  +#elif defined(WIN32)
       child_pid = spawnl(_P_NOWAIT, SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
       return(child_pid);
   #elif defined(OS2)
  
  
  
  1.479     +477 -61   apache-1.3/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
  retrieving revision 1.478
  retrieving revision 1.479
  diff -u -r1.478 -r1.479
  --- http_main.c	1999/10/11 23:08:19	1.478
  +++ http_main.c	1999/10/21 20:44:41	1.479
  @@ -116,10 +116,9 @@
   #endif
   #ifdef WIN32
   #include "../os/win32/getopt.h"
  -#elif !defined(BEOS) && !defined(TPF)
  +#elif !defined(BEOS) && !defined(TPF) && !defined(NETWARE)
   #include <netinet/tcp.h>
   #endif
  -
   #ifdef HAVE_BSTRING_H
   #include <bstring.h>		/* for IRIX, FD_SET calls bzero() */
   #endif
  @@ -228,7 +227,12 @@
    * Actual definitions of config globals... here because this is
    * for the most part the only code that acts on 'em.  (Hmmm... mod_main.c?)
    */
  -
  + 
  +#ifdef NETWARE
  +int ap_thread_count = 0;
  +BOOL ap_main_finished = FALSE;
  +unsigned int ap_thread_stack_size = 65536;
  +#endif
   int ap_standalone=0;
   int ap_configtestonly=0;
   int ap_docrootcheck=1;
  @@ -294,11 +298,15 @@
   /* *Non*-shared http_main globals... */
   
   static server_rec *server_conf;
  +#ifndef NETWARE
   static JMP_BUF APACHE_TLS jmpbuffer;
  +#endif
   static int sd;
   static fd_set listenfds;
   static int listenmaxfd;
  +#ifndef NETWARE
   static pid_t pgrp;
  +#endif
   
   /* one_process --- debugging mode variable; can be set from the command line
    * with the -X flag.  If set, this gets you the child_main loop running
  @@ -316,7 +324,9 @@
   /* set if timeouts are to be handled by the children and not by the parent.
    * i.e. child_timeouts = !standalone || one_process.
    */
  +#ifndef NETWARE
   static int child_timeouts;
  +#endif
   
   #ifdef DEBUG_SIGSTOP
   int raise_sigstop_flags;
  @@ -342,7 +352,9 @@
   static pool *pchild;		/* Pool for httpd child stuff */
   static pool *pcommands;	/* Pool for -C and -c switches */
   
  +#ifndef NETWARE
   static int APACHE_TLS my_pid;	/* it seems silly to call getpid all the time */
  +#endif
   #ifndef MULTITHREAD
   static int my_child_num;
   #endif
  @@ -426,7 +438,9 @@
       }
   }
   
  +#ifndef NETWARE
   static APACHE_TLS int volatile exit_after_unblock = 0;
  +#endif
   
   #ifdef GPROF
   /* 
  @@ -1010,7 +1024,7 @@
   #endif
   
   /* On some architectures it's safe to do unserialized accept()s in the single
  - * Listen case.  But it's never safe to do it in the case where there's
  + * ' case.  But it's never safe to do it in the case where there's
    * multiple Listen statements.  Define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
    * when it's safe in the single Listen case.
    */
  @@ -1063,9 +1077,42 @@
       fprintf(stderr, "  -i               : install an Apache service\n");
       fprintf(stderr, "  -u               : uninstall an Apache service\n");
   #endif
  +
  +#ifdef NETWARE
  +    clean_parent_exit(0);
  +#else
       exit(1);
  +#endif
   }
   
  +
  +
  +#ifdef NETWARE
  +/* Thread Storage Data */
  +typedef struct _TSD {
  +    conn_rec*		current_conn;
  +    int 			alarms_blocked;
  +    int				alarm_pending;
  +    request_rec*	timeout_req;
  +    char*			timeout_name;
  +    JMP_BUF			jmpbuffer;
  +    int				exit_after_unblock;
  +    void 			(*alarm_fn) (int);
  +    unsigned int 	alarm_expiry_time;
  +} TSD;
  +
  +#define get_tsd            TSD* tsd = (TSD*) GetThreadDataAreaPtr();
  +#define current_conn       tsd->current_conn
  +#define alarms_blocked     tsd->alarms_blocked
  +#define alarm_pending      tsd->alarm_pending
  +#define timeout_req        tsd->timeout_req
  +#define timeout_name       tsd->timeout_name
  +#define jmpbuffer          tsd->jmpbuffer
  +#define exit_after_unblock tsd->exit_after_unblock
  +#define alarm_fn           tsd->alarm_fn
  +#define alarm_expiry_time  tsd->alarm_expiry_time
  +
  +#else
   /*****************************************************************
    *
    * Timeout handling.  DISTINCTLY not thread-safe, but all this stuff
  @@ -1078,11 +1125,15 @@
   static APACHE_TLS const char *volatile timeout_name = NULL;
   static APACHE_TLS int volatile alarms_blocked = 0;
   static APACHE_TLS int volatile alarm_pending = 0;
  +#endif
  +
   
   static void timeout(int sig)
   {
       void *dirconf;
  -
  +#ifdef NETWARE
  +    get_tsd
  +#endif    
       if (alarms_blocked) {
   	alarm_pending = 1;
   	return;
  @@ -1110,7 +1161,6 @@
   	/* Someone has asked for this transaction to just be aborted
   	 * if it times out...
   	 */
  -
   	request_rec *log_req = timeout_req;
   	request_rec *save_req = timeout_req;
   
  @@ -1120,6 +1170,9 @@
   	timeout_req = NULL;
   
   	while (log_req->main || log_req->prev) {
  +#ifdef NETWARE
  +            ThreadSwitch();
  +#endif
   	    /* Get back to original request... */
   	    if (log_req->main)
   		log_req = log_req->main;
  @@ -1130,18 +1183,17 @@
   	if (!current_conn->keptalive) {
   	    /* in some cases we come here before setting the time */
   	    if (log_req->request_time == 0) {
  -	      log_req->request_time = time(0);
  +                log_req->request_time = time(0);
   	    }
   	    ap_log_transaction(log_req);
   	}
   
   	ap_bsetflag(save_req->connection->client, B_EOUT, 1);
   	ap_bclose(save_req->connection->client);
  -
  +	
   	if (!ap_standalone)
   	    exit(0);
  -
  -	ap_longjmp(jmpbuffer, 1);
  +        ap_longjmp(jmpbuffer, 1);
       }
       else {			/* abort the connection */
   	ap_bsetflag(current_conn->client, B_EOUT, 1);
  @@ -1150,6 +1202,7 @@
       }
   }
   
  +
   #ifndef TPF
   /*
    * These two called from alloc.c to protect its critical sections...
  @@ -1159,11 +1212,17 @@
   
   API_EXPORT(void) ap_block_alarms(void)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       ++alarms_blocked;
   }
   
   API_EXPORT(void) ap_unblock_alarms(void)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       --alarms_blocked;
       if (alarms_blocked == 0) {
   	if (exit_after_unblock) {
  @@ -1186,12 +1245,14 @@
   }
   #endif /* TPF */
   
  +#ifndef NETWARE
   static APACHE_TLS void (*volatile alarm_fn) (int) = NULL;
  +#endif
   #ifdef WIN32
   static APACHE_TLS unsigned int alarm_expiry_time = 0;
   #endif /* WIN32 */
   
  -#ifndef WIN32
  +#if !defined(WIN32)  && !defined(NETWARE)
   static void alrm_handler(int sig)
   {
       if (alarm_fn) {
  @@ -1204,8 +1265,12 @@
   {
       unsigned int old;
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       old = alarm_expiry_time;
  +
       if (old)
   	old -= time(0);
       if (x == 0) {
  @@ -1243,9 +1308,12 @@
   }
   
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   API_EXPORT(int) ap_check_alarm(void)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       if (alarm_expiry_time) {
   	unsigned int t;
   
  @@ -1273,7 +1341,9 @@
   API_EXPORT(void) ap_reset_timeout(request_rec *r)
   {
       int i;
  -
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       if (timeout_name) {		/* timeout has been set */
   	i = ap_set_callback_and_alarm(alarm_fn, r->server->timeout);
   	if (i == 0)		/* timeout already expired, so set it back to 0 */
  @@ -1287,37 +1357,42 @@
   void ap_keepalive_timeout(char *name, request_rec *r)
   {
       unsigned int to;
  -
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       timeout_req = r;
       timeout_name = name;
  -
       if (r->connection->keptalive)
   	to = r->server->keep_alive_timeout;
       else
   	to = r->server->timeout;
       ap_set_callback_and_alarm(timeout, to);
  -
   }
   
   API_EXPORT(void) ap_hard_timeout(char *name, request_rec *r)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       timeout_req = r;
       timeout_name = name;
  -
       ap_set_callback_and_alarm(timeout, r->server->timeout);
  -
   }
   
   API_EXPORT(void) ap_soft_timeout(char *name, request_rec *r)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       timeout_name = name;
  -
       ap_set_callback_and_alarm(timeout, r->server->timeout);
  -
   }
   
   API_EXPORT(void) ap_kill_timeout(request_rec *dummy)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       ap_check_signals();
       ap_set_callback_and_alarm(NULL, 0);
       timeout_req = NULL;
  @@ -1377,6 +1452,9 @@
   
   static void lingerout(int sig)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       if (alarms_blocked) {
   	alarm_pending = 1;
   	return;
  @@ -1391,8 +1469,10 @@
   
   static void linger_timeout(void)
   {
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       timeout_name = "lingering close";
  -
       ap_set_callback_and_alarm(lingerout, MAX_SECS_TO_LINGER);
   }
   
  @@ -1453,6 +1533,10 @@
   	 * These parameters are reset on each pass, since they might be
   	 * changed by select.
   	 */
  +#ifdef NETWARE
  +        ThreadSwitch();
  +#endif
  +
   	FD_SET(lsd, &lfds);
   	tv.tv_sec = 2;
   	tv.tv_usec = 0;
  @@ -1878,7 +1962,7 @@
   	}
   #endif
   	ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
  -		    "could not call shmget");
  +                     "could not call shmget");
   	exit(APEXIT_INIT);
       }
   
  @@ -2110,6 +2194,10 @@
   static void clean_parent_exit(int code) __attribute__((noreturn));
   static void clean_parent_exit(int code)
   {
  +#ifdef NETWARE
  +    AMCSocketCleanup();
  +    ap_main_finished = TRUE;
  +#endif
       /* Clear the pool - including any registered cleanups */
       ap_destroy_pool(pglobal);
       exit(code);
  @@ -2129,6 +2217,10 @@
       ss = &ap_scoreboard_image->servers[child_num];
       old_status = ss->status;
       ss->status = status;
  +#ifdef NETWARE
  +    ap_scoreboard_image->parent[child_num].pid = GetThreadID();
  +#endif
  +
   #ifdef OPTIMIZE_TIMEOUTS
       ++ss->cur_vtime;
   #endif
  @@ -2448,7 +2540,31 @@
   	}
       }
       return (-1);
  +#elif defined(NETWARE)
  +    struct timeval tv;
  +    int ret = 0;
   
  +    ++wait_or_timeout_counter;
  +    if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) {
  +	    wait_or_timeout_counter = 0;
  +#ifndef NO_OTHER_CHILD
  +	    probe_writable_fds();
  +#endif
  +    }
  +
  +    if (ret == -1 && errno == EINTR) {
  +	    return -1;
  +    }
  +
  +    if (ret > 0) {
  +	    return ret;
  +    }
  +    
  +    tv.tv_sec = SCOREBOARD_MAINTENANCE_INTERVAL / 1000000;
  +    tv.tv_usec = SCOREBOARD_MAINTENANCE_INTERVAL % 1000000;
  +    ap_select(0, NULL, NULL, NULL, &tv);
  +    return -1;
  +
   #else /* WIN32 */
       struct timeval tv;
       int ret;
  @@ -2617,7 +2733,7 @@
   {
       chdir(ap_coredump_dir);
       signal(sig, SIG_DFL);
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
       kill(getpid(), sig);
   #else
       raise(sig);
  @@ -2639,6 +2755,9 @@
   {				/* SIGHUP to child process??? */
       /* if alarms are blocked we have to wait to die otherwise we might
        * end up with corruption in alloc.c's internal structures */
  +#ifdef NETWARE
  +    get_tsd
  +#endif
       if (alarms_blocked) {
   	exit_after_unblock = 1;
       }
  @@ -2789,7 +2908,7 @@
   
   static void restart(int sig)
   {
  -#ifndef WIN32
  +#if !defined (WIN32) && !defined(NETWARE)
       ap_start_restart(sig == SIGUSR1);
   #else
       ap_start_restart(1);
  @@ -2884,8 +3003,9 @@
   	signal(SIGXFSZ, SIG_DFL);
   #endif /* SIGXFSZ */
       }
  -
  +#ifndef NETWARE
       signal(SIGTERM, sig_term);
  +#endif
   #ifdef SIGHUP
       signal(SIGHUP, restart);
   #endif /* SIGHUP */
  @@ -2906,7 +3026,7 @@
   
   static void detach(void)
   {
  -#if !defined(WIN32)
  +#if !defined(WIN32) && !defined(NETWARE)
       int x;
   
       chdir("/");
  @@ -2978,7 +3098,7 @@
   
   static void set_group_privs(void)
   {
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
       if (!geteuid()) {
   	char *name;
   
  @@ -3101,6 +3221,9 @@
   
       if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no,
   		   sizeof(int)) < 0) {
  +#ifdef NETWARE
  +        errno = WSAGetLastError();
  +#endif
   	ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf,
   		    "setsockopt: (TCP_NODELAY)");
       }
  @@ -3110,7 +3233,6 @@
   #define sock_disable_nagle(s)	/* NOOP */
   #endif
   
  -
   static int make_sock(pool *p, const struct sockaddr_in *server)
   {
       int s;
  @@ -3126,10 +3248,11 @@
       /* note that because we're about to slack we don't use psocket */
       ap_block_alarms();
       if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  -	ap_log_error(APLOG_MARK, APLOG_CRIT, server_conf,
  +	    ap_log_error(APLOG_MARK, APLOG_CRIT, server_conf,
   		    "make_sock: failed to get a socket for %s", addr);
  -	ap_unblock_alarms();
  -	exit(1);
  +
  +	    ap_unblock_alarms();
  +	    exit(1);
       }
   
       /* Solaris (probably versions 2.4, 2.5, and 2.5.1 with various levels
  @@ -3319,10 +3442,15 @@
       lr = ap_listeners;
       do {
   	listen_rec *nr = malloc(sizeof *nr);
  -	if (nr == NULL) {
  -	    fprintf(stderr, "Ouch!  malloc failed in copy_listeners()\n");
  -	    exit(1);
  -	}
  +
  +#ifdef NETWARE
  +        ThreadSwitch();
  +#endif
  +	
  +        if (nr == NULL) {
  +            fprintf(stderr, "Ouch!  malloc failed in copy_listeners()\n");
  +            exit(1);
  +        }
   	*nr = *lr;
   	ap_kill_cleanups_for_socket(p, nr->fd);
   	nr->next = old_listeners;
  @@ -3373,7 +3501,7 @@
       for (;;) {
   	fd = find_listener(lr);
   	if (fd < 0) {
  -	    fd = make_sock(p, &lr->local_addr);
  +        fd = make_sock(p, &lr->local_addr);
   	}
   	else {
   	    ap_note_cleanups_for_socket(p, fd);
  @@ -3417,6 +3545,9 @@
   
       lr = head_listener;
       do {
  +#ifdef NETWARE
  +	ThreadSwitch();
  +#endif
   	if (FD_ISSET(lr->fd, main_fds)) {
   	    head_listener = lr->next;
   	    return (lr);
  @@ -3427,7 +3558,7 @@
   }
   
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   static int s_iInitCount = 0;
   
   static int AMCSocketInitialize(void)
  @@ -3444,18 +3575,24 @@
   	return (s_iInitCount);
   
       /* s_iInitCount == 0. Do the initailization */
  +#ifdef NETWARE
  +    iVersionRequested = MAKEWORD(2, 0);
  +#else
       iVersionRequested = MAKEWORD(1, 1);
  +#endif
       err = WSAStartup((WORD) iVersionRequested, &wsaData);
       if (err) {
   	s_iInitCount = -1;
   	return (s_iInitCount);
       }
  +#ifdef WIN32
       if (LOBYTE(wsaData.wVersion) != 1 ||
   	HIBYTE(wsaData.wVersion) != 1) {
   	s_iInitCount = -2;
   	WSACleanup();
   	return (s_iInitCount);
       }
  +#endif
   
       s_iInitCount++;
       return (s_iInitCount);
  @@ -3614,7 +3751,7 @@
       (void) set42sig();
   #endif
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       /* Initialize the stupid sockets */
       AMCSocketInitialize();
   #endif /* WIN32 */
  @@ -5072,8 +5209,9 @@
   void add_job(int sock)
   {
       joblist *new_job;
  -
  +    
       ap_assert(allowed_globals.jobmutex);
  +
       /* TODO: If too many jobs in queue, sleep, check for problems */
       ap_acquire_mutex(allowed_globals.jobmutex);
       new_job = (joblist *) malloc(sizeof(joblist));
  @@ -5167,6 +5305,20 @@
       int dupped_csd = -1;
       int srv = 0;
   
  +#ifdef NETWARE
  +    TSD* tsd = NULL;
  +
  +    while(tsd == NULL) {
  +        tsd = (TSD*) GetThreadDataAreaPtr();
  +        ThreadSwitchWithDelay();
  +    }
  +
  +    SetCurrentNameSpace(4);
  +    SetTargetNameSpace(4);
  +
  +    ap_thread_count++;
  +#endif
  +
       ptrans = ap_make_sub_pool(pconf);
   
       (void) ap_update_child_status(child_num, SERVER_READY, (request_rec *) NULL);
  @@ -5179,22 +5331,28 @@
   #else
       sigsetjmp(jmpbuffer, 1);
   #endif
  -#ifdef SIGURG
  +#if defined(SIGURG)
       signal(SIGURG, timeout);
   #endif
   
  +#ifdef NETWARE
  +    tsd = (TSD*) GetThreadDataAreaPtr();
  +#endif
  +
       while (1) {
   	BUFF *conn_io;
   	request_rec *r;
  -
  +	
  +#ifdef NETWARE
  +        ThreadSwitch();
  +#endif
   	/*
   	 * (Re)initialize this child to a pre-connection state.
   	 */
  -
  +	 
   	ap_set_callback_and_alarm(NULL, 0); /* Cancel any outstanding alarms */
   	timeout_req = NULL;                 /* No request in progress */
   	current_conn = NULL;
  -
   	ap_clear_pool(ptrans);
   
   	(void) ap_update_child_status(child_num, SERVER_READY,
  @@ -5206,6 +5364,7 @@
   	csd = remove_job();
   	if (csd == -1)
   	    break;		/* time to exit */
  +		    
   	requests_this_child++;
   
   	ap_note_cleanups_for_socket(ptrans, csd);
  @@ -5215,7 +5374,7 @@
   	 * socket options, file descriptors, and read/write buffers.
   	 */
   
  -	clen = sizeof(sa_server);
  +	clen = sizeof(sa_server);	
   	if (getsockname(csd, &sa_server, &clen) < 0) {
   	    ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, "getsockname");
   	    continue;
  @@ -5248,21 +5407,22 @@
   				          (struct sockaddr_in *) &sa_client,
   				          (struct sockaddr_in *) &sa_server,
   				          child_num);
  -
  +				          
   	/*
   	 * Read and process each request found on our connection
   	 * until no requests are left or we decide to close.
   	 */
  -
   	while ((r = ap_read_request(current_conn)) != NULL) {
  -	    (void) ap_update_child_status(child_num, SERVER_BUSY_WRITE, r);
  +#ifdef NETWARE
  +            ThreadSwitch();
  +#endif
  +            (void) ap_update_child_status(child_num, SERVER_BUSY_WRITE, r);
   
   	    if (r->status == HTTP_OK)
   		ap_process_request(r);
   
   	    if (ap_extended_status)
   		increment_counts(child_num, r);
  -
   	    if (!current_conn->keepalive || current_conn->aborted)
   		break;
   
  @@ -5298,10 +5458,18 @@
       }
       ap_destroy_pool(ptrans);
       (void) ap_update_child_status(child_num, SERVER_DEAD, NULL);
  +    
  +#ifdef NETWARE
  +    ap_thread_count--;
  +#endif
   }
   
   
  +#ifdef NETWARE
  +void child_main(void* child_num_arg)
  +#else
   void child_main(int child_num_arg)
  +#endif
   {
       /*
        * Only reason for this function, is to pass in
  @@ -5310,7 +5478,15 @@
        * variables and I don't need to make those
        * damn variables static/global
        */
  +#ifdef NETWARE
  +    TSD Tsd;
  +
  +    memset(&Tsd, 0, sizeof(TSD));
  +	SaveThreadDataAreaPtr(&Tsd);
  +	child_sub_main((int)child_num_arg);
  +#else
       child_sub_main(child_num_arg);
  +#endif
   }
   
   
  @@ -5396,6 +5572,7 @@
       APD2("signal prefix %s", signal_name_prefix);
   }
   
  +#ifndef NETWARE
   static void setup_inherited_listeners(pool *p)
   {
       HANDLE pipe;
  @@ -5448,13 +5625,183 @@
       CloseHandle(pipe);
       return;
   }
  +#endif
   
   /*
    * worker_main() is main loop for the child process. The loop in
    * this function becomes the controlling thread for the actually working
    * threads (which run in a loop in child_sub_main()).
    */
  + 
  +#ifdef NETWARE
  +void worker_main(void)
  +{
  +    int nthreads;
  +    fd_set main_fds;
  +    int srv;
  +    int clen;
  +    int csd;
  +    struct sockaddr_in sa_client;
  +    int total_jobs = 0;
  +    thread **child_handles;
  +    int rv;
  +    int i;
  +    struct timeval tv;
  +    int my_pid;
  +    
  +    int count_select_errors = 0;
  +    pool *pchild;
   
  +    pchild = ap_make_sub_pool(pconf);
  +
  +    ap_standalone = 1;
  +    sd = -1;
  +    nthreads = ap_threads_per_child;
  +    
  +    if (nthreads <= 0)
  +        nthreads = 40;
  +	    
  +    my_pid = getpid();
  +
  +    ++ap_my_generation;
  +
  +    copy_listeners(pconf);
  +    ap_restart_time = time(NULL);
  +
  +    reinit_scoreboard(pconf);
  +    setup_listeners(pconf);
  +
  +    if (listenmaxfd == -1) {
  +        /* Help, no sockets were made, better log something and exit */
  +        ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_NOERRNO, NULL,
  +                     "No sockets were created for listening");
  +        
  +        ap_destroy_pool(pchild);
  +        cleanup_scoreboard();
  +        exit(0);
  +    }
  +    
  +    set_signals();
  +
  +    /*
  +     * - Initialize allowed_globals
  +     * - Create the thread table
  +     * - Spawn off threads
  +     * - Create listen socket set (done above)
  +     * - loop {
  +     *       wait for request
  +     *       create new job
  +     *   } while (!time to exit)
  +     * - Close all listeners
  +     * - Wait for all threads to complete
  +     * - Exit
  +     */
  +
  +    ap_child_init_modules(pconf, server_conf);
  +    allowed_globals.jobmutex = ap_create_mutex(NULL);
  +    allowed_globals.jobsemaphore = create_semaphore(0);
  +
  +    /* spawn off the threads */
  +    child_handles = (thread *) malloc(nthreads * sizeof(int));
  +    
  +    for (i = 0; i < nthreads; i++) {
  +        child_handles[i] = create_thread((void (*)(void *)) child_main, (void *) i);
  +    }
  +    
  +    if (nthreads > max_daemons_limit) {
  +        max_daemons_limit = nthreads;
  +    }
  +
  +    while (1) {    
  +        tv.tv_sec = 1;
  +        tv.tv_usec = 0;
  +        
  +        ThreadSwitch();
  +        
  +        if (shutdown_pending)
  +            break;
  +            
  +        memcpy(&main_fds, &listenfds, sizeof(fd_set));
  +        srv = ap_select(listenmaxfd + 1, &main_fds, NULL, NULL, &tv);
  +
  +        if (srv == 0) {
  +            count_select_errors = 0;    /* reset count of errors */
  +            continue;
  +        }
  +        else if (srv == SOCKET_ERROR) {
  +            if (h_errno != WSAEINTR) {
  +                /* A "real" error occurred, log it and increment the count of
  +                 * select errors. This count is used to ensure we don't go into
  +                 * a busy loop of continuous errors.
  +                 */
  +                ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, 
  +                             "select failed with errno %d", h_errno);
  +                count_select_errors++;
  +                if (count_select_errors > MAX_SELECT_ERRORS) {
  +                    ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, server_conf,
  +                                 "Too many errors in select loop. Child process exiting.");
  +                    break;
  +                }
  +            }
  +            continue;
  +        } else {
  +            listen_rec *lr;
  +            
  +            lr = find_ready_listener(&main_fds);
  +	    
  +            if (lr != NULL) {
  +                sd = lr->fd;
  +            }
  +        }
  +
  +        do {
  +            clen = sizeof(sa_client);
  +            csd = accept(sd, (struct sockaddr *) &sa_client, &clen);
  +            
  +            if (csd == INVALID_SOCKET) {
  +                csd = -1;
  +            }
  +        } while (csd < 0 && h_errno == EINTR);
  +	
  +        if (csd == INVALID_SOCKET) {
  +            if (h_errno != WSAECONNABORTED) {
  +                ap_log_error(APLOG_MARK, APLOG_ERR, server_conf,
  +                             "accept: (client socket) failed with errno = %d",h_errno);
  +            }
  +        }
  +        else {
  +            add_job(csd);
  +            total_jobs++;
  +        }
  +    }
  +      
  +    APD2("process PID %d exiting", my_pid);
  +
  +    /* Get ready to shutdown and exit */
  +    allowed_globals.exit_now = 1;
  +    ap_release_mutex(start_mutex);
  +
  +    for (i = 0; i < nthreads; i++) {
  +        add_job(-1);
  +    }
  +
  +    APD2("process PID %d waiting for worker threads to exit", my_pid);
  +    while(ap_thread_count)
  +        ThreadSwitch();
  +    
  +    destroy_semaphore(allowed_globals.jobsemaphore);
  +    ap_destroy_mutex(allowed_globals.jobmutex);
  +    
  +    ap_child_exit_modules(pconf, server_conf);
  +    ap_destroy_pool(pchild);
  +    free(child_handles);
  +    cleanup_scoreboard();
  +
  +    APD2("process PID %d exited", my_pid);
  +    clean_parent_exit(0);
  +
  +}
  +#else
   void worker_main(void)
   {
       int nthreads;
  @@ -5473,6 +5820,7 @@
       int max_jobs_per_exe;
       int max_jobs_after_exit_request;
       HANDLE hObjects[2];
  +
       int count_select_errors = 0;
       pool *pchild;
   
  @@ -5501,7 +5849,7 @@
       ap_restart_time = time(NULL);
   
       reinit_scoreboard(pconf);
  -
  +    
       /*
        * Wait until we have permission to start accepting connections.
        * start_mutex is used to ensure that only one child ever
  @@ -6134,6 +6482,7 @@
       service_set_status(SERVICE_STOPPED);
       return (0);
   }
  +#endif
   
   /*
    * Send signal to a running Apache. On entry signal should contain
  @@ -6212,9 +6561,35 @@
       return TRUE;
   }
   
  -#ifdef WIN32
  -__declspec(dllexport)
  -     int apache_main(int argc, char *argv[])
  +
  +#ifdef NETWARE
  +extern char *optarg;
  +
  +void signal_handler(int sig)
  +{
  +    switch (sig) {
  +    case SIGTERM:
  +        shutdown_pending = 1;
  +
  +        while(!ap_main_finished)
  +            ThreadSwitchWithDelay();
  +
  +        break;
  +    }
  +    return;
  +}
  +
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  +
  +#if defined(NETWARE)
  +int apache_main(int argc, char *argv[])
  +#elif defined(WIN32)
  + __declspec(dllexport)
  +int apache_main(int argc, char *argv[])
   #else
   int REALMAIN(int argc, char *argv[]) 
   #endif
  @@ -6229,6 +6604,15 @@
       char *signal_to_send = NULL;
       char cwd[MAX_STRING_LEN];
   
  +#ifdef NETWARE
  +    TSD Tsd;
  +
  +    SetCurrentNameSpace(4);
  +    SetTargetNameSpace(4);
  +    signal(SIGTERM, signal_handler);
  +    memset(&Tsd, 0, sizeof(Tsd));
  +    SaveThreadDataAreaPtr(&Tsd);
  +#else
       /* Service application
        * Configuration file in registry at:
        * HKLM\System\CurrentControlSet\Services\[Svc name]\Parameters\ConfPath
  @@ -6237,6 +6621,7 @@
           service_main(master_main, argc, argv);
           clean_parent_exit(0);
       }
  +#endif
   
       /* Console application or a child process. */
   
  @@ -6249,7 +6634,13 @@
   
       common_init();
       ap_setup_prelinked_modules();
  -
  +    
  +#ifdef NETWARE
  +    if(!*ap_server_root) {
  +        ap_cpystrn(ap_server_root, bslash2slash(remove_filename(argv[0])),
  +                   sizeof(ap_server_root));
  +    }
  +#else
       if(!GetCurrentDirectory(sizeof(cwd),cwd)) {
          ap_log_error(APLOG_MARK,APLOG_WIN32ERROR, NULL,
          "GetCurrentDirectory() failure");
  @@ -6258,6 +6649,7 @@
   
       ap_cpystrn(cwd, ap_os_canonical_filename(pcommands, cwd), sizeof(cwd));
       ap_cpystrn(ap_server_root, cwd, sizeof(ap_server_root));
  +#endif
   
       while ((c = getopt(argc, argv, "D:C:c:Xd:f:vVlLZ:iusStThk:n:")) != -1) {
           char **new;
  @@ -6329,17 +6721,21 @@
   	    ap_set_version();
   	    printf("Server version: %s\n", ap_get_server_version());
   	    printf("Server built:   %s\n", ap_get_server_built());
  -	    exit(0);
  +            clean_parent_exit(0);
  +
   	case 'V':
   	    ap_set_version();
   	    show_compile_settings();
  -	    exit(0);
  +            clean_parent_exit(0);
  +
   	case 'l':
   	    ap_show_modules();
  -	    exit(0);
  +            clean_parent_exit(0);
  +
   	case 'L':
   	    ap_show_directives();
  -	    exit(0);
  +            clean_parent_exit(0);
  +
   	case 'X':
   	    ++one_process;	/* Weird debugging mode. */
   	    break;
  @@ -6356,6 +6752,9 @@
   	case '?':
   	    usage(ap_server_argv0);
           }   /* switch */
  +#ifdef NETWARE
  +        ThreadSwitch();
  +#endif
       }       /* while  */
   
       /* ServerConfFile is found in this order:
  @@ -6365,11 +6764,13 @@
        * (4) [Registry: HKLM\Software\[product]\ServerRoot]/SERVER_CONFIG_FILE
        * (5) /HTTPD_ROOT/SERVER_CONFIG_FILE
        */
  -
  +     
       if (!conf_specified) {
           ap_cpystrn(ap_server_confname, SERVER_CONFIG_FILE, sizeof(ap_server_confname));
           if (access(ap_server_root_relative(pcommands, ap_server_confname), 0)) {
  +#ifndef NETWARE
               ap_registry_get_server_root(pconf, ap_server_root, sizeof(ap_server_root));
  +#endif
               if (!*ap_server_root)
                   ap_cpystrn(ap_server_root, HTTPD_ROOT, sizeof(ap_server_root));
               ap_cpystrn(ap_server_root, ap_os_canonical_filename(pcommands, ap_server_root),
  @@ -6377,6 +6778,7 @@
           }
       }
   
  +
       if (!ap_os_is_path_absolute(ap_server_confname)) {
           char *full_conf_path;
   
  @@ -6424,25 +6826,38 @@
           send_signal(pconf, signal_to_send);
           clean_parent_exit(0);
       }
  -
  +    
  +#ifndef NETWARE
       if (!child && !ap_dump_settings) { 
           ap_log_pid(pconf, ap_pid_fname);
       }
  +#endif
   
       post_parse_init();
   
   #ifdef OS2
       printf("%s running...\n", ap_get_server_version());
   #endif
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       if (!child) {
   	printf("%s running...\n", ap_get_server_version());
       }
   #endif
  +
  +#ifndef NETWARE
       if (one_process && !exit_event)
   	exit_event = create_event(0, 0, NULL);
       if (one_process && !start_mutex)
   	start_mutex = ap_create_mutex(NULL);
  +#endif
  +
  +#ifdef NETWARE
  +    worker_main();
  +    destroy_semaphore(allowed_globals.jobsemaphore);
  +
  +    while((ap_thread_count) || (!shutdown_pending))
  +        ThreadSwitchWithDelay();
  +#else
       /*
        * In the future, the main will spawn off a couple
        * of children and monitor them. As soon as a child
  @@ -6457,6 +6872,7 @@
       }
       else 
           master_main(argc, argv);
  +#endif
   
       clean_parent_exit(0);
       return 0;	/* purely to avoid a warning */
  
  
  
  1.150     +1 -1      apache-1.3/src/main/http_request.c
  
  Index: http_request.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_request.c,v
  retrieving revision 1.149
  retrieving revision 1.150
  diff -u -r1.149 -r1.150
  --- http_request.c	1999/05/21 12:16:21	1.149
  +++ http_request.c	1999/10/21 20:44:43	1.150
  @@ -113,7 +113,7 @@
   
   static int check_symlinks(char *d, int opts)
   {
  -#if defined(OS2) || defined(WIN32)
  +#if defined(OS2) || defined(WIN32) || defined(NETWARE)
       /* OS/2 doesn't have symlinks */
       return OK;
   #else
  
  
  
  1.173     +5 -5      apache-1.3/src/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/util.c,v
  retrieving revision 1.172
  retrieving revision 1.173
  diff -u -r1.172 -r1.173
  --- util.c	1999/09/18 10:57:07	1.172
  +++ util.c	1999/10/21 20:44:44	1.173
  @@ -1377,7 +1377,7 @@
       s = (const unsigned char *)str;
       for (; *s; ++s) {
   
  -#if defined(OS2) || defined(WIN32)
  +#if defined(OS2) || defined(WIN32) || defined(NETWARE)
   	/* Don't allow '&' in parameters under OS/2. */
   	/* This can be used to send commands to the shell. */
   	if (*s == '&') {
  @@ -1637,7 +1637,7 @@
   #ifdef MULTIPLE_GROUPS
       int cnt;
   #endif
  -#if defined(OS2) || defined(WIN32)
  +#if defined(OS2) || defined(WIN32) || defined(NETWARE)
       /* OS/2 dosen't have Users and Groups */
       return 1;
   #else
  @@ -1746,7 +1746,7 @@
   #ifdef NEED_INITGROUPS
   int initgroups(const char *name, gid_t basegid)
   {
  -#if defined(QNX) || defined(MPE) || defined(BEOS) || defined(_OSD_POSIX) || defined(TPF) || defined(__TANDEM)
  +#if defined(QNX) || defined(MPE) || defined(BEOS) || defined(_OSD_POSIX) || defined(TPF) || defined(__TANDEM) || defined(NETWARE)
   /* QNX, MPE and BeOS do not appear to support supplementary groups. */
       return 0;
   #else /* ndef QNX */
  @@ -1826,7 +1826,7 @@
   
   API_EXPORT(uid_t) ap_uname2id(const char *name)
   {
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       return (1);
   #else
       struct passwd *ent;
  @@ -1844,7 +1844,7 @@
   
   API_EXPORT(gid_t) ap_gname2id(const char *name)
   {
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       return (1);
   #else
       struct group *ent;
  
  
  
  1.146     +1 -1      apache-1.3/src/main/util_script.c
  
  Index: util_script.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/util_script.c,v
  retrieving revision 1.145
  retrieving revision 1.146
  diff -u -r1.145 -r1.146
  --- util_script.c	1999/08/23 16:20:46	1.145
  +++ util_script.c	1999/10/21 20:44:45	1.146
  @@ -1045,7 +1045,7 @@
           }
           return (pid);
       }
  -
  +#elif defined(NETWARE)
   #else
       if (ap_suexec_enabled
   	&& ((r->server->server_uid != ap_user_id)
  
  
  
  1.67      +8 -0      apache-1.3/src/modules/proxy/mod_proxy.c
  
  Index: mod_proxy.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.c,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- mod_proxy.c	1999/10/11 21:33:35	1.66
  +++ mod_proxy.c	1999/10/21 20:45:01	1.67
  @@ -955,3 +955,11 @@
       NULL,			/* child_exit */
       proxy_detect		/* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.64      +5 -5      apache-1.3/src/modules/proxy/proxy_cache.c
  
  Index: proxy_cache.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_cache.c,v
  retrieving revision 1.63
  retrieving revision 1.64
  diff -u -r1.63 -r1.64
  --- proxy_cache.c	1999/08/27 20:21:49	1.63
  +++ proxy_cache.c	1999/10/21 20:45:03	1.64
  @@ -123,7 +123,7 @@
   			    const char *cachedir, const char *cachesubdir);
   static void help_proxy_garbage_coll(request_rec *r);
   static int should_proxy_garbage_coll(request_rec *r);
  -#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
  +#if !defined(WIN32) && !defined(MPE) && !defined(OS2) && !defined(NETWARE)
   static void detached_proxy_garbage_coll(request_rec *r);
   #endif
   
  @@ -143,7 +143,7 @@
   
       ap_block_alarms();		/* avoid SIGALRM on big cache cleanup */
       if (should_proxy_garbage_coll(r))
  -#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
  +#if !defined(WIN32) && !defined(MPE) && !defined(OS2) && !defined(NETWARE)
           detached_proxy_garbage_coll(r);
   #else
           help_proxy_garbage_coll(r);
  @@ -203,7 +203,7 @@
   	return 0;
   }
   
  -#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
  +#if !defined(WIN32) && !defined(MPE) && !defined(OS2) && !defined(NETWARE)
   static void detached_proxy_garbage_coll(request_rec *r)
   {
       pid_t pid;
  @@ -1141,7 +1141,7 @@
   	    if (!p)
   		break;
   	    *p = '\0';
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   	    if (mkdir(c->filename) < 0 && errno != EEXIST)
   #elif defined(__TANDEM)
   	    if (mkdir(c->filename, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST)
  @@ -1154,7 +1154,7 @@
   	    *p = '/';
   	    ++p;
   	}
  -#if defined(OS2) || defined(WIN32)
  +#if defined(OS2) || defined(WIN32) || defined(NETWARE)
   	/* Under OS/2 use rename. */
   	if (rename(c->tempfile, c->filename) == -1)
   	    ap_log_error(APLOG_MARK, APLOG_ERR, s,
  
  
  
  1.81      +2 -2      apache-1.3/src/modules/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_util.c,v
  retrieving revision 1.80
  retrieving revision 1.81
  diff -u -r1.80 -r1.81
  --- proxy_util.c	1999/08/27 20:21:52	1.80
  +++ proxy_util.c	1999/10/21 20:45:04	1.81
  @@ -280,7 +280,7 @@
   	if (!ap_isdigit(host[i]) && host[i] != '.')
   	    break;
       /* must be an IP address */
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
       if (host[i] == '\0' && (inet_addr(host) == -1))
   #else
       if (host[i] == '\0' && (ap_inet_addr(host) == -1 || inet_network(host) == -1))
  @@ -1242,7 +1242,7 @@
       ap_hard_timeout("proxy connect", r);
       do {
   	i = connect(sock, (struct sockaddr *) addr, sizeof(struct sockaddr_in));
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
   	if (i == SOCKET_ERROR)
   	    errno = WSAGetLastError();
   #endif /* WIN32 */
  
  
  
  1.37      +7 -0      apache-1.3/src/modules/standard/mod_auth_anon.c
  
  Index: mod_auth_anon.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_auth_anon.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- mod_auth_anon.c	1999/01/01 19:05:07	1.36
  +++ mod_auth_anon.c	1999/10/21 20:45:15	1.37
  @@ -313,3 +313,10 @@
       NULL,			/* child_exit */
       NULL			/* post read-request */
   };
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.37      +10 -0     apache-1.3/src/modules/standard/mod_cern_meta.c
  
  Index: mod_cern_meta.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_cern_meta.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- mod_cern_meta.c	1999/01/01 19:05:08	1.36
  +++ mod_cern_meta.c	1999/10/21 20:45:17	1.37
  @@ -150,7 +150,9 @@
   
   #include "httpd.h"
   #include "http_config.h"
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/stat.h>
   #include "util_script.h"
   #include "http_log.h"
  @@ -393,3 +395,11 @@
       NULL,			/* child_exit */
       NULL			/* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.93      +1 -1      apache-1.3/src/modules/standard/mod_cgi.c
  
  Index: mod_cgi.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_cgi.c,v
  retrieving revision 1.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- mod_cgi.c	1999/06/30 04:36:55	1.92
  +++ mod_cgi.c	1999/10/21 20:45:22	1.93
  @@ -210,7 +210,7 @@
   	/* Soak up script output */
   	while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in) > 0)
   	    continue;
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE)
           /* Soak up stderr and redirect it to the error log.
            * Script output to stderr is already directed to the error log
            * on Unix, thanks to the magic of fork().
  
  
  
  1.42      +8 -0      apache-1.3/src/modules/standard/mod_digest.c
  
  Index: mod_digest.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_digest.c,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- mod_digest.c	1999/01/01 19:05:08	1.41
  +++ mod_digest.c	1999/10/21 20:45:24	1.42
  @@ -388,3 +388,11 @@
       NULL,			/* child_exit */
       NULL			/* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.33      +8 -0      apache-1.3/src/modules/standard/mod_expires.c
  
  Index: mod_expires.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_expires.c,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- mod_expires.c	1999/01/01 19:05:09	1.32
  +++ mod_expires.c	1999/10/21 20:45:26	1.33
  @@ -508,3 +508,11 @@
       NULL,                       /* child_exit */
       NULL                        /* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.21      +7 -0      apache-1.3/src/modules/standard/mod_headers.c
  
  Index: mod_headers.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_headers.c,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- mod_headers.c	1999/07/29 17:54:05	1.20
  +++ mod_headers.c	1999/10/21 20:45:28	1.21
  @@ -263,3 +263,10 @@
       NULL,                       /* child_exit */
       NULL                        /* post read-request */
   };
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  \ No newline at end of file
  
  
  
  1.119     +1 -1      apache-1.3/src/modules/standard/mod_include.c
  
  Index: mod_include.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_include.c,v
  retrieving revision 1.118
  retrieving revision 1.119
  diff -u -r1.118 -r1.119
  --- mod_include.c	1999/05/21 23:57:57	1.118
  +++ mod_include.c	1999/10/21 20:45:29	1.119
  @@ -129,7 +129,7 @@
                 ap_ht_time(r->pool, r->finfo.st_mtime, timefmt, 0));
       ap_table_setn(e, "DOCUMENT_URI", r->uri);
       ap_table_setn(e, "DOCUMENT_PATH_INFO", r->path_info);
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
       pw = getpwuid(r->finfo.st_uid);
       if (pw) {
           ap_table_setn(e, "USER_NAME", ap_pstrdup(r->pool, pw->pw_name));
  
  
  
  1.46      +8 -0      apache-1.3/src/modules/standard/mod_info.c
  
  Index: mod_info.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_info.c,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- mod_info.c	1999/06/05 15:48:12	1.45
  +++ mod_info.c	1999/10/21 20:45:32	1.46
  @@ -693,3 +693,11 @@
       NULL,                       /* child_exit */
       NULL                        /* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.145     +15 -5     apache-1.3/src/modules/standard/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v
  retrieving revision 1.144
  retrieving revision 1.145
  diff -u -r1.144 -r1.145
  --- mod_rewrite.c	1999/08/03 09:27:33	1.144
  +++ mod_rewrite.c	1999/10/21 20:45:36	1.145
  @@ -92,7 +92,9 @@
   #include "mod_rewrite.h"
   
   #ifndef NO_WRITEV
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/uio.h>
   #endif
   
  @@ -1200,7 +1202,7 @@
               /* it was finally rewritten to a local path */
   
               /* expand "/~user" prefix */
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
               r->filename = expand_tildepaths(r, r->filename);
   #endif
               rewritelog(r, 2, "local path result: %s", r->filename);
  @@ -2509,7 +2511,7 @@
   **  Unix /etc/passwd database information
   **
   */
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
   static char *expand_tildepaths(request_rec *r, char *uri)
   {
       char user[LONG_STRING_LEN];
  @@ -3274,7 +3276,7 @@
                        "file %s", lockname);
           exit(1);
       }
  -#if !defined(OS2) && !defined(WIN32)
  +#if !defined(OS2) && !defined(WIN32) && !defined(NETWARE)
       /* make sure the childs have access to this file */
       if (geteuid() == 0 /* is superuser */)
           chown(lockname, ap_user_id, -1 /* no gid change */);
  @@ -3437,6 +3439,8 @@
               child_pid = pi.dwProcessId;
           }
       }
  +#elif defined(NETWARE)
  +   // Need something here!!! Spawn????
   #elif defined(OS2)
       /* IBM OS/2 */
       execl(SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
  @@ -3709,7 +3713,7 @@
           LOOKAHEAD(ap_sub_req_lookup_file)
       }
   
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
       /* Win32 has a rather different view of file ownerships.
          For now, just forget it */
   
  @@ -3744,7 +3748,7 @@
               }
           }
       }
  -#endif /* ndef WIN32 */
  +#endif /* ndef WIN32 && NETWARE*/
   
       if (result == NULL) {
           return ap_pstrdup(r->pool, "");
  @@ -4259,5 +4263,11 @@
       return 0;
   }
   
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
   
   /*EOF*/
  
  
  
  1.66      +3 -1      apache-1.3/src/modules/standard/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.h,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- mod_rewrite.h	1999/08/03 09:27:35	1.65
  +++ mod_rewrite.h	1999/10/21 20:45:38	1.66
  @@ -101,7 +101,9 @@
   #include <signal.h>
   #include <errno.h>
   #include <ctype.h>
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/stat.h>
   
       /* Include from the Apache server ... */
  @@ -157,7 +159,7 @@
   #endif
   #if !defined(USE_FCNTL) && !defined(USE_FLOCK)
   #define USE_FLOCK 1
  -#if !defined(MPE) && !defined(WIN32) && !defined(__TANDEM)
  +#if !defined(MPE) && !defined(WIN32) && !defined(__TANDEM) && !defined(NETWARE)
   #include <sys/file.h>
   #endif
   #ifndef LOCK_UN
  
  
  
  1.34      +7 -0      apache-1.3/src/modules/standard/mod_speling.c
  
  Index: mod_speling.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_speling.c,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- mod_speling.c	1999/09/23 19:03:06	1.33
  +++ mod_speling.c	1999/10/21 20:45:40	1.34
  @@ -557,3 +557,10 @@
       NULL,                       /* child_exit */
       NULL                        /* post read-request */
   };
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.108     +7 -0      apache-1.3/src/modules/standard/mod_status.c
  
  Index: mod_status.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_status.c,v
  retrieving revision 1.107
  retrieving revision 1.108
  diff -u -r1.107 -r1.108
  --- mod_status.c	1999/06/05 15:48:12	1.107
  +++ mod_status.c	1999/10/21 20:45:42	1.108
  @@ -771,3 +771,10 @@
       NULL,			/* child_exit */
       NULL			/* post read-request */
   };
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  
  
  
  1.40      +4 -4      apache-1.3/src/modules/standard/mod_userdir.c
  
  Index: mod_userdir.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_userdir.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- mod_userdir.c	1999/03/07 13:13:54	1.39
  +++ mod_userdir.c	1999/10/21 20:45:46	1.40
  @@ -290,10 +290,10 @@
               return REDIRECT;
           }
           else {
  -#ifdef WIN32
  -            /* Need to figure out home dirs on NT */
  +#if defined(WIN32) || defined(NETWARE)
  +            /* Need to figure out home dirs on NT and NetWare */
               return DECLINED;
  -#else                           /* WIN32 */
  +#else                           /* WIN32 & NetWare */
               struct passwd *pw;
               if ((pw = getpwnam(w))) {
   #ifdef OS2
  @@ -303,7 +303,7 @@
                   filename = ap_pstrcat(r->pool, pw->pw_dir, "/", userdir, NULL);
   #endif
               }
  -#endif                          /* WIN32 */
  +#endif                          /* WIN32 & NetWare */
           }
   
           /*
  
  
  
  1.40      +16 -1     apache-1.3/src/modules/standard/mod_usertrack.c
  
  Index: mod_usertrack.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_usertrack.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- mod_usertrack.c	1999/04/29 15:44:31	1.39
  +++ mod_usertrack.c	1999/10/21 20:45:48	1.40
  @@ -135,10 +135,14 @@
   #if defined(NO_GETTIMEOFDAY) && !defined(NO_TIMES)
       clock_t mpe_times;
       struct tms mpe_tms;
  -#elif !defined(WIN32)
  +#elif !defined(WIN32) || defined(NETWARE)
       struct timeval tv;
  +#ifdef NETWARE
  +    time_t tz = 0;
  +#else
       struct timezone tz = {0, 0};
   #endif
  +#endif
       /* 1024 == hardcoded constant */
       char cookiebuf[1024];
       char *new_cookie;
  @@ -158,6 +162,9 @@
       ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
   		(int) getpid(),
                   (long) r->request_time, (long) mpe_tms.tms_utime);
  +#elif defined(NETWARE)
  +    ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
  +        (int) getpid(), (long) r->request_time, (long) clock());                
   #elif defined(WIN32)
       /*
        * We lack gettimeofday() and we lack times(). So we'll use a combination
  @@ -375,3 +382,11 @@
       NULL,                       /* child_exit */
       NULL                        /* post read-request */
   };
  +
  +
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  \ No newline at end of file
  
  
  
  1.27      +30 -1     apache-1.3/src/support/htdigest.c
  
  Index: htdigest.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/support/htdigest.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- htdigest.c	1999/08/02 10:45:36	1.26
  +++ htdigest.c	1999/10/21 20:46:31	1.27
  @@ -67,7 +67,9 @@
    */
   
   #include "ap_config.h"
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include "ap.h"
   #include "ap_md5.h"
   #if defined(MPE) || defined(QNX) || defined(WIN32) || defined(__TANDEM)
  @@ -93,6 +95,7 @@
   
   char *tn;
   
  +
   static void getword(char *word, char *line, char stop)
   {
       int x = 0, y;
  @@ -189,6 +192,18 @@
       exit(1);
   }
   
  +
  +#ifdef NETWARE
  +static void copy_file(FILE *target, FILE *source)
  +{
  +    static char line[MAX_STRING_LEN];
  +
  +    while (!(getline(line, MAX_STRING_LEN, source))) {  
  +	putline(target, line);
  +    }
  +}
  +#endif
  +
   int main(int argc, char *argv[])
   {
       FILE *tfp, *f;
  @@ -257,15 +272,29 @@
       if (!found) {
   	printf("Adding user %s in realm %s\n", user, realm);
   	add_password(user, realm, tfp);
  -    }
  +    }   
       fclose(f);
       fclose(tfp);
  +#ifndef NETWARE
   #if defined(OS2) || defined(WIN32)
       sprintf(command, "copy \"%s\" \"%s\"", tn, argv[1]);
   #else
       sprintf(command, "cp %s %s", tn, argv[1]);
   #endif
       system(command);
  +#else
  +    if (!(tfp = fopen(tn, "r"))) {
  +    fprintf(stderr, "Could not open temp file.\n");
  +    exit(1);
  +    }
  +    
  +    if (!(f = fopen(argv[1], "w"))) {
  +    fprintf(stderr, "Could not open %s.\n", argv[1]);    
  +    exit(1);    
  +    }
  +    
  +    copy_file(f, tfp);
  +#endif
       unlink(tn);
       return 0;
   }
  
  
  
  1.37      +2 -0      apache-1.3/src/support/htpasswd.c
  
  Index: htpasswd.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/support/htpasswd.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- htpasswd.c	1999/09/01 04:12:22	1.36
  +++ htpasswd.c	1999/10/21 20:46:32	1.37
  @@ -79,7 +79,9 @@
    */
   
   #include "ap_config.h"
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <signal.h>
   #include <errno.h>
   #include "ap.h"