You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by David McCreedy <Mc...@us.ibm.com> on 2001/06/12 20:57:21 UTC

[PATCH] TPF: updates to six files

Below are patches to six files for TPF-specific updates:

     src/include/ap_config.h
     src/main/http_config.c
     src/main/http_main.c
     src/main/http_protocol.c
     src/os/tpf/os.c
     src/os/tpf/os.h

These updates are mainly to accommodate changes/enhancments to the TPF
operating system itself:

     allow non-blocking file descriptors now that TPF's select( ) works
with non-socket fd's
     update TPF shutdown code in response to new processing in TPF's
Internet Daemon
     take advantage of fork/exec enhancements on TPF with new code in
os.c
     move TPF-specific printf's for Apache's -V option from http_main.c
to os.c

Please let me know if you have any questions or concerns.

Thank you,

David McCreedy
McCreedy@us.ibm.com


diff -ru3 apache_1.3.20/src/include/ap_config.h
apache-patches/src/include/ap_config.h
--- apache_1.3.20/src/include/ap_config.h	Thu Apr  5 23:13:11 2001
+++ apache-patches/src/include/ap_config.h	Tue Jun  5 14:08:11 2001
@@ -914,6 +914,7 @@
 #define S_IREAD S_IRUSR
 #define S_IWRITE S_IWUSR
 #define S_IEXEC S_IXUSR
+#include <unistd.h>
 #define crypt(buf,salt) ((char *)buf)
 #undef  offsetof
 #define offsetof(s_type,field) ((size_t)&(((s_type*)0)->field))
diff -ru3 apache_1.3.20/src/main/http_config.c
apache-patches/src/main/http_config.c
--- apache_1.3.20/src/main/http_config.c	Tue Jan 23 21:11:09 2001
+++ apache-patches/src/main/http_config.c	Tue Jun  5 14:08:11 2001
@@ -1745,7 +1745,7 @@
     for (n = 0; ap_loaded_modules[n]; ++n) {
 	printf("  %s\n", ap_loaded_modules[n]->name);
     }
-#if !defined(WIN32) && !defined(NETWARE)
+#if !defined(WIN32) && !defined(NETWARE) && !defined(TPF)
     printf("suexec: %s\n",
 	   ap_suexec_enabled
 	       ? "enabled; valid wrapper " SUEXEC_BIN
diff -ru3 apache_1.3.20/src/main/http_main.c
apache-patches/src/main/http_main.c
--- apache_1.3.20/src/main/http_main.c	Thu Apr 12 13:49:26 2001
+++ apache-patches/src/main/http_main.c	Tue Jun  5 14:08:11 2001
@@ -3183,7 +3183,7 @@
 {
     int result = 0;
 
-#if !defined(WIN32) && !defined(NETWARE)
+#if !defined(WIN32) && !defined(NETWARE) && !defined(TPF)
     struct stat wrapper;
 
     if ((stat(SUEXEC_BIN, &wrapper)) != 0) {
@@ -3648,6 +3648,9 @@
     printf("Server's Module Magic Number: %u:%u\n",
 	   MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
     printf("Server compiled with....\n");
+#ifdef TPF
+    show_os_specific_compile_settings();
+#endif
 #ifdef BIG_SECURITY_HOLE
     printf(" -D BIG_SECURITY_HOLE\n");
 #endif
@@ -3666,12 +3669,6 @@
 #ifdef USE_SHMGET_SCOREBOARD
     printf(" -D USE_SHMGET_SCOREBOARD\n");
 #endif
-#ifdef USE_TPF_SCOREBOARD
-    printf(" -D USE_TPF_SCOREBOARD\n");
-#endif
-#ifdef NO_SAWNC
-    printf(" -D NO_SAWNC\n");
-#endif
 #ifdef USE_OS2_SCOREBOARD
     printf(" -D USE_OS2_SCOREBOARD\n");
 #endif
@@ -3737,7 +3734,7 @@
 #ifdef HTTPD_ROOT
     printf(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n");
 #endif
-#ifdef SUEXEC_BIN
+#if defined(SUEXEC_BIN) && !defined(TPF)
     printf(" -D SUEXEC_BIN=\"" SUEXEC_BIN "\"\n");
 #endif
 #if defined(SHARED_CORE) && defined(SHARED_CORE_DIR)
@@ -4763,9 +4760,15 @@
 
 	    perform_idle_server_maintenance();
 #ifdef TPF
-        shutdown_pending = os_check_server(tpf_server_name);
-        ap_check_signals();
-        sleep(1);
+            ap_check_signals();
+            if (!shutdown_pending) {
+                if (os_check_server(tpf_server_name)) {
+                    shutdown_pending++;
+                } else {
+                    sleep(1);
+                    ap_check_signals();
+                }
+            }
 #endif /*TPF */
 	}
 
diff -ru3 apache_1.3.20/src/main/http_protocol.c
apache-patches/src/main/http_protocol.c
--- apache_1.3.20/src/main/http_protocol.c	Fri Mar  9 05:10:26 2001
+++ apache-patches/src/main/http_protocol.c	Tue Jun  5 14:08:11 2001
@@ -2269,13 +2269,16 @@
     long total_bytes_sent = 0;
     register int n, w, o, len, fd;
     fd_set fds;
+#ifdef TPF
+    struct timeval tv;
+#endif 
 
     if (length == 0)
         return 0;
 
     /* Make fb unbuffered and non-blocking */
     ap_bsetflag(fb, B_RD, 0);
-#ifndef TPF    
+#ifndef TPF_NO_NONSOCKET_SELECT
     ap_bnonblock(fb, B_RD);
 #endif
     fd = ap_bfileno(fb, B_RD);
@@ -2334,7 +2337,13 @@
              * we don't care what select says, we might as well loop
back
              * around and try another read
              */
+#ifdef TPF_HAVE_NONSOCKET_SELECT
+            tv.tv_sec =  1;
+            tv.tv_usec = 0;
+            ap_select(fd + 1, &fds, NULL, NULL, &tv);
+#else
             ap_select(fd + 1, &fds, NULL, NULL, NULL);
+#endif  
 #ifdef NDELAY_PIPE_RETURNS_ZERO
 	    afterselect = 1;
 #endif
diff -ru3 apache_1.3.20/src/os/tpf/os.c apache-patches/src/os/tpf/os.c
--- apache_1.3.20/src/os/tpf/os.c	Fri Mar  9 05:10:51 2001
+++ apache-patches/src/os/tpf/os.c	Tue Jun  5 14:08:35 2001
@@ -103,6 +103,7 @@
     ap_check_signals();
     if ((no_reads + no_writes + no_excepts == 0) &&
         (tv) && (tv->tv_sec + tv->tv_usec != 0)) {
+#ifdef TPF_HAVE_SAWNC
         /* TPF's select immediately returns if the sum of
            no_reads, no_writes, and no_excepts is zero.
            This means that the select calls in http_main.c
@@ -110,7 +111,6 @@
            The following code makes TPF's select work a little closer
            to everyone else's select:
         */
-#ifndef NO_SAWNC
         struct ev0bk evnblock;
 
         timeout = tv->tv_sec;
@@ -202,6 +202,14 @@
    TPF_FORK_CHILD           *cld = (TPF_FORK_CHILD *) data;
    array_header             *env_arr = ap_table_elts ((array_header *)
cld->subprocess_env);
    table_entry              *elts = (table_entry *) env_arr->elts;
+#ifdef TPF_FORK_EXTENDED
+   char                     *args[2];
+   char                     **envp = NULL;
+   pool                     *subpool;
+
+#include <util_script.h>
+
+#endif /* TPF_FORK_EXTENDED */ 
 
    if (func) {
       if (result=func(data, NULL)) {
@@ -233,12 +241,22 @@
       dup2(err_fds[1], STDERR_FILENO);
    }
 
+/* set up environment variables for the tpf_fork */
    if (cld->subprocess_env) {
+#ifdef TPF_FORK_EXTENDED
+   /* with extended tpf_fork( ) we pass the pointer to a list of
pointers */
+   /* that point to "key=value" strings for each env
variable             */ 
+      subpool = ap_make_sub_pool(p);
+      envp = ap_create_environment(subpool, cld->subprocess_env);
+#else
+   /* without extended tpf_fork( ) we setenv( ) each env variable */
+   /* so the child inherits them                                  */
       for (i = 0; i < env_arr->nelts; ++i) {
            if (!elts[i].key)
                continue;
            setenv (elts[i].key, elts[i].val, 1);
        }
+#endif /* TPF_FORK_EXTENDED */
    }
 
    fork_input.program = (const char*) cld->filename;
@@ -248,8 +266,15 @@
    fork_input.ebw_data = NULL;
    fork_input.parm_data = NULL;
 
-
+#ifdef TPF_FORK_EXTENDED
+   args[0] = cld->filename;
+   args[1] = NULL;
+   if ((pid = tpf_fork(&fork_input,
+                       (const char **)args,
+                       (const char **)envp)) < 0) {
+#else
    if ((pid = tpf_fork(&fork_input)) < 0) {
+#endif /* TPF_FORK_EXTENDED */
        save_errno = errno;
        if (pipe_out) {
            close(out_fds[0]);
@@ -264,6 +289,11 @@
        pid = 0;
    }
 
+#ifdef TPF_FORK_EXTENDED
+   if (subpool) {
+       ap_destroy_pool(subpool);
+   }
+#else 
    if (cld->subprocess_env) {
        for (i = 0; i < env_arr->nelts; ++i) {
             if (!elts[i].key)
@@ -271,6 +301,7 @@
             unsetenv (elts[i].key);
        }
    }
+#endif /* TPF_FORK_EXTENDED */
 
    if (pipe_out) {
        close(out_fds[1]);
@@ -354,7 +385,11 @@
     fork_input.istream = TPF_FORK_IS_BALANCE;
     fork_input.ebw_data_length = sizeof(input_parms);
     fork_input.parm_data = "-x";
+#ifdef TPF_FORK_EXTENDED
+    return tpf_fork(&fork_input, NULL, NULL);
+#else
     return tpf_fork(&fork_input);
+#endif /* TPF_FORK_EXTENDED */
 }
 
 void ap_tpf_zinet_checks(int standalone,
@@ -713,4 +748,38 @@
     }
 
     return(0);
+}
+
+/*
+   This function augments http_main's show_compile_settings function.
+   This way definitions that are only shown on TPF won't clutter up
+   main line code.
+*/
+void show_os_specific_compile_settings(void)
+{
+
+#ifdef USE_TPF_SCOREBOARD
+    printf(" -D USE_TPF_SCOREBOARD\n");
+#endif
+
+#ifdef TPF_FORK_EXTENDED
+    printf(" -D TPF_FORK_EXTENDED\n"); 
+#endif
+
+#ifdef TPF_HAVE_NONSOCKET_SELECT
+    printf(" -D TPF_HAVE_NONSOCKET_SELECT\n"); 
+#endif
+
+#ifdef TPF_NO_NONSOCKET_SELECT 
+    printf(" -D TPF_NO_NONSOCKET_SELECT\n"); 
+#endif
+
+#ifdef TPF_HAVE_SAWNC
+    printf(" -D TPF_HAVE_SAWNC\n"); 
+#endif
+
+#ifdef TPF_NO_SAWNC
+    printf(" -D TPF_NO_SAWNC\n"); 
+#endif
+
 }
diff -ru3 apache_1.3.20/src/os/tpf/os.h apache-patches/src/os/tpf/os.h
--- apache_1.3.20/src/os/tpf/os.h	Fri May 11 22:37:23 2001
+++ apache-patches/src/os/tpf/os.h	Tue Jun  5 14:08:11 2001
@@ -1,8 +1,58 @@
 #ifndef APACHE_OS_H
 #define APACHE_OS_H
 
+/*
+ * This file is included in all Apache source code. It contains
definitions
+ * of facilities available on _this_ operating system (HAVE_* macros),
+ * and prototypes of OS specific functions defined in os.c or
os-inline.c
+ */
+
 #define PLATFORM "TPF"
 
+/************************************************************************
+ *  PJ26895 provides support for non_socket_select.
+ *  You can determine if this apar is applied to your system by looking
+ *  at i$pwbl.h.  If the function non_socket_select is defined,
+ *  then add #define TPF_HAVE_NONSOCKET_SELECT
+ *  else add #define TPF_NO_NONSOCKET_SELECT
+ *
+ *  One of these two #defines is required and must be added here in
os.h
+ *  before the following check.
+
************************************************************************/
+
+#if !defined(TPF_HAVE_NONSOCKET_SELECT) &&
!defined(TPF_NO_NONSOCKET_SELECT)
+   #error "You must define whether your system supports
non_socket_select()"
+   #error "See src/os/tpf/os.h for instructions"
+#endif
+
+#if defined(TPF_HAVE_NONSOCKET_SELECT) &&
defined(TPF_NO_NONSOCKET_SELECT)
+   #error "TPF_HAVE_NONSOCKET_SELECT and TPF_NO_NONSOCKET_SELECT"
+   #error "cannot both be defined"
+   #error "See src/os/tpf/os.h for instructions"
+#endif
+
+/************************************************************************
+ *  PJ27387 or PJ26188 provides support for tpf_sawnc.
+ *  You can determine if this apar is applied to your system by looking
at
+ *  tpfapi.h or i$fsdd.h.  If the function tpf_sawnc is defined,
+ *  then add #define TPF_HAVE_SAWNC
+ *  else add #define TPF_NO_SAWNC
+ *
+ *  One of these two #defines is required and must be added here in
os.h
+ *  before the following check.
+
************************************************************************/
+
+#if !defined(TPF_HAVE_SAWNC) && !defined(TPF_NO_SAWNC)
+   #error "You must define whether your system supports tpf_sawnc()"
+   #error "See src/os/tpf/os.h for instructions"
+#endif
+
+#if defined(TPF_HAVE_SAWNC) && defined(TPF_NO_SAWNC)
+   #error "TPF_HAVE_SAWNC and TPF_NO_SAWNC"
+   #error "cannot both be defined"
+   #error "See src/os/tpf/os.h for instructions"
+#endif
+
 /* if the compiler defined errno then undefine it
    and pick up the correct definition from errno.h */
 #if defined(errno) && !defined(__errnoh)
@@ -10,12 +60,16 @@
 #include <errno.h>
 #endif
 
-/*
- * This file is included in all Apache source code. It contains
definitions
- * of facilities available on _this_ operating system (HAVE_* macros),
- * and prototypes of OS specific functions defined in os.c or
os-inline.c
- */
+/* If APAR PJ27277 (which shipped on PUT13) has been applied */
+/* then we want to #define TPF_FORK_EXTENDED so Perl CGIs will work. */
+/* Rather than hardcoding it we'll check for "environ" in stdlib.h, */
+/* which was also added by PJ27277. */
+#include <stdlib.h>
+#if defined(environ) && !defined(TPF_FORK_EXTENDED)
+#define TPF_FORK_EXTENDED
+#endif
 
+#include <sysapi.h>  
 #include "ap_config.h"
 
 #ifdef HAVE_ISNAN
@@ -127,6 +181,7 @@
                          const char *servername,
                          struct server_rec *s);
 int os_check_server(char *server);
+void show_os_specific_compile_settings(void);
 char *getpass(const char *prompt);
 int killpg(pid_t pgrp, int sig);
 extern char *ap_server_argv0;