]> git.itanic.dy.fi Git - rrdd/commitdiff
Allow parsers to store private data to databases
authorTimo Kokkonen <timo.t.kokkonen@iki.fi>
Wed, 26 Oct 2016 17:55:08 +0000 (20:55 +0300)
committerTimo Kokkonen <timo.t.kokkonen@iki.fi>
Wed, 26 Oct 2016 18:22:21 +0000 (21:22 +0300)
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 <timo.t.kokkonen@iki.fi>
built_in_parsers.c
onewire_parser.c
parser.h
rrdtool.c
rrdtool.h

index cce3f66865ab210b59c408792f61d5dfabb30aaa..bf65ee9ad62006ee69b21fce0ec80d4ed95125cf 100644 (file)
@@ -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;
index 12e3f5bf09c440ab0cebf06af87c394c1fa6f8e9..834ea9a624068e3bb8b47088841f6ede5513b279 100644 (file)
@@ -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;
index b5718e018672e35c2c937d8583bfb4ff29778787..b77eafef1adc55e077c1659bee9bfac78919ae10 100644 (file)
--- 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;
index d7b710b709435d474dd1343402f99c2ee40779f3..da876d51da7620d8051ca6f0320790c71f5e687f 100644 (file)
--- 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);
index ec8a9d432dd5b53d3a23d911dff9535bda83981f..b05eed66048c07c50c618345a1bafa1178507367 100644 (file)
--- 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 */