diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/db.c | 66 | ||||
-rw-r--r-- | util/printpkt.c | 10 |
2 files changed, 48 insertions, 28 deletions
@@ -67,7 +67,6 @@ static int sql_createstmt(struct ulogd_pluginstance *upi) unsigned int i; char *table = table_ce(upi->config_kset).u.string; char *procedure = procedure_ce(upi->config_kset).u.string; - char *stmt_val = NULL; if (mi->stmt) free(mi->stmt); @@ -96,30 +95,33 @@ static int sql_createstmt(struct ulogd_pluginstance *upi) if (strncasecmp(procedure,"INSERT", strlen("INSERT")) == 0 && (procedure[strlen("INSERT")] == '\0' || procedure[strlen("INSERT")] == ' ')) { - char buf[ULOGD_MAX_KEYLEN]; - char *underscore; + char *stmt_val = mi->stmt; if(procedure[6] == '\0') { /* procedure == "INSERT" */ if (mi->schema) - sprintf(mi->stmt, "insert into %s.%s (", mi->schema, table); + stmt_val += sprintf(stmt_val, + "insert into %s.%s (", + mi->schema, table); else - sprintf(mi->stmt, "insert into %s (", table); - } - else - sprintf(mi->stmt, "%s (", procedure); - - stmt_val = mi->stmt + strlen(mi->stmt); + stmt_val += sprintf(stmt_val, + "insert into %s (", table); + } else + stmt_val += sprintf(stmt_val, "%s (", procedure); for (i = 0; i < upi->input.num_keys; i++) { + char *underscore; + if (upi->input.keys[i].flags & ULOGD_KEYF_INACTIVE) continue; - strncpy(buf, upi->input.keys[i].name, ULOGD_MAX_KEYLEN); - while ((underscore = strchr(buf, '.'))) + underscore = stmt_val; + + stmt_val += sprintf(stmt_val, "%s,", + upi->input.keys[i].name); + + while ((underscore = strchr(underscore, '.'))) *underscore = '_'; - sprintf(stmt_val, "%s,", buf); - stmt_val = mi->stmt + strlen(mi->stmt); } *(stmt_val - 1) = ')'; @@ -226,9 +228,8 @@ int ulogd_db_start(struct ulogd_pluginstance *upi) di->ring.size, di->ring.length); /* init start of query for each element */ for(i = 0; i < di->ring.size; i++) { - strncpy(di->ring.ring + di->ring.length * i + 1, - di->stmt, - strlen(di->stmt)); + strcpy(di->ring.ring + di->ring.length * i + 1, + di->stmt); } /* init cond & mutex */ ret = pthread_cond_init(&di->ring.cond, NULL); @@ -343,6 +344,9 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start) } switch (res->type) { + case ULOGD_RET_BOOL: + sprintf(stmt_ins, "'%d',", res->u.value.b); + break; case ULOGD_RET_INT8: sprintf(stmt_ins, "%d,", res->u.value.i8); break; @@ -362,16 +366,24 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start) sprintf(stmt_ins, "%u,", res->u.value.ui16); break; case ULOGD_RET_IPADDR: - /* fallthrough when logging IP as uint32_t */ + if (res->len == sizeof(struct in_addr)) + sprintf(stmt_ins, "%u,", res->u.value.ui32); + else { + struct in6_addr ipv6; + char addrbuf[2 + sizeof(ipv6) * 2 + 1]; + + memcpy(ipv6.s6_addr, res->u.value.ui128, + sizeof(ipv6.s6_addr)); + format_ipv6(addrbuf, sizeof(addrbuf), &ipv6); + sprintf(stmt_ins, "%s,", addrbuf); + } + break; case ULOGD_RET_UINT32: sprintf(stmt_ins, "%u,", res->u.value.ui32); break; case ULOGD_RET_UINT64: sprintf(stmt_ins, "%" PRIu64 ",", res->u.value.ui64); break; - case ULOGD_RET_BOOL: - sprintf(stmt_ins, "'%d',", res->u.value.b); - break; case ULOGD_RET_STRING: *(stmt_ins++) = '\''; if (res->u.value.ptr) { @@ -388,6 +400,7 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start) case ULOGD_RET_RAW: ulogd_log(ULOGD_NOTICE, "Unsupported RAW type is unsupported in SQL output"); + break; default: ulogd_log(ULOGD_NOTICE, "unknown type %d for %s\n", @@ -402,14 +415,17 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start) static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, unsigned int len) { struct db_instance *di = (struct db_instance *) &upi->private; + unsigned int query_size; struct db_stmt *query; /* check if we are using backlog */ if (di->backlog_memcap == 0) return 0; + query_size = sizeof(*query) + len + 1; + /* check len against backlog */ - if (len + di->backlog_memusage > di->backlog_memcap) { + if (query_size + di->backlog_memcap - di->backlog_memusage) { if (di->backlog_full == 0) ulogd_log(ULOGD_ERROR, "Backlog is full starting to reject events.\n"); @@ -417,7 +433,7 @@ static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, un return -1; } - query = malloc(sizeof(struct db_stmt)); + query = malloc(sizeof(*query)); if (query == NULL) return -1; @@ -429,7 +445,7 @@ static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, un return -1; } - di->backlog_memusage += len + sizeof(struct db_stmt); + di->backlog_memusage += query_size; di->backlog_full = 0; llist_add_tail(&query->list, &di->backlog); @@ -487,7 +503,7 @@ static int __treat_backlog(struct ulogd_pluginstance *upi) di->driver->close_db(upi); return _init_reconnect(upi); } else { - di->backlog_memusage -= query->len + sizeof(struct db_stmt); + di->backlog_memusage -= sizeof(*query) + query->len + 1; llist_del(&query->list); free(query->stmt); free(query); diff --git a/util/printpkt.c b/util/printpkt.c index 69a47ca..09a2194 100644 --- a/util/printpkt.c +++ b/util/printpkt.c @@ -260,11 +260,12 @@ static int printpkt_ipv4(struct ulogd_key *res, char *buf) ikey_get_u16(&res[KEY_ICMP_ECHOSEQ])); break; case ICMP_PARAMETERPROB: + paddr = ikey_get_u32(&res[KEY_ICMP_GATEWAY]); buf_cur += sprintf(buf_cur, "PARAMETER=%u ", - ikey_get_u32(&res[KEY_ICMP_GATEWAY]) >> 24); + *(uint8_t *) &paddr); break; case ICMP_REDIRECT: - paddr = ikey_get_u32(&res[KEY_ICMP_GATEWAY]), + paddr = ikey_get_u32(&res[KEY_ICMP_GATEWAY]); buf_cur += sprintf(buf_cur, "GATEWAY=%s ", inet_ntop(AF_INET, &paddr, @@ -355,6 +356,9 @@ static int printpkt_ipv6(struct ulogd_key *res, char *buf) break; } break; + default: + buf_cur += sprintf(buf_cur, "PROTO=%u ", + ikey_get_u8(&res[KEY_IP6_NEXTHDR])); } return buf_cur - buf; @@ -471,7 +475,7 @@ int printpkt_print(struct ulogd_key *res, char *buf) buf_cur += sprintf(buf_cur, "GID=%u ", ikey_get_u32(&res[KEY_OOB_GID])); if (pp_is_valid(res, KEY_OOB_MARK)) - buf_cur += sprintf(buf_cur, "MARK=%x ", + buf_cur += sprintf(buf_cur, "MARK=0x%x ", ikey_get_u32(&res[KEY_OOB_MARK])); strcat(buf_cur, "\n"); |