From edacb6372310667af624ba8c9273aca9e02945f7 Mon Sep 17 00:00:00 2001 From: "/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org" Date: Thu, 15 Dec 2005 12:37:58 +0000 Subject: don't "#include" a .c file but rather compile db.c on it's own --- include/ulogd/db.h | 61 ++++++++++++++++++ output/mysql/Makefile.am | 2 +- output/mysql/ulogd_output_MYSQL.c | 13 ++-- output/pgsql/Makefile.am | 2 +- output/pgsql/ulogd_output_PGSQL.c | 130 +++++--------------------------------- util/db.c | 68 ++++---------------- 6 files changed, 98 insertions(+), 178 deletions(-) create mode 100644 include/ulogd/db.h diff --git a/include/ulogd/db.h b/include/ulogd/db.h new file mode 100644 index 0000000..b4b4325 --- /dev/null +++ b/include/ulogd/db.h @@ -0,0 +1,61 @@ +#ifndef _ULOGD_DB_H +#define _ULOGD_DB_H + +#include + +struct db_driver { + int (*get_columns)(struct ulogd_pluginstance *upi); + int (*open_db)(struct ulogd_pluginstance *upi); + int (*close_db)(struct ulogd_pluginstance *upi); + int (*escape_string)(struct ulogd_pluginstance *upi, + char *dst, const char *src, unsigned int len); + int (*execute)(struct ulogd_pluginstance *upi, + const char *stmt, unsigned int len); + char *(*strerror)(struct ulogd_pluginstance *upi); +}; + +struct db_instance { + char *stmt; /* buffer for our insert statement */ + char *stmt_val; /* pointer to the beginning of the "VALUES" part */ + char *stmt_ins; /* pointer to current inser position in statement */ + char *schema; + time_t reconnect; + int (*interp)(struct ulogd_pluginstance *upi); + struct db_driver *driver; +}; +#define TIME_ERR ((time_t)-1) /* Be paranoid */ + +#define DB_CES \ + { \ + .key = "table", \ + .type = CONFIG_TYPE_STRING, \ + .options = CONFIG_OPT_MANDATORY, \ + }, \ + { \ + .key = "reconnect", \ + .type = CONFIG_TYPE_INT, \ + }, \ + { \ + .key = "ip_as_string", \ + .type = CONFIG_TYPE_INT, \ + }, \ + { \ + .key = "connect_timeout", \ + .type = CONFIG_TYPE_INT, \ + } + +#define DB_CE_NUM 4 +#define table_ce(x) (x->ces[0]) +#define reconnect_ce(x) (x->ces[1]) +#define asstring_ce(x) (x->ces[2]) +#define timeout_ce(x) (x->ces[3]) + +void ulogd_db_signal(struct ulogd_pluginstance *upi, int signal); +int ulogd_db_start(struct ulogd_pluginstance *upi); +int ulogd_db_stop(struct ulogd_pluginstance *upi); +int ulogd_db_interp(struct ulogd_pluginstance *upi); +int ulogd_db_configure(struct ulogd_pluginstance *upi, + struct ulogd_pluginstance_stack *stack); + + +#endif diff --git a/output/mysql/Makefile.am b/output/mysql/Makefile.am index 0e5a827..b6730c0 100644 --- a/output/mysql/Makefile.am +++ b/output/mysql/Makefile.am @@ -4,6 +4,6 @@ LIBS=-lmysqlclient_r pkglib_LTLIBRARIES = ulogd_output_MYSQL.la -ulogd_output_MYSQL_la_SOURCES = ulogd_output_MYSQL.c +ulogd_output_MYSQL_la_SOURCES = ulogd_output_MYSQL.c ../../util/db.c ulogd_output_MYSQL_la_LDFLAGS = -module diff --git a/output/mysql/ulogd_output_MYSQL.c b/output/mysql/ulogd_output_MYSQL.c index 766fdb3..c8bea50 100644 --- a/output/mysql/ulogd_output_MYSQL.c +++ b/output/mysql/ulogd_output_MYSQL.c @@ -47,8 +47,7 @@ #include #include #include - -#include "../../util/db.c" +#include #ifdef DEBUG_MYSQL #define DEBUGP(x, args...) fprintf(stderr, x, ## args) @@ -245,7 +244,7 @@ static int configure_mysql(struct ulogd_pluginstance *upi, struct db_instance *di = (struct db_instance *) &upi->private; di->driver = &db_driver_mysql; - return configure_db(upi, stack); + return ulogd_db_configure(upi, stack); } static struct ulogd_plugin plugin_mysql = { @@ -261,10 +260,10 @@ static struct ulogd_plugin plugin_mysql = { .config_kset = &kset_mysql, .priv_size = sizeof(struct mysql_instance), .configure = &configure_mysql, - .start = &start_db, - .stop = &stop_db, - .signal = &signal_db, - .interp = &interp_db, + .start = &ulogd_db_start, + .stop = &ulogd_db_stop, + .signal = &ulogd_db_signal, + .interp = &ulogd_db_interp, .version = ULOGD_VERSION, }; diff --git a/output/pgsql/Makefile.am b/output/pgsql/Makefile.am index d5eb0b9..3de6b2c 100644 --- a/output/pgsql/Makefile.am +++ b/output/pgsql/Makefile.am @@ -4,6 +4,6 @@ LIBS=$(PGSQL_LIB) pkglib_LTLIBRARIES = ulogd_output_PGSQL.la -ulogd_output_PGSQL_la_SOURCES = ulogd_output_PGSQL.c +ulogd_output_PGSQL_la_SOURCES = ulogd_output_PGSQL.c ../../util/db.c ulogd_output_PGSQL_la_LDFLAGS = -module diff --git a/output/pgsql/ulogd_output_PGSQL.c b/output/pgsql/ulogd_output_PGSQL.c index 3587b83..1ae5e06 100644 --- a/output/pgsql/ulogd_output_PGSQL.c +++ b/output/pgsql/ulogd_output_PGSQL.c @@ -14,11 +14,12 @@ #include #include #include -#include + #include #include +#include -#include "../../util/db.c" +#include #ifdef DEBUG_PGSQL #define DEBUGP(x, args...) fprintf(stderr, x, ## args) @@ -78,112 +79,8 @@ static struct config_keyset pgsql_kset = { #define port_ce(x) (x->ces[DB_CE_NUM+5]) #define schema_ce(x) (x->ces[DB_CE_NUM+6]) -#if 0 -/* our main output function, called by ulogd */ -static int pgsql_output(ulog_iret_t *result) -{ - struct _field *f; - ulog_iret_t *res; - PGresult *pgres; -#ifdef IP_AS_STRING - char *tmpstr; /* need this for --log-ip-as-string */ - struct in_addr addr; -#endif - - stmt_ins = stmt_val; - - for (f = fields; f; f = f->next) { - res = keyh_getres(f->id); - - if (!res) { - ulogd_log(ULOGD_NOTICE, - "no result for %s ?!?\n", f->name); - } - - if (!res || !IS_VALID((*res))) { - /* no result, we have to fake something */ - sprintf(stmt_ins, "NULL,"); - stmt_ins = stmt + strlen(stmt); - continue; - } - - switch (res->type) { - case ULOGD_RET_INT8: - sprintf(stmt_ins, "%d,", res->value.i8); - break; - case ULOGD_RET_INT16: - sprintf(stmt_ins, "%d,", res->value.i16); - break; - case ULOGD_RET_INT32: - sprintf(stmt_ins, "%d,", res->value.i32); - break; - case ULOGD_RET_INT64: - sprintf(stmt_ins, "%lld,", res->value.i64); - break; - case ULOGD_RET_UINT8: - sprintf(stmt_ins, "%u,", res->value.ui8); - break; - case ULOGD_RET_UINT16: - sprintf(stmt_ins, "%u,", res->value.ui16); - break; - case ULOGD_RET_IPADDR: -#ifdef IP_AS_STRING - *stmt_ins++ = '\''; - memset(&addr, 0, sizeof(addr)); - addr.s_addr = ntohl(res->value.ui32); - tmpstr = (char *)inet_ntoa(addr); - PQescapeString(stmt_ins,tmpstr,strlen(tmpstr)); - stmt_ins = stmt + strlen(stmt); - sprintf(stmt_ins, "',"); - break; -#endif /* IP_AS_STRING */ - /* EVIL: fallthrough when logging IP as - * u_int32_t */ - - case ULOGD_RET_UINT32: - sprintf(stmt_ins, "%u,", res->value.ui32); - break; - case ULOGD_RET_UINT64: - sprintf(stmt_ins, "%llu,", res->value.ui64); - break; - case ULOGD_RET_BOOL: - sprintf(stmt_ins, "'%d',", res->value.b); - break; - case ULOGD_RET_STRING: - *stmt_ins++ = '\''; - PQescapeString(stmt_ins,res->value.ptr,strlen(res->value.ptr)); - stmt_ins = stmt + strlen(stmt); - sprintf(stmt_ins, "',"); - break; - case ULOGD_RET_RAW: - ulogd_log(ULOGD_NOTICE,"%s: pgsql doesn't support type RAW\n",res->key); - sprintf(stmt_ins, "NULL,"); - break; - default: - ulogd_log(ULOGD_NOTICE, - "unknown type %d for %s\n", - res->type, res->key); - break; - } - stmt_ins = stmt + strlen(stmt); - } - *(stmt_ins - 1) = ')'; - DEBUGP("stmt=#%s#\n", stmt); - - /* now we have created our statement, insert it */ - /* Added code by Jaki */ - pgres = PQexec(dbh, stmt); - if(!pgres || PQresultStatus(pgres) != PGRES_COMMAND_OK) { - ulogd_log(ULOGD_ERROR, "sql error during insert: %s\n", - PQresultErrorMessage(pgres)); - return 1; - } - - return 0; -} -#endif - -#define PGSQL_HAVE_NAMESPACE_TEMPLATE "SELECT nspname FROM pg_namespace n WHERE n.nspname='%s'" +#define PGSQL_HAVE_NAMESPACE_TEMPLATE \ + "SELECT nspname FROM pg_namespace n WHERE n.nspname='%s'" /* Determine if server support schemas */ static int pgsql_namespace(struct ulogd_pluginstance *upi) @@ -218,9 +115,11 @@ static int pgsql_namespace(struct ulogd_pluginstance *upi) return 0; } -#define PGSQL_GETCOLUMN_TEMPLATE "SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname ='%s' AND a.attnum>0 AND a.attrelid=c.oid ORDER BY a.attnum" +#define PGSQL_GETCOLUMN_TEMPLATE \ + "SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname ='%s' AND a.attnum>0 AND a.attrelid=c.oid ORDER BY a.attnum" -#define PGSQL_GETCOLUMN_TEMPLATE_SCHEMA "SELECT a.attname FROM pg_attribute a, pg_class c LEFT JOIN pg_namespace n ON c.relnamespace=n.oid WHERE c.relname ='%s' AND n.nspname='%s' AND a.attnum>0 AND a.attrelid=c.oid AND a.attisdropped=FALSE ORDER BY a.attnum" +#define PGSQL_GETCOLUMN_TEMPLATE_SCHEMA \ + "SELECT a.attname FROM pg_attribute a, pg_class c LEFT JOIN pg_namespace n ON c.relnamespace=n.oid WHERE c.relname ='%s' AND n.nspname='%s' AND a.attnum>0 AND a.attrelid=c.oid AND a.attisdropped=FALSE ORDER BY a.attnum" /* find out which columns the table has */ static int get_columns_pgsql(struct ulogd_pluginstance *upi) @@ -410,7 +309,7 @@ static int configure_pgsql(struct ulogd_pluginstance *upi, pi->db_inst.driver = &db_driver_pgsql; - return configure_db(upi, stack); + return ulogd_db_configure(upi, stack); } static struct ulogd_plugin pgsql_plugin = { @@ -425,10 +324,11 @@ static struct ulogd_plugin pgsql_plugin = { }, .config_kset = &pgsql_kset, .priv_size = sizeof(struct pgsql_instance), - .start = &start_db, - .stop = &stop_db, - .signal = &signal_db, - .interp = &interp_db, + .configure = &configure_pgsql, + .start = &ulogd_db_start, + .stop = &ulogd_db_stop, + .signal = &ulogd_db_signal, + .interp = &ulogd_db_interp, .version = ULOGD_VERSION, }; diff --git a/util/db.c b/util/db.c index 2395712..c91c7dc 100644 --- a/util/db.c +++ b/util/db.c @@ -24,60 +24,22 @@ * $Id: ulogd_output_MYSQL.c 6304 2005-12-08 09:43:19Z /C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org $ */ -/* generic db layer */ +#include +#include +#include +#include +#include -struct db_driver { - int (*get_columns)(struct ulogd_pluginstance *upi); - int (*open_db)(struct ulogd_pluginstance *upi); - int (*close_db)(struct ulogd_pluginstance *upi); - int (*escape_string)(struct ulogd_pluginstance *upi, - char *dst, const char *src, unsigned int len); - int (*execute)(struct ulogd_pluginstance *upi, - const char *stmt, unsigned int len); - char *(*strerror)(struct ulogd_pluginstance *upi); -}; - -struct db_instance { - char *stmt; /* buffer for our insert statement */ - char *stmt_val; /* pointer to the beginning of the "VALUES" part */ - char *stmt_ins; /* pointer to current inser position in statement */ - char *schema; - time_t reconnect; - int (*interp)(struct ulogd_pluginstance *upi); - struct db_driver *driver; -}; -#define TIME_ERR ((time_t)-1) /* Be paranoid */ - -#define DB_CES \ - { \ - .key = "table", \ - .type = CONFIG_TYPE_STRING, \ - .options = CONFIG_OPT_MANDATORY, \ - }, \ - { \ - .key = "reconnect", \ - .type = CONFIG_TYPE_INT, \ - }, \ - { \ - .key = "ip_as_string", \ - .type = CONFIG_TYPE_INT, \ - }, \ - { \ - .key = "connect_timeout", \ - .type = CONFIG_TYPE_INT, \ - } +#include +#include -#define DB_CE_NUM 4 -#define table_ce(x) (x->ces[0]) -#define reconnect_ce(x) (x->ces[1]) -#define asstring_ce(x) (x->ces[2]) -#define timeout_ce(x) (x->ces[3]) +/* generic db layer */ static int __interp_db(struct ulogd_pluginstance *upi); /* this is a wrapper that just calls the current real * interp function */ -static int interp_db(struct ulogd_pluginstance *upi) +int ulogd_db_interp(struct ulogd_pluginstance *upi) { struct db_instance *dbi = (struct db_instance *) &upi->private; return dbi->interp(upi); @@ -150,7 +112,7 @@ static int sql_createstmt(struct ulogd_pluginstance *upi) return 0; } -static int configure_db(struct ulogd_pluginstance *upi, +int ulogd_db_configure(struct ulogd_pluginstance *upi, struct ulogd_pluginstance_stack *stack) { struct db_instance *di = (struct db_instance *) upi->private; @@ -185,7 +147,7 @@ static int configure_db(struct ulogd_pluginstance *upi, return ret; } -static int start_db(struct ulogd_pluginstance *upi) +int ulogd_db_start(struct ulogd_pluginstance *upi) { struct db_instance *di = (struct db_instance *) upi->private; int ret; @@ -203,7 +165,7 @@ static int start_db(struct ulogd_pluginstance *upi) return ret; } -static int stop_db(struct ulogd_pluginstance *upi) +int ulogd_db_stop(struct ulogd_pluginstance *upi) { struct db_instance *di = (struct db_instance *) upi->private; ulogd_log(ULOGD_NOTICE, "stopping\n"); @@ -251,7 +213,7 @@ static int _init_db(struct ulogd_pluginstance *upi) if (open_db(upi)) { ulogd_log(ULOGD_ERROR, "can't establish database connection\n"); - return init_reconnect(upi); + return _init_reconnect(upi); } /* enable 'real' logging */ @@ -356,7 +318,6 @@ static int __interp_db(struct ulogd_pluginstance *upi) di->stmt_ins = di->stmt + strlen(di->stmt); } *(di->stmt_ins - 1) = ')'; - DEBUGP("stmt=#%s#\n", di->stmt); /* now we have created our statement, insert it */ @@ -369,8 +330,7 @@ static int __interp_db(struct ulogd_pluginstance *upi) return 0; } -static void signal_db(struct ulogd_pluginstance *upi, - int signal) +void ulogd_db_signal(struct ulogd_pluginstance *upi, int signal) { switch (signal) { case SIGHUP: -- cgit v1.2.3