From 7449e8356b19900acaa33e387bd4ea65ba85e204 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 31 Jul 2007 13:30:55 +0000 Subject: - added interface to register a cfsysline command handler (basic functionality) --- cfsysline.c | 40 +++++++++++++++++++++++++++++++++++++++- cfsysline.h | 2 ++ linkedlist.h | 1 + modules.c | 16 ++++++++++++---- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/cfsysline.c b/cfsysline.c index daebdd05..c28e8865 100644 --- a/cfsysline.c +++ b/cfsysline.c @@ -412,10 +412,20 @@ rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine) * now come the handlers for cslCmd_t * ---------------------------------------------------------------------- */ +/* destructor for a cslCmd list key (a string as of now) + */ +static rsRetVal cslcKeyDestruct(void *pData) +{ + free(pData); /* we do not need to cast as all we do is free it anyway... */ + return RS_RET_OK; +} + /* destructor for cslCmd */ -rsRetVal cslcDestruct(cslCmd_t *pThis) +static rsRetVal cslcDestruct(void *pData) { + cslCmd_t *pThis = (cslCmd_t*) pData; + assert(pThis != NULL); llDestroy(pThis->pllCmdHdlrs); @@ -443,6 +453,34 @@ finalize_it: *ppThis = pThis; return iRet; } + + +/* function that initializes this module here. This is primarily a hook + * for syslogd. + */ +rsRetVal cfsyslineInit(void) +{ + DEFiRet; + + CHKiRet(llInit(&llCmdList, cslcDestruct, cslcKeyDestruct)); + +finalize_it: + return iRet; +} + + +/* function that registers cfsysline handlers. + */ +rsRetVal regCfSysLineHdlr(uchar *pCmdName, ecslCmdHdrlType eType, rsRetVal (*pHdlr)(), void *pData) +{ + cslCmd_t *pThis; + DEFiRet; + + iRet = llFind(&llCmdList, (void *) pCmdName, (void**) &pThis); +dprintf("regCfSysLineHdlr returned %d\n", iRet); + + return iRet; +} /* * vi:set ai: */ diff --git a/cfsysline.h b/cfsysline.h index a1a51d91..953b6bb3 100644 --- a/cfsysline.h +++ b/cfsysline.h @@ -64,6 +64,8 @@ rsRetVal cslchConstruct(cslCmdHdlr_t **ppThis); rsRetVal cslchSetEntry(cslCmdHdlr_t *pThis, ecslCmdHdrlType eType, rsRetVal (*pHdlr)(), void *pData); rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine); rsRetVal cslcConstruct(cslCmd_t **ppThis); +rsRetVal regCfSysLineHdlr(uchar *pCmdName, ecslCmdHdrlType eType, rsRetVal (*pHdlr)(), void *pData); +rsRetVal cfsyslineInit(void); /* the next ones go away later */ rsRetVal doBinaryOptionLine(uchar **pp, rsRetVal (*pSetHdlr)(void*, int), void *pVal); diff --git a/linkedlist.h b/linkedlist.h index 0f061b59..cdfc2872 100644 --- a/linkedlist.h +++ b/linkedlist.h @@ -56,5 +56,6 @@ rsRetVal llInit(linkedList_t *pThis, rsRetVal (*pEltDestructor)(void*), rsRetVal rsRetVal llDestroy(linkedList_t *pThis); rsRetVal llGetNextElt(linkedList_t *pThis, linkedListCookie_t *ppElt, void **ppUsr); rsRetVal llAppend(linkedList_t *pThis, void *pKey, void *pData); +rsRetVal llFind(linkedList_t *pThis, void *pKey, void **ppData); #endif /* #ifndef LINKEDLIST_H_INCLUDED */ diff --git a/modules.c b/modules.c index 7bbdf47a..32bec07c 100644 --- a/modules.c +++ b/modules.c @@ -36,10 +36,12 @@ #include #include "syslogd.h" +#include "cfsysline.h" #include "modules.h" static modInfo_t *pLoadedModules = NULL; /* list of currently-loaded modules */ static modInfo_t *pLoadedModulesLast = NULL; /* tail-pointer */ +static int bCfsyslineInitialized = 0; /* Construct a new module object @@ -84,8 +86,7 @@ rsRetVal queryHostEtryPt(uchar *name, rsRetVal (**pEtryPoint)()) return RS_RET_PARAM_ERROR; if(!strcmp((char*) name, "regCfSysLineHdlr")) { - //*pEtryPoint = regCfSysLineHdlr; - *pEtryPoint = queryHostEtryPt; + *pEtryPoint = regCfSysLineHdlr; } if(iRet == RS_RET_OK) @@ -166,11 +167,17 @@ modInfo_t *omodGetNxt(modInfo_t *pThis) */ rsRetVal doModInit(rsRetVal (*modInit)(int, int*, rsRetVal(**)(), rsRetVal(*)()), uchar *name) { + DEFiRet; modInfo_t *pNew; - rsRetVal iRet; assert(modInit != NULL); + if(bCfsyslineInitialized == 0) { + /* we need to initialize the cfsysline subsystem first */ + CHKiRet(cfsyslineInit()); + bCfsyslineInitialized = 1; + } + if((iRet = moduleConstruct(&pNew)) != RS_RET_OK) return iRet; @@ -228,7 +235,8 @@ rsRetVal doModInit(rsRetVal (*modInit)(int, int*, rsRetVal(**)(), rsRetVal(*)()) /* we initialized the structure, now let's add it to the linked list of modules */ addModToList(pNew); - return RS_RET_OK; +finalize_it: + return iRet; } /* Print loaded modules. This is more or less a -- cgit