summaryrefslogtreecommitdiffstats
path: root/src/ulogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ulogd.c')
-rw-r--r--src/ulogd.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/ulogd.c b/src/ulogd.c
index 684444f..b8bc57c 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -404,7 +404,7 @@ void ulogd_register_plugin(struct ulogd_plugin *me)
me->name);
exit(EXIT_FAILURE);
}
- ulogd_log(ULOGD_DEBUG, "registering plugin `%s'\n", me->name);
+ ulogd_log(ULOGD_NOTICE, "registering plugin `%s'\n", me->name);
llist_add(&me->list, &ulogd_plugins);
} else {
get_plugin_infos(me);
@@ -728,6 +728,41 @@ static int load_plugin(const char *file)
return 0;
}
+static int load_all_plugins(void)
+{
+ DIR *d;
+ struct dirent *dent;
+ char path[PATH_MAX];
+
+ d = opendir(ULOGD2_LIBDIR);
+ if (d == NULL) {
+ ulogd_log(ULOGD_ERROR, "load_all_plugins: opendir(%s): %s\n",
+ ULOGD2_LIBDIR, strerror(errno));
+ return -1;
+ }
+
+ ulogd_log(ULOGD_NOTICE, "loading all plugins at %s\n", ULOGD2_LIBDIR);
+
+ while ((dent = readdir(d)) != NULL) {
+ if (strcmp(dent->d_name, ".") == 0 ||
+ strcmp(dent->d_name, "..") == 0)
+ continue;
+
+ int len = strlen(dent->d_name);
+ if (len < 3)
+ continue;
+
+ if (strcmp(&dent->d_name[len - 3], ".so") != 0)
+ continue;
+
+ snprintf(path, sizeof(path), "%s/%s", ULOGD2_LIBDIR,
+ dent->d_name);
+ if (load_plugin(path) != 0)
+ return -1;
+ }
+ return 0;
+}
+
/* find an output key in a given stack, starting at 'start' */
static struct ulogd_key *
find_okey_in_stack(char *name,
@@ -925,6 +960,9 @@ static int create_stack(const char *option)
char *tok;
int ret;
+ if (llist_empty(&ulogd_plugins_handle))
+ load_all_plugins();
+
if (!buf) {
ulogd_log(ULOGD_ERROR, "");
ret = -ENOMEM;