diff options
author | Eric Leblond <eric@inl.fr> | 2008-11-30 16:41:55 +0100 |
---|---|---|
committer | Eric Leblond <eric@inl.fr> | 2008-12-09 01:19:25 +0100 |
commit | 7e02ae896e3b4f3109ea26069884695799793370 (patch) | |
tree | bd677177452719d67350a9fa35b1ccddd375421e | |
parent | 8040dcd59097d54f94447b36edebfcf3f14edfdd (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.
-rw-r--r-- | include/ulogd/ulogd.h | 8 | ||||
-rw-r--r-- | src/ulogd.c | 21 |
2 files changed, 28 insertions, 1 deletions
diff --git a/include/ulogd/ulogd.h b/include/ulogd/ulogd.h index 3f6d784..f55d5f1 100644 --- a/include/ulogd/ulogd.h +++ b/include/ulogd/ulogd.h @@ -187,6 +187,14 @@ static inline void *ikey_get_ptr(struct ulogd_key *key) struct ulogd_pluginstance_stack; struct ulogd_pluginstance; + +struct ulogd_plugin_handle { + /* global list of plugins */ + struct llist_head list; + void *handle; +}; + + struct ulogd_plugin { /* global list of plugins */ struct llist_head list; 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; |