summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Leblond <eric@inl.fr>2008-11-30 16:41:55 +0100
committerEric Leblond <eric@inl.fr>2008-12-09 01:19:25 +0100
commit7e02ae896e3b4f3109ea26069884695799793370 (patch)
treebd677177452719d67350a9fa35b1ccddd375421e /src
parent8040dcd59097d54f94447b36edebfcf3f14edfdd (diff)
Unload plugins when quitting.
This patch adds unloading of plugins (call dlclose()) in ulogd2. This make valgrind happy and will be useful for daemon live reconfiguration.
Diffstat (limited to 'src')
-rw-r--r--src/ulogd.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/ulogd.c b/src/ulogd.c
index 2f80913..ae57a38 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -83,6 +83,8 @@ static int info_mode = 0;
/* linked list for all registered plugins */
static LLIST_HEAD(ulogd_plugins);
+/* linked list for all plugins handle */
+static LLIST_HEAD(ulogd_plugins_handle);
static LLIST_HEAD(ulogd_pi_stacks);
@@ -580,11 +582,17 @@ pluginstance_alloc_init(struct ulogd_plugin *pl, char *pi_id,
/* plugin loader to dlopen() a plugins */
static int load_plugin(const char *file)
{
- if (!dlopen(file, RTLD_NOW)) {
+ void * handle;
+ struct ulogd_plugin_handle *ph;
+ if ((handle = dlopen(file, RTLD_NOW)) == NULL) {
ulogd_log(ULOGD_ERROR, "load_plugin: '%s': %s\n", file,
dlerror());
return -1;
}
+
+ ph = (struct ulogd_plugin_handle *) calloc(1, sizeof(*ph));
+ ph->handle = handle;
+ llist_add(&ph->list, &ulogd_plugins_handle);
return 0;
}
@@ -977,6 +985,15 @@ static void stop_pluginstances()
}
}
+static void unload_plugins()
+{
+ struct ulogd_plugin_handle *ph, *nph;
+ llist_for_each_entry_safe(ph, nph, &ulogd_plugins_handle, list) {
+ dlclose(ph->handle);
+ free(ph);
+ }
+}
+
static void sigterm_handler(int signal)
{
@@ -986,6 +1003,8 @@ static void sigterm_handler(int signal)
stop_pluginstances();
+ unload_plugins();
+
if (logfile != NULL && logfile != stdout) {
fclose(logfile);
logfile = NULL;