From a77d43679e92e0c36c8b14311d39df754e47b2c6 Mon Sep 17 00:00:00 2001 From: Alex 'AdUser' Z Date: Tue, 19 Jan 2021 12:59:20 +1000 Subject: [PATCH] * refactor filter's stats() library call --- src/filter.c | 15 +-------------- src/filter.h | 2 +- src/filters/filter.c | 21 +++++++++++++++++++++ src/filters/filter.h | 12 ++++++------ src/filters/pcre.c | 37 +++++++++---------------------------- src/filters/preg.c | 38 ++++++++++---------------------------- src/source.h | 2 ++ 7 files changed, 50 insertions(+), 77 deletions(-) diff --git a/src/filter.c b/src/filter.c index b190209..243b513 100644 --- a/src/filter.c +++ b/src/filter.c @@ -179,23 +179,10 @@ f2b_filter_match(f2b_filter_t *filter, const char *line, char *buf, size_t buf_s void f2b_filter_cmd_stats(char *buf, size_t bufsize, f2b_filter_t *filter) { - bool reset = true; - char *pattern; - char tmp[256]; - const char *fmt = - "- pattern: %s\n" - " matches: %d\n"; - int matches; - assert(filter != NULL); assert(buf != NULL); - buf[0] = '\0'; - while (filter->stats(filter->cfg, &matches, &pattern, reset)) { - snprintf(tmp, sizeof(tmp), fmt, pattern, matches); - strlcat(buf, tmp, bufsize); - reset = false; - } + filter->stats(filter->cfg, buf, bufsize); } void diff --git a/src/filter.h b/src/filter.h index 9182b58..2b2f4cf 100644 --- a/src/filter.h +++ b/src/filter.h @@ -34,7 +34,7 @@ typedef struct f2b_filter_t { /** dlsym pointer to handler of @a flush command */ bool (*flush) (void *cfg); /** dlsym pointer to handler of @a stats command */ - bool (*stats) (void *cfg, int *matches, char **pattern, bool reset); + bool (*stats) (void *cfg, char *buf, size_t bufsize); /** dlsym pointer to handler of @a match command */ bool (*match) (void *cfg, const char *line, char *buf, size_t buf_size); /** dlsym pointer to handler of @a destroy command */ diff --git a/src/filters/filter.c b/src/filters/filter.c index 7b49226..de46d33 100644 --- a/src/filters/filter.c +++ b/src/filters/filter.c @@ -34,3 +34,24 @@ logcb(cfg_t *cfg, void (*cb)(enum loglevel lvl, const char *msg)) { cfg->logcb = cb; } + +bool +stats(cfg_t *cfg, char *buf, size_t bufsize) { + char tmp[PATTERN_MAX + 64]; + const char *fmt = + "- pattern: %s\n" + " matches: %d\n"; + + assert(cfg != NULL); + + if (buf == NULL || bufsize == 0) + return false; + + for (rx_t *rx = cfg->regexps; rx != NULL; rx = rx->next) { + snprintf(tmp, sizeof(tmp), fmt, rx->pattern, rx->matches); + strlcat(buf, tmp, bufsize); + } + + return true; +} + diff --git a/src/filters/filter.h b/src/filters/filter.h index 1cdeb9d..458b462 100644 --- a/src/filters/filter.h +++ b/src/filters/filter.h @@ -93,6 +93,7 @@ enum loglevel { * Opaque module handler, contains module internal structs */ typedef struct _config cfg_t; +typedef struct _regexp rx_t; /** * @brief Create instance of module @@ -129,14 +130,13 @@ extern bool ready(cfg_t *cfg); */ extern void logcb(cfg_t *cfg, void (*cb)(enum loglevel l, const char *msg)); /** - * @brief Fetch match stats by-pattern + * @brief Fetch filter match stats * @param cfg Module handler - * @param matches Pointer to storage for matches count - * @param pattern Associated pattern - * @param reset Reset to start of statistics (for later calls) - * @returns false on no more stats or true otherwise with filling @a matches and @a pattern + * @param buf Pointer to storage for stats report + * @param bufsize Available size for report on @a buf pointer + * @returns true on success, false on error */ -extern bool stats(cfg_t *cfg, int *matches, char **pattern, bool reset); +extern bool stats(cfg_t *cfg, char *buf, size_t bufsize); /** * @brief Match given line against configured regexps * @param cfg Module handler diff --git a/src/filters/pcre.c b/src/filters/pcre.c index fc0f367..be0d603 100644 --- a/src/filters/pcre.c +++ b/src/filters/pcre.c @@ -10,13 +10,13 @@ #define MODNAME "pcre" #define HOST_REGEX "(?[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})" -typedef struct f2b_regex_t { - struct f2b_regex_t *next; +struct _regexp { + rx_t *next; char pattern[PATTERN_MAX]; int matches; pcre *regex; pcre_extra *data; -} f2b_regex_t; +}; struct _config { char id[ID_MAX]; @@ -24,8 +24,7 @@ struct _config { bool icase; bool study; bool usejit; - f2b_regex_t *regexps; - f2b_regex_t *statp; + rx_t *regexps; }; #include "filter.c" @@ -73,7 +72,7 @@ config(cfg_t *cfg, const char *key, const char *value) { bool append(cfg_t *cfg, const char *pattern) { - f2b_regex_t *regex = NULL; + rx_t *regex = NULL; int flags = 0; size_t bufsize; char *buf = NULL; @@ -98,7 +97,7 @@ append(cfg_t *cfg, const char *pattern) { strlcat(buf, HOST_REGEX, bufsize); strlcat(buf, token + strlen(HOST_TOKEN), bufsize); - if ((regex = calloc(1, sizeof(f2b_regex_t))) == NULL) + if ((regex = calloc(1, sizeof(rx_t))) == NULL) return false; if ((regex->regex = pcre_compile(buf, flags, &errptr, &erroffset, NULL)) == NULL) { @@ -135,26 +134,8 @@ ready(cfg_t *cfg) { return false; } -bool -stats(cfg_t *cfg, int *matches, char **pattern, bool reset) { - assert(cfg != NULL); - - if (reset) - cfg->statp = cfg->regexps; - - if (cfg->statp) { - *matches = cfg->statp->matches; - *pattern = cfg->statp->pattern; - cfg->statp = cfg->statp->next; - return true; - } - - return false; -} - bool match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { - f2b_regex_t *r = NULL; enum { OVECSIZE = 30 }; int ovector[OVECSIZE]; int flags = 0; @@ -164,7 +145,7 @@ match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { assert(line != NULL); assert(buf != NULL); - for (r = cfg->regexps; r != NULL; r = r->next) { + for (rx_t *r = cfg->regexps; r != NULL; r = r->next) { rc = pcre_exec(r->regex, r->data, line, strlen(line), 0, flags, ovector, OVECSIZE); if (rc < 0 && rc == PCRE_ERROR_NOMATCH) continue; @@ -188,11 +169,11 @@ match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { void flush(cfg_t *cfg) { - f2b_regex_t *next = NULL, *r = NULL; + rx_t *next = NULL; assert(cfg != NULL); - for (r = cfg->regexps; r != NULL; r = next) { + for (rx_t *r = cfg->regexps; r != NULL; r = next) { next = r->next; #ifdef PCRE_CONFIG_JIT if (cfg->study) diff --git a/src/filters/preg.c b/src/filters/preg.c index 57b8b59..81bb3c1 100644 --- a/src/filters/preg.c +++ b/src/filters/preg.c @@ -6,25 +6,25 @@ */ #include +#include "../strlcpy.h" #include "filter.h" #define MODNAME "preg" /* draft */ #define HOST_REGEX "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})" -typedef struct f2b_regex_t { - struct f2b_regex_t *next; +struct _regexp { + rx_t *next; char pattern[PATTERN_MAX]; int matches; regex_t regex; -} f2b_regex_t; +}; struct _config { char id[ID_MAX]; bool icase; void (*logcb)(enum loglevel lvl, const char *msg); - f2b_regex_t *regexps; - f2b_regex_t *statp; + rx_t *regexps; }; #include "filter.c" @@ -57,7 +57,7 @@ config(cfg_t *cfg, const char *key, const char *value) { bool append(cfg_t *cfg, const char *pattern) { - f2b_regex_t *regex = NULL; + rx_t *regex = NULL; int flags = REG_EXTENDED; size_t bufsize; char *buf = NULL; @@ -81,7 +81,7 @@ append(cfg_t *cfg, const char *pattern) { strlcat(buf, HOST_REGEX, bufsize); strlcat(buf, token + strlen(HOST_TOKEN), bufsize); - if ((regex = calloc(1, sizeof(f2b_regex_t))) == NULL) + if ((regex = calloc(1, sizeof(rx_t))) == NULL) return false; if ((ret = regcomp(®ex->regex, buf, flags)) == 0) { @@ -107,26 +107,8 @@ ready(cfg_t *cfg) { return false; } -bool -stats(cfg_t *cfg, int *matches, char **pattern, bool reset) { - assert(cfg != NULL); - - if (reset) - cfg->statp = cfg->regexps; - - if (cfg->statp) { - *matches = cfg->statp->matches; - *pattern = cfg->statp->pattern; - cfg->statp = cfg->statp->next; - return true; - } - - return false; -} - bool match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { - f2b_regex_t *r = NULL; size_t match_len = 0; regmatch_t match[2]; @@ -134,7 +116,7 @@ match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { assert(line != NULL); assert(buf != NULL); - for (r = cfg->regexps; r != NULL; r = r->next) { + for (rx_t *r = cfg->regexps; r != NULL; r = r->next) { if (regexec(&r->regex, line, 2, &match[0], 0) != 0) continue; /* matched */ @@ -152,11 +134,11 @@ match(cfg_t *cfg, const char *line, char *buf, size_t buf_size) { void flush(cfg_t *cfg) { - f2b_regex_t *next = NULL, *r = NULL; + rx_t *next = NULL; assert(cfg != NULL); - for (r = cfg->regexps; r != NULL; r = next) { + for (rx_t *r = cfg->regexps; r != NULL; r = next) { next = r->next; regfree(&r->regex); free(r); diff --git a/src/source.h b/src/source.h index c5e1528..b4ccb84 100644 --- a/src/source.h +++ b/src/source.h @@ -32,6 +32,8 @@ typedef struct f2b_source_t { bool (*start) (void *cfg); /** dlsym pointer to handler of @a next command */ bool (*next) (void *cfg, char *buf, size_t bufsize, bool reset); + /** dlsym pointer to handler of @a stats command */ + bool (*stats) (void *cfg, char *buf, size_t bufsize); /** dlsym pointer to handler of @a stop command */ bool (*stop) (void *cfg); /** dlsym pointer to handler of @a destroy command */