--- fcgi/libfcgi/fcgiapp.c.orig 2001-12-13 01:54:10 +0300 +++ fcgi/libfcgi/fcgiapp.c 2007-03-24 22:37:32 +0300 @@ -886,7 +886,7 @@ static void CopyAndAdvance(char **destPt */ int FCGX_FFlush(FCGX_Stream *stream) { - if(stream->isClosed || stream->isReader) + if(!stream || stream->isClosed || stream->isReader) return 0; stream->emptyBuffProc(stream, FALSE); return (stream->isClosed) ? -1 : 0; @@ -990,12 +990,6 @@ 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. @@ -1003,8 +997,8 @@ void FCGX_ClearError(FCGX_Stream *stream 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 */ + int length; /* number of string vec can hold */ + char **cur; /* current item in vec; *cur == NULL */ } Params; typedef Params *ParamsPtr; @@ -1080,13 +1074,45 @@ static void PutParam(ParamsPtr paramsPtr *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; +} + + /* *---------------------------------------------------------------------- * @@ -1109,7 +1135,7 @@ char *FCGX_GetParam(const char *name, FC 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; } @@ -1946,7 +1972,8 @@ int FCGX_IsCGI(void) int rc = FCGX_Init(); if (rc) { /* exit() isn't great, but hey */ - exit((rc < 0) ? rc : -rc); + /* exit((rc < 0) ? rc : -rc); */ + return 0; } } @@ -2307,3 +2335,23 @@ void FCGX_SetExitStatus(int status, FCGX data->reqDataPtr->appStatus = status; } + +int +FCGX_Attach(FCGX_Request * r) +{ + r->detached = FALSE; + return 0; +} + + +int +FCGX_Detach(FCGX_Request * r) +{ + if (r->ipcFd <= 0) + { + return -1; + } + + r->detached = TRUE; + return 0; +} --- fcgi/include/fcgiapp.h.orig 2001-11-22 00:10:11 +0300 +++ fcgi/include/fcgiapp.h 2007-03-24 22:37:32 +0300 @@ -9,7 +9,7 @@ * See the file "LICENSE.TERMS" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * $Id: fcgiapp.h,v 1.12 2001/11/21 21:10:11 robs Exp $ + * $Id: fcgiapp.h,v 1.1.4.2 2003/09/21 22:08:17 sas Exp $ */ #ifndef _FCGIAPP_H @@ -94,9 +94,9 @@ typedef struct FCGX_Request { FCGX_Stream *in; FCGX_Stream *out; FCGX_Stream *err; - char **envp; + char **envp; - /* Don't use anything below here */ + /* Don't use anything below here */ struct Params *paramsPtr; int ipcFd; /* < 0 means no connection */ @@ -104,8 +104,9 @@ typedef struct FCGX_Request { int keepConnection; /* don't close ipcFd at end of request */ int appStatus; int nWriters; /* number of open writers (0..2) */ - int flags; - int listen_sock; + int flags; + int listen_sock; + int detached; } FCGX_Request; @@ -347,7 +348,8 @@ DLLAPI void FCGX_SetExitStatus(int statu *---------------------------------------------------------------------- */ DLLAPI char *FCGX_GetParam(const char *name, FCGX_ParamArray envp); - +DLLAPI void FCGX_PutEnv(FCGX_Request *request, char *nameValue); + /* *====================================================================== * Readers @@ -529,7 +531,7 @@ DLLAPI int FCGX_VFPrintF(FCGX_Stream *st *---------------------------------------------------------------------- */ DLLAPI int FCGX_FFlush(FCGX_Stream *stream); - + /* *====================================================================== * Both Readers and Writers @@ -615,6 +617,15 @@ DLLAPI void FCGX_FreeStream(FCGX_Stream */ DLLAPI void FCGX_ShutdownPending(void); + +/* + * Attach/Detach an accepted request from its listen socket. + * XXX This is not fully implemented at this time (patch welcome). + */ +DLLAPI int FCGX_Attach(FCGX_Request * r); +DLLAPI int FCGX_Detach(FCGX_Request * r); + + #if defined (__cplusplus) || defined (c_plusplus) } /* terminate extern "C" { */ #endif