From a3192ac18ed9df7d95d0c8d5795994e867c85eca Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Wed, 25 Jul 2007 10:36:13 +0000 Subject: changed calling interface for freeInstance() - need to work with dual buffers in order to change output modules one by one --- module-template.h | 16 +++++++++++----- modules.h | 2 +- syslogd.c | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/module-template.h b/module-template.h index 6ce1a08f..843440b5 100644 --- a/module-template.h +++ b/module-template.h @@ -45,8 +45,10 @@ static rsRetVal createInstance(instanceData **ppData)\ instanceData *pData; /* use this to point to data elements */ #define CODESTARTcreateInstance \ - if((pData = calloc(1, sizeof(instanceData))) == NULL)\ - return RS_RET_OUT_OF_MEMORY; + if((pData = calloc(1, sizeof(instanceData))) == NULL) {\ + *ppData = NULL;\ + return RS_RET_OUT_OF_MEMORY;\ + } #define ENDcreateInstance \ *ppData = pData;\ @@ -56,14 +58,18 @@ static rsRetVal createInstance(instanceData **ppData)\ /* freeInstance() */ #define BEGINfreeInstance \ -static rsRetVal freeInstance(selector_t *f)\ +static rsRetVal freeInstance(selector_t *f, void* pModData)\ {\ - rsRetVal iRet = RS_RET_OK; + rsRetVal iRet = RS_RET_OK;\ + instanceData *pData; #define CODESTARTfreeInstance \ - assert(f != NULL); + assert(f != NULL);\ + pData = (instanceData*) pModData; #define ENDfreeInstance \ + if(pData != NULL)\ + free(pData); /* we need to free this in any case */\ return iRet;\ } diff --git a/modules.h b/modules.h index 871fbc1b..46179d73 100644 --- a/modules.h +++ b/modules.h @@ -54,7 +54,7 @@ typedef struct moduleInfo { /* be sure to support version handshake! */ rsRetVal (*modQueryEtryPt)(uchar *name, rsRetVal (**EtryPoint)()); /* query entry point addresses */ rsRetVal (*isCompatibleWithFeature)(syslogFeature); - rsRetVal (*freeInstance)(struct filed*);/* called before termination or module unload */ + rsRetVal (*freeInstance)(struct filed*, void*);/* called before termination or module unload */ rsRetVal (*modExit)(); /* called before termination or module unload */ /* below: parse a configuration line - return if processed * or not. If not, must be parsed to next module. diff --git a/syslogd.c b/syslogd.c index 53d6bd43..d70d34cd 100644 --- a/syslogd.c +++ b/syslogd.c @@ -4121,7 +4121,7 @@ static void freeSelectors(void) free(f->f_psziov); /* free the action instances */ - f->pMod->freeInstance(f); + f->pMod->freeInstance(f, f->pModData); # ifdef USE_PTHREADS /* delete any mutex objects, if present */ if( ( (f->f_type == F_FORW_SUSP) -- cgit