From 020b7f900c76c108294dfd66e98db53de0c9f2c3 Mon Sep 17 00:00:00 2001 From: laforge Date: Sun, 17 Apr 2005 16:34:03 +0000 Subject: current snapshot (still not compiling) - add more sophisticated signal delivery to pluginstances - partial LOGEMU port to ulogd2 --- include/ulogd/ulogd.h | 2 + output/ulogd_output_LOGEMU.c | 99 ++++++++++++++++++++++++++++++-------------- ulogd.c | 40 +++++++++--------- 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 #include #include -#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"); -- cgit v1.2.3