summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cfsysline.c40
-rw-r--r--cfsysline.h2
-rw-r--r--linkedlist.h1
-rw-r--r--modules.c16
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 <sys/file.h>
#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