From c16d33037103b281f17221b49d0890f04e8f21a4 Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Sun, 1 Dec 2002 23:15:31 +0000 Subject: [PATCH] MFH --- sapi/cgi/libfcgi/acinclude.m4 | 391 +++++++++++++++++++++++++ sapi/cgi/libfcgi/fcgiapp.c | 62 ++-- sapi/cgi/libfcgi/include/fcgi_config.h | 116 +------- sapi/cgi/libfcgi/include/fcgiapp.h | 22 +- sapi/cgi/libfcgi/include/fcgios.h | 4 + sapi/cgi/libfcgi/libfcgi.m4 | 77 +++++ sapi/cgi/libfcgi/os_unix.c | 2 +- 7 files changed, 536 insertions(+), 138 deletions(-) create mode 100644 sapi/cgi/libfcgi/acinclude.m4 create mode 100644 sapi/cgi/libfcgi/libfcgi.m4 diff --git a/sapi/cgi/libfcgi/acinclude.m4 b/sapi/cgi/libfcgi/acinclude.m4 new file mode 100644 index 0000000000..a1cb805e5f --- /dev/null +++ b/sapi/cgi/libfcgi/acinclude.m4 @@ -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 ], + [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 and Alejandro Forero Cuervo + +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_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 ], + [int attr=PTHREAD_CREATE_JOINABLE;], + ok=PTHREAD_CREATE_JOINABLE, ok=unknown) + if test x"$ok" = xunknown; then + AC_TRY_LINK([#include ], + [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 +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 <&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 + ]) +]) + + diff --git a/sapi/cgi/libfcgi/fcgiapp.c b/sapi/cgi/libfcgi/fcgiapp.c index d35b3d140d..75d91f5b93 100644 --- a/sapi/cgi/libfcgi/fcgiapp.c +++ b/sapi/cgi/libfcgi/fcgiapp.c @@ -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); diff --git a/sapi/cgi/libfcgi/include/fcgi_config.h b/sapi/cgi/libfcgi/include/fcgi_config.h index 81ff264d9f..22256df328 100644 --- a/sapi/cgi/libfcgi/include/fcgi_config.h +++ b/sapi/cgi/libfcgi/include/fcgi_config.h @@ -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 header file. */ -#define HAVE_ARPA_INET_H 1 - -/* Define if you have the 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 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 header file. */ -#define HAVE_LIMITS_H 1 - -/* Define if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define if you have the header file. */ -/* #define HAVE_NETDB_H 1 */ - -/* Define if you have the 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 header file. */ -/* #undef HAVE_STDINT_H */ - -/* Define if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the header file. */ -/* #define HAVE_SYS_PARAM_H 1 */ - -/* Define if you have the header file. */ -/*#define HAVE_SYS_SOCKET_H 1*/ - -/* Define if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define if you have the header file. */ -/*#define HAVE_SYS_TIME_H 1*/ - -/* Define if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if you have the 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 does not define. */ -#define ssize_t int \ No newline at end of file diff --git a/sapi/cgi/libfcgi/include/fcgiapp.h b/sapi/cgi/libfcgi/include/fcgiapp.h index 394e2078f9..8e35e0776c 100644 --- a/sapi/cgi/libfcgi/include/fcgiapp.h +++ b/sapi/cgi/libfcgi/include/fcgiapp.h @@ -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); - +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); - + /* *====================================================================== * Both Readers and Writers diff --git a/sapi/cgi/libfcgi/include/fcgios.h b/sapi/cgi/libfcgi/include/fcgios.h index 4abc0dac04..e0f8373fb7 100644 --- a/sapi/cgi/libfcgi/include/fcgios.h +++ b/sapi/cgi/libfcgi/include/fcgios.h @@ -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 index 0000000000..28e73d46a0 --- /dev/null +++ b/sapi/cgi/libfcgi/libfcgi.m4 @@ -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 ], +# [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 ], +# [cin = static_cast(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 ], +# [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 diff --git a/sapi/cgi/libfcgi/os_unix.c b/sapi/cgi/libfcgi/os_unix.c index d7198bb42f..6d4e103272 100644 --- a/sapi/cgi/libfcgi/os_unix.c +++ b/sapi/cgi/libfcgi/os_unix.c @@ -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; -- 2.40.0