diff --git a/src/damon.c b/src/damon.c index 4efd239..385c927 100644 --- a/src/damon.c +++ b/src/damon.c @@ -55,6 +55,7 @@ typedef struct _Host struct _DaMon { char const * prefix; + char const * rrdcached; unsigned int refresh; Host * hosts; unsigned int hosts_cnt; @@ -161,7 +162,7 @@ int damon_update(DaMon * damon, RRDType type, char const * filename, == NULL) return -1; va_start(args, args_cnt); - ret = rrd_updatev(type, path, args_cnt, args); + ret = rrd_updatev(type, damon->rrdcached, path, args_cnt, args); va_end(args); string_delete(path); return ret; @@ -203,6 +204,7 @@ static int _init_config(DaMon * damon, char const * filename) if((config = config_new()) == NULL) return 1; damon->prefix = NULL; + damon->rrdcached = NULL; damon->refresh = DAMON_DEFAULT_REFRESH; damon->hosts = NULL; damon->hosts_cnt = 0; @@ -221,6 +223,13 @@ static int _init_config(DaMon * damon, char const * filename) config_delete(config); return -1; } + if((p = config_get(config, "", "rrdcached")) != NULL + && (damon->rrdcached = strdup(p)) == NULL) + { + free(damon->prefix); + config_delete(config); + return -1; + } if((p = config_get(config, "", "refresh")) != NULL) { tmp = strtol(p, &q, 10); @@ -353,5 +362,6 @@ static void _damon_destroy(DaMon * damon) } event_delete(damon->event); free(damon->hosts); + free(damon->rrdcached); free(damon->prefix); } diff --git a/src/rrd.c b/src/rrd.c index b358b1f..ce3484b 100644 --- a/src/rrd.c +++ b/src/rrd.c @@ -63,7 +63,7 @@ static char * _rrd_timestamp(off_t offset); /* rrd_create */ static int _create_directories(char const * filename); -int rrd_create(RRDType type, char const * filename) +int rrd_create(RRDType type, char const * rrdcached, char const * filename) { int ret; char * argv[16] = { RRDTOOL, "create", NULL, "--start", NULL, NULL }; @@ -167,27 +167,30 @@ static int _create_directories(char const * filename) /* rrd_update */ -int rrd_update(RRDType type, char const * filename, int args_cnt, ...) +int rrd_update(RRDType type, char const * rrdcached, char const * filename, int + args_cnt, ...) { int ret; va_list args; va_start(args, args_cnt); - ret = rrd_updatev(type, filename, args_cnt, args); + ret = rrd_updatev(type, rrdcached, filename, args_cnt, args); va_end(args); return ret; } /* rrd_updatev */ -int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args) +int rrd_updatev(RRDType type, char const * rrdcached, char const * filename, + int args_cnt, va_list args) { struct stat st; - char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL }; + char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL, NULL, NULL }; + size_t i = 3; struct timeval tv; size_t s; int pos; - int i; + int arg; int ret; #ifdef DEBUG @@ -198,7 +201,7 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args) { if(errno != ENOENT) return _rrd_perror(filename, -errno); - if(rrd_create(type, filename) != 0) + if(rrd_create(type, rrdcached, filename) != 0) return -1; } /* prepare the parameters */ @@ -206,19 +209,32 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args) return _rrd_perror("gettimeofday", -errno); if((argv[2] = string_new(filename)) == NULL) return 1; - s = (args_cnt + 1) * 12; - if((argv[3] = malloc(s)) == NULL) + if(rrdcached != NULL) { + argv[i++] = "--daemon"; + if((argv[i++] = string_new(rrdcached)) == NULL) + { + string_delete(argv[2]); + return 1; + } + } + s = (args_cnt + 1) * 12; + if((argv[i] = malloc(s)) == NULL) + { + if(rrdcached != NULL) + string_delete(argv[4]); string_delete(argv[2]); return _rrd_perror(NULL, -errno); } - pos = snprintf(argv[3], s, "%ld", tv.tv_sec); - for(i = 0; i < args_cnt; i++) - pos += snprintf(&argv[3][pos], s - pos, ":%"PRIu64, + pos = snprintf(argv[i], s, "%ld", tv.tv_sec); + for(arg = 0; arg < args_cnt; arg++) + pos += snprintf(&argv[i][pos], s - pos, ":%"PRIu64, va_arg(args, uint64_t)); /* update the database */ ret = _rrd_exec(argv); - free(argv[3]); + free(argv[i]); + if(rrdcached != NULL) + string_delete(argv[4]); string_delete(argv[2]); return ret; } diff --git a/src/rrd.h b/src/rrd.h index bdb397c..bff4d3f 100644 --- a/src/rrd.h +++ b/src/rrd.h @@ -35,10 +35,11 @@ typedef enum _RRDType /* functions */ -int rrd_create(RRDType type, char const * filename); +int rrd_create(RRDType type, char const * rrdcached, char const * filename); -int rrd_update(RRDType type, char const * filename, int args_cnt, ...); -int rrd_updatev(RRDType type, char const * filename, +int rrd_update(RRDType type, char const * rrdcached, char const * filename, + int args_cnt, ...); +int rrd_updatev(RRDType type, char const * rrdcached, char const * filename, int args_cnt, va_list args); #endif /* !DAMON_RRD_H */