From dd42e858c7dc0c48f592afac0d090f8ab91936f9 Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Wed, 26 Oct 2016 20:55:08 +0300 Subject: [PATCH] Allow parsers to store private data to databases Pass a pointer to parser function where the parser can store one pointer worth of its private state. This can be useful in different ways whenever a parser needs to store some information between parser calls. Signed-off-by: Timo Kokkonen --- built_in_parsers.c | 14 +++++++------- onewire_parser.c | 2 +- parser.h | 3 ++- rrdtool.c | 3 ++- rrdtool.h | 1 + 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/built_in_parsers.c b/built_in_parsers.c index cce3f66..bf65ee9 100644 --- a/built_in_parsers.c +++ b/built_in_parsers.c @@ -11,7 +11,7 @@ #define STATFILE "/proc/stat" -static int cpu_parser(char *data, const char **p) +static int cpu_parser(char *data, const char **p, void **state) { char buf[1024]; char *str = buf; @@ -46,7 +46,7 @@ static int cpu_parser(char *data, const char **p) #define MEMFILE "/proc/meminfo" -static int mem_parser(char *data, const char **p) +static int mem_parser(char *data, const char **p, void **state) { char buf[1024], word[1024]; int free = 0, buffered = 0, cache = 0, active = 0, inactive = 0, @@ -106,19 +106,19 @@ static int mem_parser(char *data, const char **p) return 0; } -int cpu_mem_parser(char *data, const char **p) +int cpu_mem_parser(char *data, const char **p, void **state) { char cpu[RRD_DATA_MAX_LEN], mem[RRD_DATA_MAX_LEN]; - cpu_parser(cpu, p); - mem_parser(mem, p); + cpu_parser(cpu, p, state); + mem_parser(mem, p, state); snprintf(data, RRD_DATA_MAX_LEN, "%s:%s", cpu, mem); return 0; } /* Run a command and feed the output from stdout directly to rrdtool */ -static int script_parser(char *rrd_data, const char **parser_data) +static int script_parser(char *rrd_data, const char **parser_data, void **state) { FILE *readf; int pid, ret; @@ -201,7 +201,7 @@ static int get_iface_stats(const char *iface, struct iface_stats *stat) return -ENODEV; } -int netstats_parser(char *rrd_data, const char **parser_data) +int netstats_parser(char *rrd_data, const char **parser_data, void **state) { struct iface_stats stat; const char **iface_name = parser_data; diff --git a/onewire_parser.c b/onewire_parser.c index 12e3f5b..834ea9a 100644 --- a/onewire_parser.c +++ b/onewire_parser.c @@ -117,7 +117,7 @@ static int is_mount_point(const char *str) return 0; } -static int onewire_parser(char *rrd_data, const char **parser_data) +static int onewire_parser(char *rrd_data, const char **parser_data, void **s) { OWNET_HANDLE h; const char *server_addr, *mount_point; diff --git a/parser.h b/parser.h index b5718e0..b77eafe 100644 --- a/parser.h +++ b/parser.h @@ -1,7 +1,8 @@ #ifndef _PARSER_H #define _PARSER_H -typedef int (parse_fn_t)(char *rrd_data, const char **parser_data); +typedef int (parse_fn_t)(char *rrd_data, const char **parser_data, + void **parser_state); struct parser_info { struct parser_info *next; diff --git a/rrdtool.c b/rrdtool.c index d7b710b..da876d5 100644 --- a/rrdtool.c +++ b/rrdtool.c @@ -278,7 +278,8 @@ static int do_rrdtool_update_data(struct rrd_database *rrd) l = sprintf(data, "N:"); if (rrd->parser && rrd->parser->parse) { - rrd->parser->parse(data + l, rrd->parser_data); + rrd->parser->parse(data + l, rrd->parser_data, + &rrd->parser_state); data[RRD_DATA_MAX_LEN + 2] = '\0'; pr_info("Data: %s\n", data); diff --git a/rrdtool.h b/rrdtool.h index ec8a9d4..b05eed6 100644 --- a/rrdtool.h +++ b/rrdtool.h @@ -39,6 +39,7 @@ struct rrd_database { /* Parser to aquire data for rrd */ struct parser_info *parser; const char **parser_data; /* data to be fed to the parser */ + void *parser_state; /* pointer to parser private state */ char *const *pre_draw_cmd; /* Command to execute prior drawing images*/ char *const *post_draw_cmd; /* ..and after drawing images */ -- 2.44.0