Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37898110
en ru br
Репозитории ALT
S:2.4.0-alt9
5.1: 2.4.0-alt5
4.1: 2.4.0-alt4
4.0: 2.4.0-alt4
3.0: 2.4.0-alt1
+backports:2.4.0-alt0.M30.2
www.altlinux.org/Changes

Группа :: Система/Серверы
Пакет: libfcgi

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: libfcgi-php-changes.patch
Скачать


--- 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
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin