diff --git a/src/rrd_create.c b/src/rrd_create.c
index 979926ff85ae55a7635ac7b95d03af17f6b2fdc1..8aa46a7b8e0446e0b86c26ef879294516908aa3b 100644 (file)
--- a/src/rrd_create.c
+++ b/src/rrd_create.c
/*****************************************************************************
- * RRDtool 1.0.33 Copyright Tobias Oetiker, 1997 - 2000
+ * RRDtool 1.1.x Copyright Tobias Oetiker, 1997 - 2002
*****************************************************************************
* rrd_create.c creates new rrds
*****************************************************************************/
#include "rrd_tool.h"
#include "rrd_rpncalc.h"
+#include "rrd_hw.h"
+
+#include "rrd_is_thread_safe.h"
unsigned long FnvHash(char *str);
int create_hw_contingent_rras(rrd_t *rrd, unsigned short period, unsigned long hashed_name);
void parseGENERIC_DS(char *def,rrd_t *rrd, int ds_idx);
-/* #define DEBUG */
int
rrd_create(int argc, char **argv)
{
- rrd_t rrd;
- long i,long_tmp;
- int offset;
- time_t last_up;
+ time_t last_up = time(NULL)-10;
+ unsigned long pdp_step = 300;
struct time_value last_up_tv;
char *parsetime_error = NULL;
- char *token;
- unsigned short token_idx, error_flag, period=0;
- unsigned long hashed_name;
- /* init last_up */
- last_up = time(NULL)-10;
- /* init rrd clean */
- rrd_init(&rrd);
- /* static header */
- if((rrd.stat_head = calloc(1,sizeof(stat_head_t)))==NULL){
- rrd_set_error("allocating rrd.stat_head");
- return(-1);
- }
-
- /* live header */
- if((rrd.live_head = calloc(1,sizeof(live_head_t)))==NULL){
- rrd_set_error("allocating rrd.live_head");
- return(-1);
- }
+ long long_tmp;
+ int rc;
- /* set some defaults */
- strcpy(rrd.stat_head->cookie,RRD_COOKIE);
- /* assume the will be version 1 compatible */
- strcpy(rrd.stat_head->version,"0001");
- rrd.stat_head->float_cookie = FLOAT_COOKIE;
- rrd.stat_head->ds_cnt = 0; /* this will be adjusted later */
- rrd.stat_head->rra_cnt = 0; /* ditto */
- rrd.stat_head->pdp_step = 300; /* 5 minute default */
-
- /* a default value */
- rrd.ds_def = NULL;
- rrd.rra_def = NULL;
-
while (1){
static struct option long_options[] =
{
long_options, &option_index);
if (opt == EOF)
- break;
+ break;
switch(opt) {
case 'b':
if ((parsetime_error = parsetime(optarg, &last_up_tv))) {
rrd_set_error("start time: %s", parsetime_error );
- rrd_free(&rrd);
return(-1);
}
if (last_up_tv.type == RELATIVE_TO_END_TIME ||
last_up_tv.type == RELATIVE_TO_START_TIME) {
rrd_set_error("specifying time relative to the 'start' "
"or 'end' makes no sense here");
- rrd_free(&rrd);
return(-1);
}
if (last_up < 3600*24*365*10){
rrd_set_error("the first entry to the RRD should be after 1980");
- rrd_free(&rrd);
return(-1);
}
break;
long_tmp = atol(optarg);
if (long_tmp < 1){
rrd_set_error("step size should be no less than one second");
- rrd_free(&rrd);
return(-1);
}
- rrd.stat_head->pdp_step = long_tmp;
+ pdp_step = long_tmp;
break;
case '?':
rrd_set_error("unknown option '%c'", optopt);
else
rrd_set_error("unknown option '%s'",argv[optind-1]);
- rrd_free(&rrd);
return(-1);
}
}
+
+ rc = rrd_create_r(argv[optind],
+ pdp_step, last_up,
+ argc - optind - 1, argv + optind + 1);
+
+ return rc;
+}
+
+/* #define DEBUG */
+int
+rrd_create_r(char *filename,
+ unsigned long pdp_step, time_t last_up,
+ int argc, char **argv)
+{
+ rrd_t rrd;
+ long i;
+ int offset;
+ char *token;
+ unsigned short token_idx, error_flag, period=0;
+ unsigned long hashed_name;
+
+ /* init rrd clean */
+ rrd_init(&rrd);
+ /* static header */
+ if((rrd.stat_head = calloc(1,sizeof(stat_head_t)))==NULL){
+ rrd_set_error("allocating rrd.stat_head");
+ return(-1);
+ }
+
+ /* live header */
+ if((rrd.live_head = calloc(1,sizeof(live_head_t)))==NULL){
+ rrd_set_error("allocating rrd.live_head");
+ return(-1);
+ }
+
+ /* set some defaults */
+ strcpy(rrd.stat_head->cookie,RRD_COOKIE);
+ /* assume the will be version 1 compatible */
+ strcpy(rrd.stat_head->version,"0001");
+ rrd.stat_head->float_cookie = FLOAT_COOKIE;
+ rrd.stat_head->ds_cnt = 0; /* this will be adjusted later */
+ rrd.stat_head->rra_cnt = 0; /* ditto */
+ rrd.stat_head->pdp_step = pdp_step; /* 5 minute default */
+
+ /* a default value */
+ rrd.ds_def = NULL;
+ rrd.rra_def = NULL;
+
rrd.live_head->last_up = last_up;
/* optind points to the first non-option command line arg,
* in this case, the file name. */
/* Compute the FNV hash value (used by SEASONAL and DEVSEASONAL
* arrays. */
- hashed_name = FnvHash(argv[optind]);
- for(i=optind+1;i<argc;i++){
- int ii;
+ hashed_name = FnvHash(filename);
+ for(i=0;i<argc;i++){
+ unsigned int ii;
if (strncmp(argv[i],"DS:",3)==0){
size_t old_size = sizeof(ds_def_t)*(rrd.stat_head->ds_cnt);
if((rrd.ds_def = rrd_realloc(rrd.ds_def,
}
rrd.stat_head -> ds_cnt++;
} else if (strncmp(argv[i],"RRA:",3)==0){
+ char *tokptr;
size_t old_size = sizeof(rra_def_t)*(rrd.stat_head->rra_cnt);
if((rrd.rra_def = rrd_realloc(rrd.rra_def,
old_size+sizeof(rra_def_t)))==NULL)
}
memset(&rrd.rra_def[rrd.stat_head->rra_cnt], 0, sizeof(rra_def_t));
- token = strtok(&argv[i][4],":");
+ token = strtok_r(&argv[i][4],":", &tokptr);
token_idx = error_flag = 0;
while (token != NULL)
{
rrd_free(&rrd);
return (-1);
}
- token = strtok(NULL,":");
+ token = strtok_r(NULL,":", &tokptr);
token_idx++;
} /* end while */
#ifdef DEBUG
rrd_free(&rrd);
return(-1);
}
- return rrd_create_fn(argv[optind],&rrd);
+ return rrd_create_fn(filename, &rrd);
}
void parseGENERIC_DS(char *def,rrd_t *rrd, int ds_idx)
rrd_value_t unknown = DNAN ;
if ((rrd_file = fopen(file_name,"wb")) == NULL ) {
- rrd_set_error("creating '%s': %s",file_name,strerror(errno));
+ rrd_set_error("creating '%s': %s",file_name, rrd_strerror(errno));
free(rrd->stat_head);
free(rrd->ds_def);
free(rrd->rra_def);
switch (cf_conv(rrd->rra_def[i].cf_nam))
{
case CF_HWPREDICT:
- rrd->cdp_prep->scratch[CDP_hw_intercept].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_hw_last_intercept].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_hw_slope].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_hw_last_slope].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_null_count].u_cnt = 1;
- rrd->cdp_prep->scratch[CDP_last_null_count].u_cnt = 1;
+ init_hwpredict_cdp(rrd->cdp_prep);
break;
case CF_SEASONAL:
case CF_DEVSEASONAL:
- rrd->cdp_prep->scratch[CDP_hw_seasonal].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_hw_last_seasonal].u_val = DNAN;
- rrd->cdp_prep->scratch[CDP_init_seasonal].u_cnt = 1;
+ init_seasonal_cdp(rrd->cdp_prep);
break;
case CF_FAILURES:
/* initialize violation history to 0 */