]> granicus.if.org Git - php/commitdiff
MFH
authorShane Caraveo <shane@php.net>
Sun, 1 Dec 2002 23:15:31 +0000 (23:15 +0000)
committerShane Caraveo <shane@php.net>
Sun, 1 Dec 2002 23:15:31 +0000 (23:15 +0000)
sapi/cgi/libfcgi/acinclude.m4 [new file with mode: 0644]
sapi/cgi/libfcgi/fcgiapp.c
sapi/cgi/libfcgi/include/fcgi_config.h
sapi/cgi/libfcgi/include/fcgiapp.h
sapi/cgi/libfcgi/include/fcgios.h
sapi/cgi/libfcgi/libfcgi.m4 [new file with mode: 0644]
sapi/cgi/libfcgi/os_unix.c

diff --git a/sapi/cgi/libfcgi/acinclude.m4 b/sapi/cgi/libfcgi/acinclude.m4
new file mode 100644 (file)
index 0000000..a1cb805
--- /dev/null
@@ -0,0 +1,391 @@
+dnl     $Id$
+
+AC_DEFUN(FCGI_COMMON_CHECKS, [
+    AC_CHECK_TYPE([ssize_t], [int]) 
+
+    AC_MSG_CHECKING([for sun_len in sys/un.h])
+    AC_EGREP_HEADER([sun_len], [sys/un.h],
+       [AC_MSG_RESULT([yes])
+        AC_DEFINE([HAVE_SOCKADDR_UN_SUN_LEN], [1],
+          [Define if sockaddr_un in sys/un.h contains a sun_len component])],
+       AC_MSG_RESULT([no]))
+
+    AC_MSG_CHECKING([for fpos_t in stdio.h])
+    AC_EGREP_HEADER([fpos_t], [stdio.h],
+       [AC_MSG_RESULT([yes])
+        AC_DEFINE([HAVE_FPOS], [1], 
+           [Define if the fpos_t typedef is in stdio.h])],
+       AC_MSG_RESULT([no]))
+
+    AC_CHECK_HEADERS([sys/socket.h netdb.h netinet/in.h arpa/inet.h])
+    AC_CHECK_HEADERS([sys/time.h limits.h sys/param.h unistd.h])
+
+    AC_MSG_CHECKING([for a fileno() prototype in stdio.h])
+    AC_EGREP_HEADER([fileno], [stdio.h], 
+           [AC_MSG_RESULT([yes]) 
+            AC_DEFINE([HAVE_FILENO_PROTO], [1], 
+                  [Define if there's a fileno() prototype in stdio.h])],
+           AC_MSG_RESULT([no]))
+
+    if test "$HAVE_SYS_SOCKET_H"; then
+       AC_MSG_CHECKING([for socklen_t in sys/socket.h])
+       AC_EGREP_HEADER([socklen_t], [sys/socket.h],
+           [AC_MSG_RESULT([yes])
+            AC_DEFINE([HAVE_SOCKLEN], [1],
+                              [Define if the socklen_t typedef is in sys/socket.h])],
+          AC_MSG_RESULT([no]))
+    fi
+
+    #--------------------------------------------------------------------
+    #  Do we need cross-process locking on this platform?
+    #--------------------------------------------------------------------
+    AC_MSG_CHECKING([whether cross-process locking is required by accept()])
+    case "`uname -sr`" in
+       IRIX\ 5.* | SunOS\ 5.* | UNIX_System_V\ 4.0)    
+                   AC_MSG_RESULT([yes])
+                   AC_DEFINE([USE_LOCKING], [1], 
+                     [Define if cross-process locking is required by accept()])
+           ;;
+       *)
+                   AC_MSG_RESULT([no])
+               ;;
+    esac
+
+    #--------------------------------------------------------------------
+    #  Does va_arg(arg, long double) crash the compiler?
+    #  hpux 9.04 compiler does and so does Stratus FTX (uses HP's compiler)
+    #--------------------------------------------------------------------
+    AC_MSG_CHECKING([whether va_arg(arg, long double) crashes the compiler])
+    AC_TRY_COMPILE([#include <stdarg.h>],
+       [long double lDblArg; va_list arg; lDblArg = va_arg(arg, long double);],
+       AC_MSG_RESULT([no]),
+       [AC_MSG_RESULT([yes])
+       AC_DEFINE([HAVE_VA_ARG_LONG_DOUBLE_BUG], [1],
+             [Define if va_arg(arg, long double) crashes the compiler])])
+
+    AC_C_CONST 
+])
+
+
+dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+dnl
+dnl This macro figures out how to build C programs using POSIX
+dnl threads.  It sets the PTHREAD_LIBS output variable to the threads
+dnl library and linker flags, and the PTHREAD_CFLAGS output variable
+dnl to any special C compiler flags that are needed.  (The user can also
+dnl force certain compiler flags/libs to be tested by setting these
+dnl environment variables.)
+dnl
+dnl Also sets PTHREAD_CC to any special C compiler that is needed for
+dnl multi-threaded programs (defaults to the value of CC otherwise).
+dnl (This is necessary on AIX to use the special cc_r compiler alias.)
+dnl
+dnl If you are only building threads programs, you may wish to
+dnl use these variables in your default LIBS, CFLAGS, and CC:
+dnl
+dnl        LIBS="$PTHREAD_LIBS $LIBS"
+dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+dnl        CC="$PTHREAD_CC"
+dnl
+dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE
+dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+dnl
+dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
+dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
+dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
+dnl the default action will define HAVE_PTHREAD.
+dnl
+dnl Please let the authors know if this macro fails on any platform,
+dnl or if you have any other suggestions or comments.  This macro was
+dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org)
+dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread
+dnl macros posted by AFC to the autoconf macro repository.  We are also
+dnl grateful for the helpful feedback of numerous users.
+dnl
+dnl @version $Id$
+dnl @author Steven G. Johnson <stevenj@alum.mit.edu> and Alejandro Forero Cuervo <bachue@bachue.com>
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+acx_pthread_ok=no
+
+# First, check if the POSIX threads header, pthread.h, is available.
+# If it isn't, don't bother looking for the threads libraries.
+AC_CHECK_HEADER(pthread.h, , acx_pthread_ok=noheader)
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthread or
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: threads are created detached by default
+        # and the JOINABLE attribute has a nonstandard name (UNDETACHED).
+        AC_MSG_CHECKING([for joinable pthread attribute])
+        AC_TRY_LINK([#include <pthread.h>],
+                    [int attr=PTHREAD_CREATE_JOINABLE;],
+                    ok=PTHREAD_CREATE_JOINABLE, ok=unknown)
+        if test x"$ok" = xunknown; then
+                AC_TRY_LINK([#include <pthread.h>],
+                            [int attr=PTHREAD_CREATE_UNDETACHED;],
+                            ok=PTHREAD_CREATE_UNDETACHED, ok=unknown)
+        fi
+        if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then
+                AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok,
+                          [Define to the necessary symbol if this constant
+                           uses a non-standard name on your system.])
+        fi
+        AC_MSG_RESULT(${ok})
+        if test x"$ok" = xunknown; then
+                AC_MSG_WARN([we do not know how to create joinable pthreads])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+                *-aix* | *-freebsd*)     flag="-D_THREAD_SAFE";;
+                *solaris* | alpha*-osf*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+                PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        # More AIX lossage: must compile with cc_r
+        AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+
+])dnl ACX_PTHREAD
+
+
+
+dnl @synopsis AC_PROG_CC_WARNINGS([ANSI])
+dnl
+dnl Enables a reasonable set of warnings for the C compiler.  Optionally,
+dnl if the first argument is nonempty, turns on flags which enforce and/or
+dnl enable proper ANSI C if such flags are known to the compiler used.
+dnl
+dnl Currently this macro knows about GCC, Solaris C compiler,
+dnl Digital Unix C compiler, C for AIX Compiler, HP-UX C compiler,
+dnl and IRIX C compiler.
+dnl
+dnl @version $Id$
+dnl @author Ville Laurikari <vl@iki.fi>
+dnl
+AC_DEFUN([AC_PROG_CC_WARNINGS], [
+  ansi=$1
+  if test -z "$ansi"; then
+    msg="for C compiler warning flags"
+  else
+    msg="for C compiler warning and ANSI conformance flags"
+  fi
+  AC_CACHE_CHECK($msg, ac_cv_prog_cc_warnings, [
+    if test -n "$CC"; then
+      cat > conftest.c <<EOF
+int main(int argc, char **argv) { return 0; }
+EOF
+
+      dnl GCC
+      if test "$GCC" = "yes"; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="-Wall"
+        else
+          ac_cv_prog_cc_warnings="-Wall -ansi -pedantic"
+        fi
+
+      dnl Solaris C compiler
+      elif $CC -flags 2>&1 | grep "Xc.*strict ANSI C" > /dev/null 2>&1 &&
+           $CC -c -v -Xc conftest.c > /dev/null 2>&1 &&
+           test -f conftest.o; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="-v"
+        else
+          ac_cv_prog_cc_warnings="-v -Xc"
+        fi
+
+      dnl HP-UX C compiler
+      elif $CC > /dev/null 2>&1 &&
+           $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 &&
+           test -f conftest.o; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="+w1"
+        else
+          ac_cv_prog_cc_warnings="+w1 -Aa"
+        fi
+
+      dnl Digital Unix C compiler
+      elif ! $CC > /dev/null 2>&1 &&
+           $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 &&
+           test -f conftest.o; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="-verbose -w0 -warnprotos"
+        else
+          ac_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1"
+        fi
+
+      dnl C for AIX Compiler
+      elif $CC > /dev/null 2>&1 | grep AIX > /dev/null 2>&1 &&
+           $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 &&
+           test -f conftest.o; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"
+        else
+          ac_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi"
+        fi
+
+      dnl IRIX C compiler
+      elif $CC -fullwarn -ansi -ansiE > /dev/null 2>&1 &&
+           test -f conftest.o; then
+        if test -z "$ansi"; then
+          ac_cv_prog_cc_warnings="-fullwarn"
+        else
+          ac_cv_prog_cc_warnings="-fullwarn -ansi -ansiE"
+        fi
+
+      fi
+      rm -f conftest.*
+    fi
+    if test -n "$ac_cv_prog_cc_warnings"; then
+      CFLAGS="$CFLAGS $ac_cv_prog_cc_warnings"
+    else
+      ac_cv_prog_cc_warnings="unknown"
+    fi
+  ])
+])
+
+
index d35b3d140d3116a3fe61919e30ef2a52d93bfe50..75d91f5b935d320b54bfa561aa178a55078ee5fd 100644 (file)
@@ -70,7 +70,7 @@ static int libInitialized = 0;
 static int isFastCGI = -1;
 static char *webServerAddressList = NULL;
 static FCGX_Request the_request;
-void _FCGX_FreeStream(FCGX_Stream **streamPtr, BOOL freeData);
+void _FCGX_FreeStream(FCGX_Stream **streamPtr, int freeData);
 
 void FCGX_ShutdownPending(void)
 {
@@ -980,24 +980,7 @@ void FCGX_ClearError(FCGX_Stream *stream) {
      */
 }
 
-/*
- *======================================================================
- * Parameters
- *======================================================================
- */
 
-/*
- * A vector of pointers representing the parameters received
- * by a FastCGI application server, with the vector's length
- * and last valid element so adding new parameters is efficient.
- */
-
-typedef struct Params {
-    FCGX_ParamArray vec;    /* vector of strings */
-    int length;                    /* number of string vec can hold */
-    char **cur;                    /* current item in vec; *cur == NULL */
-} Params;
-typedef Params *ParamsPtr;
 
 /*
  *----------------------------------------------------------------------
@@ -1071,13 +1054,45 @@ static void PutParam(ParamsPtr paramsPtr, char *nameValue)
     *paramsPtr->cur++ = nameValue;
     size = paramsPtr->cur - paramsPtr->vec;
     if(size >= paramsPtr->length) {
-       paramsPtr->length *= 2;
-       paramsPtr->vec = (FCGX_ParamArray)realloc(paramsPtr->vec, paramsPtr->length * sizeof(char *));
-       paramsPtr->cur = paramsPtr->vec + size;
+        paramsPtr->length *= 2;
+        paramsPtr->vec = (FCGX_ParamArray)realloc(paramsPtr->vec, paramsPtr->length * sizeof(char *));
+        paramsPtr->cur = paramsPtr->vec + size;
     }
     *paramsPtr->cur = NULL;
 }
 
+
+void FCGX_PutEnv(FCGX_Request *request, char *var)
+{
+       char *nameValue;
+       char *e, **p;
+       int len;
+
+       if (!strchr(var,'=')) {
+               return;
+       }
+       nameValue = StringCopy(var);
+       e = strchr(nameValue,'=');
+       *e = 0;
+
+       /* find the name and replace it */
+    len = strlen(nameValue);
+
+    for (p = request->envp; p && *p; ++p) {
+        if((strncmp(nameValue, *p, len) == 0) && ((*p)[len] == '=')) {
+            free(*p);
+                       *e = '=';
+                       *p = nameValue;
+                       return;
+        }
+    }
+    *e = '=';
+       /* this is a new var, add it to the environment */
+       PutParam(request->paramsPtr,nameValue);
+       request->envp = request->paramsPtr->vec;
+}
+
+
 /*
  *----------------------------------------------------------------------
  *
@@ -1100,7 +1115,7 @@ char *FCGX_GetParam(const char *name, FCGX_ParamArray envp)
 
     len = strlen(name);
 
-    for (p = envp; *p; ++p) {
+    for (p = envp; p && *p; ++p) {
         if((strncmp(name, *p, len) == 0) && ((*p)[len] == '=')) {
             return *p+len+1;
         }
@@ -1814,7 +1829,7 @@ void FCGX_FreeStream(FCGX_Stream **streamPtr)
        _FCGX_FreeStream(streamPtr, TRUE);
 }
 
-void _FCGX_FreeStream(FCGX_Stream **streamPtr, BOOL freeData)
+void _FCGX_FreeStream(FCGX_Stream **streamPtr, int freeData)
 {
     FCGX_Stream *stream = *streamPtr;
     FCGX_Stream_Data *data;
@@ -2027,6 +2042,7 @@ void FCGX_Free(FCGX_Request * request, int close)
     _FCGX_FreeStream(&request->out, FALSE);
     _FCGX_FreeStream(&request->err, FALSE);
     FreeParams(&request->paramsPtr);
+       request->envp = NULL;
 
     if (close) {
         OS_IpcClose(request->ipcFd);
index 81ff264d9f5e00a20089a8922bb922a1c5e3f94e..22256df3283d34a071c21cb06e393006c49e2384 100644 (file)
@@ -1,111 +1,7 @@
-/* fcgi_config.h.  Generated automatically by configure.  */
-/* fcgi_config.h.in.  Generated automatically from configure.in by autoheader.  */
+/* hack workaround for libfcgi configure */
+#ifdef _WIN32
+#include "fcgi_config_win32.h"
+#else
+#include "main/php_config.h"
+#endif
 
-/* Define if you have the <arpa/inet.h> header file. */
-#define HAVE_ARPA_INET_H 1
-
-/* Define if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define if there's a fileno() prototype in stdio.h */
-#define HAVE_FILENO_PROTO 1
-
-/* Define if the fpos_t typedef is in stdio.h */
-#define HAVE_FPOS 1
-
-/* Define if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define if you have the `dnet_stub' library (-ldnet_stub). */
-/* #undef HAVE_LIBDNET_STUB */
-
-/* Define if you have the `ieee' library (-lieee). */
-/* #undef HAVE_LIBIEEE */
-
-/* Define if you have the `nsl' library (-lnsl). */
-#define HAVE_LIBNSL 1
-
-/* Define if you have the pthread library */
-#define HAVE_LIBPTHREAD 1
-
-/* Define if you have the `resolv' library (-lresolv). */
-#define HAVE_LIBRESOLV 1
-
-/* Define if you have the `socket' library (-lsocket). */
-#define HAVE_LIBSOCKET 1
-
-/* Define if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <netdb.h> header file. */
-/* #define HAVE_NETDB_H 1 */
-
-/* Define if you have the <netinet/in.h> header file. */
-#define HAVE_NETINET_IN_H 1
-
-/* Define if sockaddr_un in sys/un.h contains a sun_len component */
-/* #undef HAVE_SOCKADDR_UN_SUN_LEN */
-
-/* Define if the socklen_t typedef is in sys/socket.h */
-/* #undef HAVE_SOCKLEN */
-
-/* Define if you have the <stdint.h> header file. */
-/* #undef HAVE_STDINT_H */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/param.h> header file. */
-/* #define HAVE_SYS_PARAM_H 1 */
-
-/* Define if you have the <sys/socket.h> header file. */
-/*#define HAVE_SYS_SOCKET_H 1*/
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/time.h> header file. */
-/*#define HAVE_SYS_TIME_H 1*/
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/*#define HAVE_UNISTD_H 1*/
-
-/* Define if va_arg(arg, long double) crashes the compiler */
-/* #undef HAVE_VA_ARG_LONG_DOUBLE_BUG */
-
-/* Name of package */
-#define PACKAGE "fcgi"
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if cross-process locking is required by accept() */
-#define USE_LOCKING 1
-
-/* Version number of package */
-#define VERSION "2.2.2"
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define as `__inline' if that's what the C compiler calls it, or to nothing
-   if it is not supported. */
-/* #undef inline */
-
-/* Define to `int' if <sys/types.h> does not define. */
-#define ssize_t int
\ No newline at end of file
index 394e2078f9a81d02772073a7c3a575de7ccbd310..8e35e0776ca1d67a7861107650ebeb2be8d8e0fb 100644 (file)
@@ -79,6 +79,19 @@ typedef struct FCGX_Stream {
  */
 typedef char **FCGX_ParamArray;
 
+/*
+ * A vector of pointers representing the parameters received
+ * by a FastCGI application server, with the vector's length
+ * and last valid element so adding new parameters is efficient.
+ */
+
+typedef struct Params {
+    FCGX_ParamArray vec;    /* vector of strings */
+    int length;                    /* number of string vec can hold */
+    char **cur;                    /* current item in vec; *cur == NULL */
+} Params;
+typedef Params *ParamsPtr;
+
 /*
  * FCGX_Request Flags
  *
@@ -98,11 +111,11 @@ typedef struct FCGX_Request {
     FCGX_Stream *in;
     FCGX_Stream *out;
     FCGX_Stream *err;
-       char **envp;
+       FCGX_ParamArray envp;
 
        /* Don't use anything below here */
 
-    struct Params *paramsPtr;
+    ParamsPtr paramsPtr;
     int ipcFd;               /* < 0 means no connection */
     int isBeginProcessed;     /* FCGI_BEGIN_REQUEST seen */
     int keepConnection;       /* don't close ipcFd at end of request */
@@ -351,7 +364,8 @@ DLLAPI void FCGX_SetExitStatus(int status, FCGX_Stream *stream);
  *----------------------------------------------------------------------
  */
 DLLAPI char *FCGX_GetParam(const char *name, FCGX_ParamArray envp);
-\f
+DLLAPI void FCGX_PutEnv(FCGX_Request *request, char *nameValue);
+
 /*
  *======================================================================
  * Readers
@@ -533,7 +547,7 @@ DLLAPI int FCGX_VFPrintF(FCGX_Stream *stream, const char *format, va_list arg);
  *----------------------------------------------------------------------
  */
 DLLAPI int FCGX_FFlush(FCGX_Stream *stream);
-\f
+
 /*
  *======================================================================
  * Both Readers and Writers
index 4abc0dac046b0d6cad558364fe7490f4cab78015..e0f8373fb75bc7422c3c54e4d9d82fadb01dd109 100644 (file)
@@ -108,7 +108,11 @@ DLLAPI int OS_CreateLocalIpcFd(const char *bindPath, int backlog, int bCreateMut
 DLLAPI int OS_FcgiConnect(char *bindPath);
 DLLAPI int OS_Read(int fd, char * buf, size_t len);
 DLLAPI int OS_Write(int fd, char * buf, size_t len);
+#ifdef _WIN32
 DLLAPI int OS_SpawnChild(char *execPath, int listenFd, PROCESS_INFORMATION *pInfo, char *env);
+#else
+DLLAPI int OS_SpawnChild(char *execPath, int listenfd);
+#endif
 DLLAPI int OS_AsyncReadStdin(void *buf, int len, OS_AsyncProc procPtr,
                       ClientData clientData);
 DLLAPI int OS_AsyncRead(int fd, int offset, void *buf, int len,
diff --git a/sapi/cgi/libfcgi/libfcgi.m4 b/sapi/cgi/libfcgi/libfcgi.m4
new file mode 100644 (file)
index 0000000..28e73d4
--- /dev/null
@@ -0,0 +1,77 @@
+dnl     $Id$
+dnl
+dnl     This file is an input file used by the GNU "autoconf" program to
+dnl     generate the file "configure", which is run during the build
+dnl     to configure the system for the local environment.
+
+#AC_INIT
+#AM_INIT_AUTOMAKE(fcgi, 2.2.3-SNAP-0203171857)
+
+#AM_CONFIG_HEADER(include/fcgi_config.h)
+
+#AC_PROG_CC
+#AC_PROG_CPP 
+#AC_PROG_INSTALL 
+#AC_PROG_LIBTOOL
+
+#AC_PROG_CXX
+
+#AC_LANG([C++])
+
+#dnl autoconf defaults CXX to 'g++', so its unclear whether it exists/works
+#AC_MSG_CHECKING([whether $CXX works])
+#AC_TRY_COMPILE([#include <iostream>], 
+#               [std::cout << "ok";], 
+#               [AC_MSG_RESULT(yes)
+#                LIBFCGIXX=libfcgi++.la
+#                ECHO_CPP=echo-cpp${EXEEXT}
+#                AC_MSG_CHECKING([whether cin has a streambuf assignment operator])
+#                AC_TRY_COMPILE([#include <iostream>], 
+#                               [cin = static_cast<streambuf *>(0);], 
+#                               [AC_MSG_RESULT(yes)
+#                                AC_DEFINE([HAVE_IOSTREAM_WITHASSIGN_STREAMBUF],  [1], 
+#                                          [Define if cin/cout/cerr has a streambuf assignment operator])],
+#                               [AC_MSG_RESULT(no)]) 
+#                AC_MSG_CHECKING([whether char_type is defined in the context of streambuf])
+#                AC_TRY_COMPILE([#include <iostream>],
+#                               [class fcgi_streambuf : public std::streambuf { char_type ct; }],
+#                               [AC_MSG_RESULT(yes)
+#                                AC_DEFINE([HAVE_STREAMBUF_CHAR_TYPE], [1], 
+#                                          [Define if char_type is defined in the context of streambuf])],
+#                               [AC_MSG_RESULT(no)])],
+#               [AC_MSG_RESULT(no)])
+#AC_SUBST(LIBFCGIXX)
+#AC_SUBST(ECHO_CPP)
+
+#AC_LANG([C])
+
+AC_CHECK_LIB([nsl],       [gethostbyname])
+AC_CHECK_LIB([socket],    [socket]) 
+
+ACX_PTHREAD([THREADED=threaded${EXEEXT}])
+AC_SUBST([THREADED])
+
+FCGI_COMMON_CHECKS
+
+AC_REPLACE_FUNCS([strerror])
+
+#AC_C_INLINE
+
+#--------------------------------------------------------------------
+#  This is a little hokie in that it avoids including config.guess
+#  and config.sub in the distribution, but its been working so far.
+#  Windows builds don't run configure so we should be safe fixing
+#  this to 'unix' (at least for now).
+#--------------------------------------------------------------------
+#SYSTEM=unix
+#AC_SUBST([SYSTEM])
+
+#AC_PROG_CC_WARNINGS
+
+#AC_CONFIG_FILES([Makefile
+#                 cgi-fcgi/Makefile
+#                 include/Makefile
+#                 libfcgi/Makefile
+#                 examples/Makefile])
+
+#AC_OUTPUT
index d7198bb42f50afab3a78415de2944cbf5a09c0e8..6d4e1032722539ff2e78c7889eb1a8ae3b9ff6fb 100644 (file)
@@ -498,7 +498,7 @@ int OS_Write(int fd, char * buf, size_t len)
  *
  *----------------------------------------------------------------------
  */
-int OS_SpawnChild(char *appPath, int listenFd, PROCESS_INFORMATION *pInfo, char *env)
+int OS_SpawnChild(char *appPath, int listenFd)
 {
     int forkResult;