X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=common.c;h=5d2a67deaef7276cb0e86c6c4da8ce9b51dec13f;hb=0bdac0286e8d3c42dd8d5c3058d822e9ad0e6313;hp=ec267af957a80ea15ff5707a671d3ee9903512cf;hpb=4bd1536081d134fdb0d21067d0c7ddcdc422e6c9;p=collection4.git diff --git a/common.c b/common.c index ec267af..5d2a67d 100644 --- a/common.c +++ b/common.c @@ -8,7 +8,10 @@ #include #include +#include + #include "common.h" +#include "graph_list.h" static int foreach_rrd_file (const char *dir, /* {{{ */ int (*callback) (const char *, void *), @@ -170,6 +173,76 @@ size_t c_strlcat (char *dst, const char *src, size_t size) /* {{{ */ return (retval); } /* }}} size_t c_strlcat */ +int ds_list_from_rrd_file (char *file, /* {{{ */ + size_t *ret_dses_num, char ***ret_dses) +{ + char *rrd_argv[] = { "info", file, NULL }; + int rrd_argc = (sizeof (rrd_argv) / sizeof (rrd_argv[0])) - 1; + + rrd_info_t *info; + rrd_info_t *ptr; + + char **dses = NULL; + size_t dses_num = 0; + + info = rrd_info (rrd_argc, rrd_argv); + if (info == NULL) + { + printf ("%s: rrd_info (%s) failed.\n", __func__, file); + return (-1); + } + + for (ptr = info; ptr != NULL; ptr = ptr->next) + { + size_t keylen; + size_t dslen; + char *ds; + char **tmp; + + if (strncmp ("ds[", ptr->key, strlen ("ds[")) != 0) + continue; + + keylen = strlen (ptr->key); + if (keylen < strlen ("ds[?].index")) + continue; + + dslen = keylen - strlen ("ds[].index"); + assert (dslen >= 1); + + if (strcmp ("].index", ptr->key + (strlen ("ds[") + dslen)) != 0) + continue; + + ds = malloc (dslen + 1); + if (ds == NULL) + continue; + + memcpy (ds, ptr->key + strlen ("ds["), dslen); + ds[dslen] = 0; + + tmp = realloc (dses, sizeof (*dses) * (dses_num + 1)); + if (tmp == NULL) + { + free (ds); + continue; + } + dses = tmp; + + dses[dses_num] = ds; + dses_num++; + } + + rrd_info_free (info); + + if (dses_num < 1) + { + assert (dses == NULL); + return (ENOENT); + } + + *ret_dses_num = dses_num; + *ret_dses = dses; + return (0); +} /* }}} int ds_list_from_rrd_file */ /* vim: set sw=2 sts=2 et fdm=marker : */