X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdcached.c;h=e77be2dd29eddd6af3b2674e35a2ffec967a3cb5;hb=b6fbfb1b864be53e71d755fba59d633f5c30da7e;hp=7e0b1e77ef3b523f45eb3a188598a0ee3b8bae2a;hpb=d11c1f68458465f1c9dcfd0396704b7fba7d5804;p=collectd.git diff --git a/src/rrdcached.c b/src/rrdcached.c index 7e0b1e77..e77be2dd 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -114,52 +114,41 @@ static int value_list_to_string (char *buffer, int buffer_len, return (0); } /* int value_list_to_string */ -static int value_list_to_filename (char *buffer, int buffer_len, - const data_set_t *ds, const value_list_t *vl) +static int value_list_to_filename (char *buffer, size_t buffer_size, + value_list_t const *vl) { - int offset = 0; + char const suffix[] = ".rrd"; int status; - - assert (0 == strcmp (ds->type, vl->type)); + size_t len; if (datadir != NULL) { - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", datadir); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; - } + size_t datadir_len = strlen (datadir) + 1; - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->host); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + if (datadir_len >= buffer_size) + return (ENOMEM); - if (strlen (vl->plugin_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s/", vl->plugin, vl->plugin_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->plugin); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + sstrncpy (buffer, datadir, buffer_size); + buffer[datadir_len - 1] = '/'; + buffer[datadir_len] = 0; - if (strlen (vl->type_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s", vl->type, vl->type_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s", vl->type); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + buffer += datadir_len; + buffer_size -= datadir_len; + } + + status = FORMAT_VL (buffer, buffer_size, vl); + if (status != 0) + return (status); - strncpy (buffer + offset, ".rrd", buffer_len - offset); - buffer[buffer_len - 1] = 0; + len = strlen (buffer); + assert (len < buffer_size); + buffer += len; + buffer_size -= len; + + if (buffer_size <= sizeof (suffix)) + return (ENOMEM); + memcpy (buffer, suffix, sizeof (suffix)); return (0); } /* int value_list_to_filename */ @@ -434,7 +423,7 @@ static int rc_write (const data_set_t *ds, const value_list_t *vl, return (-1); } - if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0) + if (value_list_to_filename (filename, sizeof (filename), vl) != 0) { ERROR ("rrdcached plugin: value_list_to_filename failed."); return (-1);