]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
current snapshot (still not compiling)
authorlaforge <laforge>
Sun, 17 Apr 2005 16:34:03 +0000 (16:34 +0000)
committerlaforge <laforge>
Sun, 17 Apr 2005 16:34:03 +0000 (16:34 +0000)
- add more sophisticated signal delivery to pluginstances
- partial LOGEMU port to ulogd2

include/ulogd/ulogd.h
output/ulogd_output_LOGEMU.c
ulogd.c

index 808f3a9e27ca963b481fc893fe40a8b5607f4a66..1382251ebb5722aa5d559b181770efe230a048c8 100644 (file)
@@ -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 */
index 049bcd4f2ec8c2e180c71b2d959db681b62728eb..372a02620c2aa5708ffb97c28b8ab74ebabe092a 100644 (file)
@@ -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"
         ((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 406e85c2e655cf2fbf47b7aa6f273b82c37fca16..41598a47a152c8496ee3d54c683d5ffb20533e2d 100644 (file)
--- 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");