summaryrefslogtreecommitdiff
path: root/syslogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'syslogd.c')
-rw-r--r--syslogd.c79
1 files changed, 57 insertions, 22 deletions
diff --git a/syslogd.c b/syslogd.c
index 78902d3..f7eeb6a 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -150,6 +150,7 @@
#include <string.h>
#include <stdarg.h>
#include <time.h>
+#include <dlfcn.h>
#include <sys/syslog.h>
#include <sys/param.h>
@@ -299,6 +300,10 @@ syslogCODE rs_facilitynames[] =
#define _PATH_LOGCONF "/etc/rsyslog.conf"
#endif
+#ifndef _PATH_MODDIR
+#define _PATH_MODDIR "/lib/rsyslog/"
+#endif
+
#if defined(SYSLOGD_PIDNAME)
#undef _PATH_LOGPID
#if defined(FSSTND)
@@ -358,9 +363,9 @@ syslogCODE rs_facilitynames[] =
static uchar *ConfFile = (uchar*) _PATH_LOGCONF; /* read-only after startup */
static char *PidFile = _PATH_LOGPID; /* read-only after startup */
+static char *ModDir = _PATH_MODDIR; /* read-only after startup */
char ctty[] = _PATH_CONSOLE; /* this is read-only */
-int bModMySQLLoaded = 0; /* was a $ModLoad MySQL done? */
static pid_t myPid; /* our pid for use in self-generated messages, e.g. on startup */
/* mypid is read-only after the initial fork() */
static int debugging_on = 0; /* read-only, except on sig USR1 */
@@ -3547,7 +3552,7 @@ static void die(int sig)
/* de-init some modules */
modExitIminternal();
- /*TODO: the module config command handlers must also be freed! */
+ unregCfSysLineHdlrs();
/* TODO: this would also be the right place to de-init the builtin output modules. We
* do not currently do that, because the module interface does not allow for
@@ -3755,28 +3760,56 @@ finalize_it:
* As of now, it is a dummy, that will later evolve into the
* loader for plug-ins.
* rgerhards, 2007-07-21
+ * varmojfekoj added support for dynamically loadable modules on 2007-08-13
*/
static rsRetVal doModLoad(uchar **pp, __attribute__((unused)) void* pVal)
{
DEFiRet;
uchar szName[512];
+ uchar szPath[512];
+ uchar errMsg[1024];
+ uchar *pModName;
+ void *pModHdlr, *pModInit;
assert(pp != NULL);
assert(*pp != NULL);
if(getSubString(pp, (char*) szName, sizeof(szName) / sizeof(uchar), ' ') != 0) {
- logerror("could not extract group name");
+ logerror("could not extract module name");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
+ /* this below is a quick and dirty hack to provide compatibility with the
+ * $ModLoad MySQL forward compatibility statement. TODO: clean this up
+ * For the time being, it is clean enough, it just needs to be done
+ * differently when we have a full design for loadable plug-ins. For the
+ * time being, we just mangle the names a bit.
+ * rgerhards, 2007-08-14
+ */
+ if(!strcmp((char*) szName, "MySQL"))
+ pModName = (uchar*) "ommysql.so";
+ else
+ pModName = szName;
+
dbgprintf("Requested to load module '%s'\n", szName);
- if(!strcmp((char*)szName, "MySQL")) {
- bModMySQLLoaded = 1;
- } else {
- logerrorSz("$ModLoad with invalid module name '%s' - currently 'MySQL' only supported",
- (char*) szName);
- }
+ strncpy((char *) szPath, ModDir, sizeof(szPath));
+ strncat((char *) szPath, (char *) pModName, sizeof(szPath) - strlen(szPath) - 1);
+ if(!(pModHdlr = dlopen((char *) szPath, RTLD_NOW))) {
+ snprintf((char *) errMsg, sizeof(errMsg), "could not load module '%s', dlopen: %s\n", szPath, dlerror());
+ errMsg[sizeof(errMsg)/sizeof(uchar) - 1] = '\0';
+ logerror((char *) errMsg);
+ ABORT_FINALIZE(RS_RET_ERR);
+ }
+ if(!(pModInit = dlsym(pModHdlr, "modInit"))) {
+ snprintf((char *) errMsg, sizeof(errMsg), "could not load module '%s', dlsym: %s\n", szPath, dlerror());
+ errMsg[sizeof(errMsg)/sizeof(uchar) - 1] = '\0';
+ logerror((char *) errMsg);
+ dlclose(pModHdlr);
+ ABORT_FINALIZE(RS_RET_ERR);
+ }
+ if((iRet = doModInit(pModInit, (uchar*) pModName, pModHdlr)) != RS_RET_OK)
+ return iRet;
skipWhiteSpace(pp); /* skip over any whitespace */
@@ -4226,6 +4259,10 @@ static void init(void)
/* Close all open log files and free log descriptor array. */
freeSelectors();
+ /* Unload all non-static modules */
+ dbgprintf("Unloading non-static modules.\n");
+ modUnloadAndDestructDynamic();
+
dbgprintf("Clearing templates.\n");
tplDeleteNew();
@@ -5613,11 +5650,11 @@ static void mainloop(void)
#endif
#endif
- errno = 0;
- FD_ZERO(&readfds);
- maxfds = 0;
-
while(!bFinished){
+ errno = 0;
+ maxfds = 0;
+ FD_ZERO (&readfds);
+
/* first check if we have any internal messages queued and spit them out */
processImInternal();
@@ -5805,19 +5842,15 @@ static rsRetVal loadBuildInModules(void)
{
DEFiRet;
- if((iRet = doModInit(modInitFile, (uchar*) "builtin-file")) != RS_RET_OK)
+ if((iRet = doModInit(modInitFile, (uchar*) "builtin-file", NULL)) != RS_RET_OK)
return iRet;
#ifdef SYSLOG_INET
- if((iRet = doModInit(modInitFwd, (uchar*) "builtin-fwd")) != RS_RET_OK)
+ if((iRet = doModInit(modInitFwd, (uchar*) "builtin-fwd", NULL)) != RS_RET_OK)
return iRet;
#endif
- if((iRet = doModInit(modInitShell, (uchar*) "builtin-shell")) != RS_RET_OK)
- return iRet;
-# ifdef WITH_DB
- if((iRet = doModInit(modInitMySQL, (uchar*) "builtin-mysql")) != RS_RET_OK)
+ if((iRet = doModInit(modInitShell, (uchar*) "builtin-shell", NULL)) != RS_RET_OK)
return iRet;
-# endif
- if((iRet = doModInit(modInitDiscard, (uchar*) "builtin-discard")) != RS_RET_OK)
+ if((iRet = doModInit(modInitDiscard, (uchar*) "builtin-discard", NULL)) != RS_RET_OK)
return iRet;
/* dirty, but this must be for the time being: the usrmsg module must always be
@@ -5826,8 +5859,10 @@ static rsRetVal loadBuildInModules(void)
* working with the config file. We may change that implementation so that a user name
* must start with an alnum, that would definitely help (but would it break backwards
* compatibility?). * rgerhards, 2007-07-23
+ * User names now must begin with:
+ * [a-zA-Z0-9_.]
*/
- if((iRet = doModInit(modInitUsrMsg, (uchar*) "builtin-usrmsg")) != RS_RET_OK)
+ if((iRet = doModInit(modInitUsrMsg, (uchar*) "builtin-usrmsg", NULL)) != RS_RET_OK)
return iRet;
/* ok, initialization of the command handler probably does not 100% belong right in