diff options
-rw-r--r-- | modules.c | 102 | ||||
-rw-r--r-- | modules.h | 83 |
2 files changed, 185 insertions, 0 deletions
diff --git a/modules.c b/modules.c new file mode 100644 index 00000000..eed6f4b8 --- /dev/null +++ b/modules.c @@ -0,0 +1,102 @@ +/* modules.c + * This is the implementation of syslogd modules object. + * This object handles plug-ins and buil-in modules of all kind. + * + * File begun on 2007-07-22 by RGerhards + * + * Copyright 2007 Rainer Gerhards and Adiscon GmbH. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * A copy of the GPL can be found in the file "COPYING" in this distribution. + */ +#include "config.h" +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <assert.h> +#include <errno.h> + +#include <unistd.h> +#include <sys/file.h> + +#include "rsyslog.h" +#include "modules.h" + +static modInfo_t *pLoadedModules = NULL; /* list of currently-loaded modules */ +static modInfo_t *pLoadedModulesLast = NULL; /* tail-pointer */ + + +/* Construct a new module object + */ +static rsRetVal moduleConstruct(modInfo_t **pThis) +{ + modInfo_t *pNew; + + if((pNew = calloc(1, sizeof(modInfo_t))) == NULL) + return RS_RET_OUT_OF_MEMORY; + + /* OK, we got the element, now initialize members that should + * not be zero-filled. + */ + + *pThis = pNew; + return RS_RET_OK; +} + + +/* Add a module to the loaded module linked list + */ +static inline void addModToList(modInfo_t *pThis) +{ + assert(pThis != NULL); + + if(pLoadedModules == NULL) { + pLoadedModules = pLoadedModulesLast = pThis; + } else { + /* there already exist entries */ + pLoadedModulesLast->pNext = pThis; + pLoadedModulesLast = pThis; + } +} + + +/* Add an already-loaded module to the module linked list. This function does + * anything that is needed to fully initialize the module. + */ +rsRetVal doModInit(rsRetVal *doInit(), uchar *name) +{ + modInfo_t *pNew; + rsRetVal iRet; + + if((iRet = moduleConstruct(&pNew)) != RS_RET_OK) + return iRet; + + if((iRet = *doInit()) != RS_RET_OK) + return iRet; + + /* OK, we know we can successfully work with the module. So we now fill the + * rest of the data elements. + */ + + pNew->pszModName = (uchar*) strdup((char*)name); /* we do not care if strdup() fails, we can accept that */ + + return RS_RET_OK; +} +/* + * vi:set ai: + */ diff --git a/modules.h b/modules.h new file mode 100644 index 00000000..b626d86e --- /dev/null +++ b/modules.h @@ -0,0 +1,83 @@ +/* modules.h + * Definition for build-in and plug-ins module handler. + * + * The following definitions are to be used for modularization. Currently, + * the code is NOT complete. I am just adding pieces to it as I + * go along in designing the interface. + * rgerhards, 2007-07-19 + * + * + * File begun on 2007-07-22 by RGerhards + * + * Copyright 2007 Rainer Gerhards and Adiscon GmbH. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * A copy of the GPL can be found in the file "COPYING" in this distribution. + */ +#ifndef MODULES_H_INCLUDED +#define MODULES_H_INCLUDED 1 + +typedef enum eModType_ { + eMOD_IN, /* input module */ + eMOD_OUT, /* output module */ + eMOD_FILTER /* filter module (not know yet if we will once have such at all...) */ +} eModType_t; + +/* how is this module linked? */ +typedef enum eModLinkType_ { + eMOD_LINK_STATIC, + eMOD_LINK_DYNAMIC_UNLOADED, /* dynalink module, currently not loaded */ + eMOD_LINK_DYNAMIC_LOADED /* dynalink module, currently loaded */ +} eModLinkType_t; + +typedef struct moduleInfo { + struct moduleInfo *pNext; /* support for creating a linked module list */ + int iModVers; /* Interface version of module */ + eModType_t eModType; /* type of this module */ + eModLinkType_t eModLinkType; + uchar* pszModName; /* printable module name, e.g. for dprintf */ + /* functions supported by all types of modules */ + rsRetVal (*modInit)(); /* initialize the module */ + /* be sure to support version handshake! */ + 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. + */ + rsRetVal (*parseConfigLine)(uchar **pConfLine); + /* below: create an instance of this module. Most importantly the module + * can allocate instance memory in this call. + */ + rsRetVal (*createInstance)(); + union { + struct {/* data for input modules */ + /* input modules come after output modules are finished, I am + * currently not really thinking about them. rgerhards, 2007-07-19 + */ + }; + struct {/* data for output modules */ + /* below: perform the configured action + */ + rsRetVal (*doAction)(); + }; + } mod; +} modInfo_t; + +/* prototypes */ + +#endif /* #ifndef MODULES_H_INCLUDED */ +/* + * vi:set ai: + */ |