summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlaforge <laforge>2005-04-17 16:34:03 +0000
committerlaforge <laforge>2005-04-17 16:34:03 +0000
commit020b7f900c76c108294dfd66e98db53de0c9f2c3 (patch)
tree86e9198586061f36705c3ed6695495d5e9014515
parent75968f47126e94cf8e162a88c76446a0628cd9b5 (diff)
current snapshot (still not compiling)
- add more sophisticated signal delivery to pluginstances - partial LOGEMU port to ulogd2
-rw-r--r--include/ulogd/ulogd.h2
-rw-r--r--output/ulogd_output_LOGEMU.c99
-rw-r--r--ulogd.c40
3 files changed, 92 insertions, 49 deletions
diff --git a/include/ulogd/ulogd.h b/include/ulogd/ulogd.h
index 808f3a9..1382251 100644
--- a/include/ulogd/ulogd.h
+++ b/include/ulogd/ulogd.h
@@ -66,9 +66,11 @@ extern FILE *logfile;
/* ulogd data type */
enum ulogd_dtype {
ULOGD_DTYPE_NULL,
+ ULOGD_DTYPE_SOURCE, /* source of data, no input keys */
ULOGD_DTYPE_RAW, /* raw packet data */
ULOGD_DTYPE_PACKET, /* packet metadata */
ULOGD_DTYPE_FLOW, /* flow metadata */
+ ULOGD_DTYPE_SINK, /* sink of data, no output keys */
};
/* structure describing an input / output parameter of a plugin */
diff --git a/output/ulogd_output_LOGEMU.c b/output/ulogd_output_LOGEMU.c
index 049bcd4..372a026 100644
--- a/output/ulogd_output_LOGEMU.c
+++ b/output/ulogd_output_LOGEMU.c
@@ -1,4 +1,4 @@
-/* ulogd_LOGEMU.c, Version $Revision: 1.15 $
+/* ulogd_LOGEMU.c, Version $Revision$
*
* ulogd output target for syslog logging emulation
*
@@ -30,7 +30,7 @@
#include <string.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>
-#include "printpkt.c"
+#include "../util/printpkt.c"
#ifndef ULOGD_LOGEMU_DEFAULT
#define ULOGD_LOGEMU_DEFAULT "/var/log/ulogd.syslogemu"
@@ -46,16 +46,28 @@
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
-static config_entry_t syslogf_ce = { NULL, "file", CONFIG_TYPE_STRING,
- CONFIG_OPT_NONE, 0,
- { string: ULOGD_LOGEMU_DEFAULT } };
-
-static config_entry_t syslsync_ce = { &syslogf_ce, "sync",
- CONFIG_TYPE_INT, CONFIG_OPT_NONE, 0,
- { value: ULOGD_LOGEMU_SYNC_DEFAULT }
- };
+static struct config_keyset logemu_kset = {
+ .num_ces = 2,
+ .ces = {
+ {
+ .key = "file",
+ .type = CONFIG_TYPE_STRING,
+ .options = CONFIG_OPT_NONE,
+ .u = { .string = ULOGD_LOGEMU_DEFAULT },
+ },
+ {
+ .key = "sync",
+ .type = CONFIG_TYPE_INT,
+ .options = CONFIG_OPT_NONE,
+ .u = { .value = ULOGD_LOGEMU_SYNC_DEFAULT },
+ },
+ },
+};
-static FILE *of = NULL;
+struct logemu_instance = {
+ struct ulogd_pluginstance upi;
+ static FILE *of = NULL;
+};
static int _output_logemu(ulog_iret_t *res)
{
@@ -71,16 +83,18 @@ static int _output_logemu(ulog_iret_t *res)
return 0;
}
-static void signal_handler_logemu(int signal)
+static void signal_handler_logemu(struct ulogd_pluginstance *pi, int signal)
{
+ struct logemu_instance *li = (struct logemu_instance *) pi;
+
switch (signal) {
case SIGHUP:
ulogd_log(ULOGD_NOTICE, "syslogemu: reopening logfile\n");
- fclose(of);
- of = fopen(syslogf_ce.u.string, "a");
- if (!of) {
+ fclose(li->of);
+ li->of = fopen(syslogf_ce.u.string, "a");
+ if (!li->of) {
ulogd_log(ULOGD_FATAL, "can't open syslogemu: %s\n",
- strerror(errno));
+ strerror(errno));
exit(2);
}
break;
@@ -90,35 +104,60 @@ static void signal_handler_logemu(int signal)
}
-static int init_logemu(void) {
+static struct ulogd_pluginstance *init_logemu(struct ulogd_plugin *pl)
+{
+ struct logemu_instance *li = malloc(sizeof(*li));
+
+ if (!li)
+ return NULL;
+
+ memset(li, 0, sizeof(*li));
+ li->upi.plugin = pl;
+ /* FIXME: upi->input = NULL; */
+ li->upi.output = NULL;
+
#ifdef DEBUG_LOGEMU
- of = stdout;
+ li->of = stdout;
#else
- of = fopen(syslogf_ce.u.string, "a");
- if (!of) {
+ li->of = fopen(syslogf_ce.u.string, "a");
+ if (!li->of) {
ulogd_log(ULOGD_FATAL, "can't open syslogemu: %s\n",
- strerror(errno));
+ strerror(errno));
exit(2);
}
#endif
if (printpkt_init()) {
ulogd_log(ULOGD_ERROR, "can't resolve all keyhash id's\n");
+ exit(1);
}
- return 1;
+ return &li->upi;
}
-static void fini_logemu(void) {
- if (of != stdout)
- fclose(of);
+static int fini_logemu(struct ulogd_pluginstance *pi) {
+ struct logemu_instance *li = (struct logemu_instance *) pi;
+
+ if (li->of != stdout)
+ fclose(li->of);
+
+ return 0;
}
-static ulog_output_t logemu_op = {
- .name = "syslogemu",
- .init = &init_logemu,
- .fini = &fini_logemu,
- .output = &_output_logemu,
+static struct ulogd_plugin logemu_plugin = {
+ .name = "LOGEMU",
+ .input = {
+ .keys = &logemu_inp,
+ .num_keys = FIXME,
+ .type = ULOGD_DTYPE_PACKET,
+ },
+ .output = {
+ .type = ULOGD_DTYPE_SINK,
+ },
+ .constructor = &init_logemu,
+ .destructor = &fini_logemu,
+ .interp = &_output_logemu,
.signal = &signal_handler_logemu,
+ .config_kset = &logemu_kset,
};
void _init(void)
diff --git a/ulogd.c b/ulogd.c
index 406e85c..41598a4 100644
--- a/ulogd.c
+++ b/ulogd.c
@@ -684,44 +684,46 @@ static struct config_keyset ulogd_kset = {
#define plugin_ce ulogd_ces[1]
#define loglevel_ce ulogd_ces[2]
#define stack_ce ulogd_ces[3]
-
+
+
+static void deliver_signal_pluginstances(int signal)
+{
+ struct ulogd_pluginstance *stack, *pi;
+
+ list_for_each_entry(stack, &ulogd_pi_stack, stack_list) {
+ list_for_each_entry(pi, stack, list) {
+ if (pi->plugin->signal)
+ (*pi->plugin->signal)(pi, signal);
+ }
+ }
+}
static void sigterm_handler(int signal)
{
- struct ulogd_plugin *p;
ulogd_log(ULOGD_NOTICE, "sigterm received, exiting\n");
- ipulog_destroy_handle(libulog_h);
- free(libulog_buf);
+ deliver_signal_pluginstances(signal);
+
if (logfile != stdout)
fclose(logfile);
- for (p = ulogd_outputs; p; p = p->next) {
- if (p->fini)
- (*p->fini)();
- }
-
exit(0);
}
-static void sighup_handler(int signal)
+static void signal_handler(int signal)
{
- struct ulogd_plugin *p;
+ ulogd_log(ULOGD_NOTICE, "signal received, calling pluginstances\n");
+
+ deliver_signal_pluginstances(signal);
+ /* reopen logfile */
if (logfile != stdout) {
fclose(logfile);
logfile = fopen(logf_ce.u.string, "a");
if (!logfile)
sigterm_handler(signal);
}
-
- ulogd_log(ULOGD_NOTICE, "sighup received, calling plugin handlers\n");
-
- for (p = ulogd_outputs; p; p = p->next) {
- if (p->signal)
- (*p->signal)(SIGHUP);
- }
}
static void print_usage(void)
@@ -874,7 +876,7 @@ int main(int argc, char* argv[])
}
signal(SIGTERM, &sigterm_handler);
- signal(SIGHUP, &sighup_handler);
+ signal(SIGHUP, &signal_handler);
ulogd_log(ULOGD_NOTICE,
"initialization finished, entering main loop\n");