*
* Copyright (c) 1996 Open Market, Inc.
*
- * See the file "LICENSE.TERMS" for information on usage and redistribution
+ * See the file "LICENSE" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*/
#ifndef lint
-static const char rcsid[] = "$Id: fcgiapp.c,v 1.26 2001/06/22 14:21:03 robs Exp $";
+static const char rcsid[] = "$Id: fcgiapp.c,v 1.35 2003/06/22 00:16:43 robs Exp $";
#endif /* not lint */
#include <assert.h>
#endif
#ifdef _WIN32
-#undef DLLAPI
#define DLLAPI __declspec(dllexport)
#endif
static char *webServerAddressList = NULL;
static FCGX_Request the_request;
+void FCGX_ShutdownPending(void)
+{
+ OS_ShutdownPending();
+}
+
static void *Malloc(size_t size)
{
void *result = malloc(size);
*/
int FCGX_GetChar(FCGX_Stream *stream)
{
- if(stream->rdNext != stream->stop)
- return *stream->rdNext++;
- if(stream->isClosed || !stream->isReader)
+ if (stream->isClosed || ! stream->isReader)
return EOF;
+
+ if (stream->rdNext != stream->stop)
+ return *stream->rdNext++;
+
stream->fillBuffProc(stream);
+ if (stream->isClosed)
+ return EOF;
+
stream->stopUnget = stream->rdNext;
- if(stream->rdNext != stream->stop)
+ if (stream->rdNext != stream->stop)
return *stream->rdNext++;
+
ASSERT(stream->isClosed); /* bug in fillBufProc if not */
return EOF;
}
{
int m, bytesMoved;
- if(n <= 0) {
+ if (stream->isClosed || ! stream->isReader || n <= 0) {
return 0;
}
/*
if(bytesMoved == n)
return bytesMoved;
str += m;
- }
+ }
if(stream->isClosed || !stream->isReader)
return bytesMoved;
stream->fillBuffProc(stream);
+ if (stream->isClosed)
+ return bytesMoved;
+
stream->stopUnget = stream->rdNext;
}
}
*/
if(stream->FCGI_errno == 0) {
stream->FCGI_errno = FCGI_errno;
- stream->isClosed = TRUE;
}
+
+ stream->isClosed = TRUE;
}
/*
static int ProcessManagementRecord(int type, FCGX_Stream *stream)
{
FCGX_Stream_Data *data = (FCGX_Stream_Data *)stream->data;
- ParamsPtr paramsPtr = NewParams(3);
+ ParamsPtr paramsPtr;
char **pPtr;
char response[64]; /* 64 = 8 + 3*(1+1+14+1)* + padding */
char *responseP = &response[FCGI_HEADER_LEN];
char *name, value = '\0';
int len, paddedLen;
if(type == FCGI_GET_VALUES) {
+ paramsPtr = NewParams(3);
ReadParams(paramsPtr, stream);
if((FCGX_GetError(stream) != 0) || (data->contentLen != 0)) {
FreeParams(¶msPtr);
if (reqDataPtr->in) {
close |= FCGX_FClose(reqDataPtr->err);
close |= FCGX_FClose(reqDataPtr->out);
+ close |= FCGX_GetError(reqDataPtr->in);
+
+ /* discard any remaining data in input stream on persistent connections */
+ if (!close && !reqDataPtr->in->isClosed && reqDataPtr->keepConnection) {
+ FCGX_Stream *stream = reqDataPtr->in;
- close |= FCGX_GetError(reqDataPtr->in);
+ do {
+ stream->rdNext = stream->stop;
+ stream->fillBuffProc(stream);
+ } while (!stream->isClosed);
+
+ close |= FCGX_GetError(stream);
+ }
}
FCGX_Free(reqDataPtr, close);
FreeParams(&request->paramsPtr);
if (close) {
- OS_IpcClose(request->ipcFd);
+ OS_IpcClose(request->ipcFd, ! request->detached);
request->ipcFd = -1;
+ request->detached = 0;
}
}
return 0;
}
- /* If our compiler doesn't play by the ISO rules for struct layout, halt. */
- ASSERT(sizeof(FCGI_Header) == FCGI_HEADER_LEN);
-
FCGX_InitRequest(&the_request, FCGI_LISTENSOCK_FILENO, 0);
if (OS_LibInit(NULL) == -1) {
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;
+}