mirror of
https://github.com/gnustep/libs-gsweb.git
synced 2025-02-23 11:41:20 +00:00
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@6293 72102866-910b-0410-8b05-ffd578937521
194 lines
5.7 KiB
C
194 lines
5.7 KiB
C
/* GSWApp.c - GSWeb: Adaptors: GSWApp & GSWAppInstance
|
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
|
|
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
|
Date: March 2000
|
|
|
|
This file is part of the GNUstep Web Library.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with this library; if not, write to the Free
|
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/stat.h>
|
|
#include <errno.h>
|
|
#include "config.h"
|
|
#include "GSWUtil.h"
|
|
#include "GSWDict.h"
|
|
#include "GSWString.h"
|
|
#include "GSWUtil.h"
|
|
#include "GSWApp.h"
|
|
|
|
void GSWApp_InternFreeNotValidInstances(GSWDictElem* p_pElem,void* p_pData);
|
|
void GSWApp_InternClearInstances(GSWDictElem* p_pElem,void* p_pData);
|
|
void GSWAppInstance_InternClear(GSWDictElem* p_pElem,void* p_pData);
|
|
|
|
//====================================================================
|
|
//--------------------------------------------------------------------
|
|
GSWApp* GSWApp_New()
|
|
{
|
|
GSWApp* pApp=(GSWApp*)calloc(1,sizeof(GSWApp));
|
|
memset(pApp,0,sizeof(GSWApp));
|
|
pApp->iUsageCounter++;
|
|
return pApp;
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_Free(GSWApp* p_pApp)
|
|
{
|
|
if (!p_pApp)
|
|
GSWLog(GSW_CRITICAL,NULL,"No App to free");
|
|
else
|
|
{
|
|
p_pApp->iUsageCounter--;
|
|
if (p_pApp->iUsageCounter<0)
|
|
GSWLog(GSW_CRITICAL,NULL,"App seems to have been freed too much times");
|
|
if (p_pApp->iUsageCounter<=0)
|
|
{
|
|
if (p_pApp->pszName)
|
|
free(p_pApp->pszName);
|
|
if (p_pApp->pszGSWExtensionsFrameworkWebServerResources)
|
|
free(p_pApp->pszGSWExtensionsFrameworkWebServerResources);
|
|
GSWDict_FreeElements(&p_pApp->stInstancesDict);
|
|
GSWDict_FreeElements(&p_pApp->stHeadersDict);
|
|
free(p_pApp);
|
|
};
|
|
};
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_AddInstance(GSWApp* p_pApp,CONST char* p_pszInstanceNum,GSWAppInstance* p_pInstance)
|
|
{
|
|
if (!p_pApp)
|
|
{
|
|
GSWLog(GSW_CRITICAL,NULL,"No App to add instance");
|
|
}
|
|
else if (!p_pInstance)
|
|
{
|
|
GSWLog(GSW_CRITICAL,NULL,"No instance to add");
|
|
}
|
|
else
|
|
{
|
|
if (p_pInstance->pApp!=p_pApp)
|
|
{
|
|
GSWLog(GSW_CRITICAL,NULL,"Trying to add instance to another app");
|
|
if (p_pInstance->pApp)
|
|
p_pInstance->pApp->iUsageCounter--;
|
|
p_pInstance->pApp=p_pApp;
|
|
p_pInstance->pApp->iUsageCounter++;
|
|
};
|
|
GSWDict_Add(&p_pApp->stInstancesDict,p_pszInstanceNum,p_pInstance,FALSE);//NotOwner
|
|
};
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_InternFreeNotValidInstances(GSWDictElem* p_pElem,void* p_pData)
|
|
{
|
|
GSWDict* pInstancesDict=(GSWDict*)p_pData;
|
|
GSWAppInstance* pInstance=(GSWAppInstance*)p_pElem->pValue;
|
|
if (!pInstance->fValid)
|
|
{
|
|
GSWDict_RemoveKey(pInstancesDict,p_pElem->pszKey);
|
|
if (GSWAppInstance_FreeIFND(pInstance))
|
|
pInstance=NULL;
|
|
};
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_FreeNotValidInstances(GSWApp* p_pApp)
|
|
{
|
|
GSWDict_PerformForAllElem(&p_pApp->stInstancesDict,
|
|
GSWApp_InternFreeNotValidInstances,
|
|
&p_pApp->stInstancesDict);
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_InternClearInstances(GSWDictElem* p_pElem,void* p_pData)
|
|
{
|
|
GSWApp* pApp=(GSWApp*)(p_pElem->pValue);
|
|
GSWDict_PerformForAllElem(&pApp->stInstancesDict,
|
|
GSWAppInstance_InternClear,
|
|
NULL);
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWApp_AppsClearInstances(GSWDict* p_pAppsDict)
|
|
{
|
|
GSWDict_PerformForAllElem(p_pAppsDict,
|
|
GSWApp_InternClearInstances,
|
|
NULL);
|
|
};
|
|
|
|
//====================================================================
|
|
//--------------------------------------------------------------------
|
|
GSWAppInstance* GSWAppInstance_New(GSWApp* p_pApp)
|
|
{
|
|
GSWAppInstance* pInstance=(GSWAppInstance*)calloc(1,sizeof(GSWAppInstance));
|
|
memset(pInstance,0,sizeof(GSWAppInstance));
|
|
if (!p_pApp)
|
|
GSWLog(GSW_CRITICAL,NULL,"Intance %p created without App",
|
|
pInstance);
|
|
pInstance->pApp=p_pApp;
|
|
return pInstance;
|
|
};
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWAppInstance_Free(GSWAppInstance* p_pInstance)
|
|
{
|
|
if (p_pInstance)
|
|
{
|
|
if (p_pInstance->pszHostName)
|
|
free(p_pInstance->pszHostName);
|
|
if (p_pInstance->pApp)
|
|
{
|
|
char szBuffer[128]="";
|
|
sprintf(szBuffer,"%d",p_pInstance->iInstance);
|
|
if (GSWDict_ValueForKey(&p_pInstance->pApp->stInstancesDict,szBuffer)==p_pInstance)
|
|
GSWDict_RemoveKey(&p_pInstance->pApp->stInstancesDict,szBuffer);
|
|
p_pInstance->pApp->iUsageCounter--;
|
|
};
|
|
free(p_pInstance);
|
|
};
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
BOOL GSWAppInstance_FreeIFND(GSWAppInstance* p_pInstance)
|
|
{
|
|
if (p_pInstance->uOpenedRequestsNb==0)
|
|
{
|
|
GSWAppInstance_Free(p_pInstance);
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
};
|
|
|
|
//--------------------------------------------------------------------
|
|
void GSWAppInstance_InternClear(GSWDictElem* p_pElem,void* p_pData)
|
|
{
|
|
GSWAppInstance* pInstance=(GSWAppInstance*)(p_pElem->pValue);
|
|
pInstance->fValid=FALSE;
|
|
};
|
|
|
|
|