diff --git a/src/utils_rrdcreate.c b/src/utils_rrdcreate.c
index 99feda257f5533c20523728e9f46058ea38d9897..c4e9d8ba9bdeb30778fcba3cecd98b4a63335e25 100644 (file)
--- a/src/utils_rrdcreate.c
+++ b/src/utils_rrdcreate.c
#include "common.h"
#include "utils_rrdcreate.h"
+#include <pthread.h>
#include <rrd.h>
/*
};
static int rra_types_num = STATIC_ARRAY_SIZE (rra_types);
+#if !defined(HAVE_THREADSAFE_LIBRRD) || !HAVE_THREADSAFE_LIBRRD
+static pthread_mutex_t librrd_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
/*
* Private functions
*/
for (j = 0; j < rra_types_num; j++)
{
+ int status;
+
if (rra_num >= rra_max)
break;
- if (ssnprintf (buffer, sizeof (buffer), "RRA:%s:%3.1f:%u:%u",
- rra_types[j], cfg->xff,
- cdp_len, cdp_num) >= sizeof (buffer))
+ status = ssnprintf (buffer, sizeof (buffer), "RRA:%s:%3.1f:%u:%u",
+ rra_types[j], cfg->xff, cdp_len, cdp_num);
+
+ if ((status < 0) || ((size_t) status >= sizeof (buffer)))
{
ERROR ("rra_get: Buffer would have been truncated.");
continue;
d->name, type,
(cfg->heartbeat > 0) ? cfg->heartbeat : (2 * vl->interval),
min, max);
- if ((status < 1) || (status >= sizeof (buffer)))
+ if ((status < 1) || ((size_t) status >= sizeof (buffer)))
break;
ds_def[ds_num] = sstrdup (buffer);
int argc, const char **argv)
{
int status;
+ char *filename_copy;
+
+ if ((filename == NULL) || (argv == NULL))
+ return (-EINVAL);
+
+ /* Some versions of librrd don't have the `const' qualifier for the first
+ * argument, so we have to copy the pointer here to avoid warnings. It sucks,
+ * but what else can we do? :( -octo */
+ filename_copy = strdup (filename);
+ if (filename_copy == NULL)
+ {
+ ERROR ("srrd_create: strdup failed.");
+ return (-ENOMEM);
+ }
optind = 0; /* bug in librrd? */
rrd_clear_error ();
- status = rrd_create_r (filename, pdp_step, last_up, argc, (void *) argv);
+ status = rrd_create_r (filename_copy, pdp_step, last_up,
+ argc, (void *) argv);
if (status != 0)
{
filename, rrd_get_error ());
}
+ sfree (filename_copy);
+
return (status);
} /* }}} int srrd_create */
/* #endif HAVE_THREADSAFE_LIBRRD */
ssnprintf (last_up_str, sizeof (last_up_str), "%u", (unsigned int) last_up);
new_argv[0] = "create";
- new_argv[1] = filename;
+ new_argv[1] = (void *) filename;
new_argv[2] = "-s";
new_argv[3] = pdp_step_str;
new_argv[4] = "-b";