]> git.itanic.dy.fi Git - rrdd/blobdiff - config.c
onewire_parser.c: Fix compiler warnings about string lengths
[rrdd] / config.c
index 7b78e3a607c08398c0d7c0ac1c3c95966c07c37e..83242033d6958c329d51c219c92c29c683839a2d 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1,3 +1,6 @@
+#include <stdlib.h>
+#include <string.h>
+
 #include "debug.h"
 #include "config.h"
 #include "rrdtool.h"
@@ -34,6 +37,7 @@ static int parse_images(config_setting_t *list, struct rrd_database *db)
        const char *database = NULL, *filename = NULL, *timestart = NULL;
        const char *timeend = NULL, *imageformat = NULL;
        const char **options = NULL, **text = NULL;
+       const char *updatestr = NULL;
        int width = 0, height = 0, text_lead = 0;
 
        count = config_setting_length(list);
@@ -85,7 +89,7 @@ static int parse_images(config_setting_t *list, struct rrd_database *db)
 
                config_setting_lookup_string(image, "timestart", &timestart);
                if (!timestart) {
-                       pr_err("Database %s does not have \"height\" entry "
+                       pr_err("Database %s does not have \"timestart\" entry "
                                " in image data\n",
                                db->name);
                        return -1;
@@ -93,7 +97,7 @@ static int parse_images(config_setting_t *list, struct rrd_database *db)
 
                config_setting_lookup_string(image, "timeend", &timeend);
                if (!timeend) {
-                       pr_err("Database %s does not have \"height\" entry "
+                       pr_err("Database %s does not have \"timeend\" entry "
                                " in image data\n",
                                db->name);
                        return -1;
@@ -102,12 +106,15 @@ static int parse_images(config_setting_t *list, struct rrd_database *db)
                config_setting_lookup_string(image, "imageformat",
                                        &imageformat);
                if (!imageformat) {
-                       pr_err("Database %s does not have \"height\" entry "
-                               " in image data\n",
+                       pr_err("Database %s does not have \"imageformat\" "\
+                               "entry in image data\n",
                                db->name);
                        return -1;
                }
 
+               config_setting_lookup_string(image, "update_string",
+                                       &updatestr);
+
                str_list = config_setting_get_member(image, "options");
                if (str_list)
                        read_strings_from_list(str_list, &options);
@@ -122,48 +129,22 @@ static int parse_images(config_setting_t *list, struct rrd_database *db)
                db->images[i]->width            = width;
                db->images[i]->height           = height;
                strncpy(db->images[i]->timestart, timestart,
-                       sizeof(db->images[i]->timestart));
+                       sizeof(db->images[i]->timestart) - 1);
                strncpy(db->images[i]->timeend, timeend,
-                       sizeof(db->images[i]->timeend));
+                       sizeof(db->images[i]->timeend) - 1);
                strncpy(db->images[i]->imageformat, imageformat,
-                       sizeof(db->images[i]->imageformat));
+                       sizeof(db->images[i]->imageformat) - 1);
                db->images[i]->options          = options;
                db->images[i]->text_lead        = text_lead;
                db->images[i]->text             = text;
+
+               if (updatestr)
+                       db->images[i]->updatestr = strdup(updatestr);
        }
 
        return 0;
 }
 
-static int (*str_to_parser(const char *str))(char *rrd_data, void *parser_data)
-{
-       if (!str)
-               return NULL;
-
-       if (!strcmp(str, "cpu"))
-               return cpu_parser;
-
-       if (!strcmp(str, "mem"))
-               return mem_parser;
-
-       if (!strcmp(str, "cpu_mem"))
-               return cpu_mem_parser;
-
-       if (!strcmp(str, "digitemp"))
-               return digitemp_parser;
-
-       if (!strcmp(str, "digitemp_mod"))
-               return digitemp_parser_mod;
-
-       if (!strcmp(str, "script"))
-               return script_parser;
-
-       if (!strcmp(str, "netstats"))
-               return netstats_parser;
-
-       return NULL;
-}
-
 static int parse_data_sources(config_setting_t *rrd, struct rrd_database *db)
 {
        config_setting_t *list, *group;
@@ -250,6 +231,9 @@ static int parse_database(config_setting_t *rrd, struct rrd_database *db)
 {
        config_setting_t *list, *str_list;
        const char *name, *parser = NULL, *filename, **parser_data;
+       const char **pre_draw_cmd;
+       const char **post_draw_cmd;
+       const char *logfile = NULL, *logfile_timestamp_fmt = NULL;
 
        if (!config_setting_lookup_string(rrd, "name", &name)) {
                pr_err("Database entry does not contain name\n");
@@ -259,10 +243,9 @@ static int parse_database(config_setting_t *rrd, struct rrd_database *db)
        pr_info("parsing database %s\n", name);
        db->name = strdup(name);
 
-       if (!config_setting_lookup_string(rrd, "filename", &filename)) {
+       if (!config_setting_lookup_string(rrd, "filename", &filename))
                pr_err("Database %s does not contain filename\n", db->name);
-               return -1;
-       }
+
        db->filename = strdup(filename);
 
        if (!config_setting_lookup_int(rrd, "interval", &db->interval)) {
@@ -272,7 +255,7 @@ static int parse_database(config_setting_t *rrd, struct rrd_database *db)
 
        /* Parser is not a mandatory parameter */
        config_setting_lookup_string(rrd, "parser", &parser);
-       db->parse = str_to_parser(parser);
+       db->parser = str_to_parser(parser);
 
        list = config_setting_get_member(rrd, "image");
        parse_images(list, db);
@@ -285,6 +268,28 @@ static int parse_database(config_setting_t *rrd, struct rrd_database *db)
                db->parser_data = parser_data;
        }
 
+       str_list = config_setting_get_member(rrd, "pre_draw_cmd");
+       if (str_list) {
+               read_strings_from_list(str_list, &pre_draw_cmd);
+               db->pre_draw_cmd = (char *const *)pre_draw_cmd;
+       }
+
+       str_list = config_setting_get_member(rrd, "post_draw_cmd");
+       if (str_list) {
+               read_strings_from_list(str_list, &post_draw_cmd);
+               db->post_draw_cmd = (char *const *)post_draw_cmd;
+       }
+
+       config_setting_lookup_string(rrd, "logfile", &logfile);
+       if (logfile)
+               db->logfile = strdup(logfile);
+
+       config_setting_lookup_string(rrd, "logfile_timestamp_fmt",
+                               &logfile_timestamp_fmt);
+       if (logfile_timestamp_fmt)
+               db->logfile_timestamp_fmt = strdup(logfile_timestamp_fmt);
+
+
        return 0;
 }
 
@@ -326,177 +331,3 @@ out:
        config_destroy(&config);
        return rrd_db;
 }
-
-#define CONFIG_ADD_STRING(_config, _setting, _name, _val)              \
-       do {                                                            \
-               _setting = config_setting_add(_config, _name,           \
-                                       CONFIG_TYPE_STRING);            \
-               config_setting_set_string(_setting, _val);              \
-       } while (0);                                                    \
-
-#define CONFIG_ADD_INT(_config, _setting, _name, _val)                 \
-       do {                                                            \
-               _setting = config_setting_add(_config, _name,           \
-                                       CONFIG_TYPE_INT);               \
-               config_setting_set_int(_setting, _val);                 \
-       } while (0);                                                    \
-
-#define CONFIG_ADD_FLOAT(_config, _setting, _name, _val)               \
-       do {                                                            \
-               _setting = config_setting_add(_config, _name,           \
-                                       CONFIG_TYPE_FLOAT);             \
-               config_setting_set_float(_setting, _val);               \
-       } while (0);                                                    \
-
-static void put_strings_to_list(config_setting_t *config,
-                               const char *entry_name, const char **strings)
-{
-       config_setting_t *list, *setting;
-       int i;
-
-       list = config_setting_add(config, entry_name, CONFIG_TYPE_LIST);
-       for (i = 0; strings[i]; i++)
-               CONFIG_ADD_STRING(list, setting, NULL, strings[i]);
-}
-
-static void put_image_to_list(config_setting_t *config,
-                       struct rrd_image *image)
-{
-       config_setting_t *setting, *group;
-
-       group = config_setting_add(config, "image", CONFIG_TYPE_GROUP);
-
-       CONFIG_ADD_STRING(group, setting, "rrd_database", image->rrd_database);
-       CONFIG_ADD_STRING(group, setting, "filename", image->image_filename);
-       CONFIG_ADD_INT(group, setting, "width", image->width);
-       CONFIG_ADD_INT(group, setting, "height", image->height);
-       CONFIG_ADD_STRING(group, setting, "timestart", image->timestart);
-       CONFIG_ADD_STRING(group, setting, "timeend", image->timeend);
-       CONFIG_ADD_STRING(group, setting, "imageformat", image->imageformat);
-
-       put_strings_to_list(group, "options", image->options);
-
-       CONFIG_ADD_INT(group, setting, "text_lead", image->text_lead);
-
-       put_strings_to_list(group, "text", image->text);
-}
-
-static void put_data_source_to_list(config_setting_t *list,
-                               struct rrd_data_source *source)
-{
-       config_setting_t *setting, *group;
-
-       group = config_setting_add(list, "data_source", CONFIG_TYPE_GROUP);
-
-       CONFIG_ADD_STRING(group, setting, "type", source->type);
-       CONFIG_ADD_STRING(group, setting, "name", source->name);
-       CONFIG_ADD_INT(group, setting, "heartbeat", source->heartbeat);
-       CONFIG_ADD_FLOAT(group, setting, "min", source->min);
-       CONFIG_ADD_FLOAT(group, setting, "max", source->max);
-}
-
-static void put_archive_to_list(config_setting_t *list,
-                               struct rrd_archive *archive)
-{
-       config_setting_t *setting, *group;
-
-       group = config_setting_add(list, "archive", CONFIG_TYPE_GROUP);
-
-       CONFIG_ADD_STRING(group, setting, "type", archive->type);
-       CONFIG_ADD_FLOAT(group, setting, "xff", archive->xff);
-       CONFIG_ADD_INT(group, setting, "steps", archive->steps);
-       CONFIG_ADD_INT(group, setting, "rows", archive->rows);
-}
-
-static char *parser_to_str(int (*parser)(char *rrd_data, void *parser_data))
-{
-       if (parser == cpu_parser)
-               return "cpu";
-
-       if (parser == mem_parser)
-               return "mem";
-
-       if (parser == cpu_mem_parser)
-               return "cpu_mem";
-
-       if (parser == digitemp_parser)
-               return "digitemp";
-
-       if (parser == digitemp_parser_mod)
-               return "digitemp_mod";
-
-       if (parser == script_parser)
-               return "script";
-
-       if (parser == netstats_parser)
-               return "netstats";
-
-       return NULL;
-}
-
-static void put_database_to_list(config_setting_t *config,
-                               struct rrd_database *db)
-{
-       config_setting_t *setting;
-       config_setting_t *list, *group;
-       char *str = parser_to_str(db->parse);
-       int i;
-
-       group = config_setting_add(config, RRD_DATABASE_LIST,
-                               CONFIG_TYPE_GROUP);
-
-       CONFIG_ADD_STRING(group, setting, "name", db->name);
-       CONFIG_ADD_STRING(group, setting, "filename", db->filename);
-       CONFIG_ADD_INT(group, setting, "interval", db->interval);
-       CONFIG_ADD_STRING(group, setting, "parser", str);
-
-       if (db->parser_data)
-               put_strings_to_list(group, "parser_data", db->parser_data);
-
-       list = config_setting_add(group, "image", CONFIG_TYPE_LIST);
-       for (i = 0; db->images[i]; i++) {
-               put_image_to_list(list, db->images[i]);
-       }
-
-       if (db->sources) {
-               list = config_setting_add(group, "sources", CONFIG_TYPE_LIST);
-               for (i = 0; db->sources[i].type; i++) {
-                       put_data_source_to_list(list, &db->sources[i]);
-               }
-       }
-
-       if (db->archives) {
-               list = config_setting_add(group, "archives", CONFIG_TYPE_LIST);
-               for (i = 0; db->archives[i].type; i++) {
-                       put_archive_to_list(list, &db->archives[i]);
-               }
-       }
-}
-
-int write_database(const char *conffile, struct rrd_database **rrd_db)
-{
-       config_t config;
-       config_setting_t *root, *rrd_database_list;
-       int i;
-       int ret;
-
-       config_init(&config);
-
-       config_set_tab_width(&config, 4);
-
-       root = config_root_setting(&config);
-
-       rrd_database_list = config_setting_add(root, RRD_DATABASE_LIST,
-                                       CONFIG_TYPE_LIST);
-       for (i = 0; rrd_db[i]; i++) {
-               put_database_to_list(rrd_database_list, rrd_db[i]);
-       }
-
-       ret = !config_write_file(&config, conffile);
-       if (ret)
-               pr_err("Error while writing file.\n");
-
-       config_destroy(&config);
-
-       return ret;
-}