X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_create.c;h=2134db78963d5002496fbc564cb69b44da9daa52;hb=5a7eb5b62b485b61ddb80a40ef22f4337cf2289f;hp=8aa46a7b8e0446e0b86c26ef879294516908aa3b;hpb=298b318acaf1147474ab9e97cac37c3608660efd;p=rrdtool.git diff --git a/src/rrd_create.c b/src/rrd_create.c index 8aa46a7..2134db7 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.1.x Copyright Tobias Oetiker, 1997 - 2002 + * RRDtool 1.2.5 Copyright by Tobi Oetiker, 1997-2005 ***************************************************************************** * rrd_create.c creates new rrds *****************************************************************************/ @@ -19,10 +19,11 @@ rrd_create(int argc, char **argv) { time_t last_up = time(NULL)-10; unsigned long pdp_step = 300; - struct time_value last_up_tv; + struct rrd_time_value last_up_tv; char *parsetime_error = NULL; long long_tmp; int rc; + optind = 0; opterr = 0; /* initialize getopt */ while (1){ static struct option long_options[] = @@ -103,19 +104,20 @@ rrd_create_r(char *filename, /* static header */ if((rrd.stat_head = calloc(1,sizeof(stat_head_t)))==NULL){ rrd_set_error("allocating rrd.stat_head"); + rrd_free(&rrd); return(-1); } /* live header */ if((rrd.live_head = calloc(1,sizeof(live_head_t)))==NULL){ rrd_set_error("allocating rrd.live_head"); + rrd_free(&rrd); 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"); + strcpy(rrd.stat_head->version,RRD_VERSION); 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 */ @@ -181,7 +183,8 @@ rrd_create_r(char *filename, return -1; } rrd.stat_head -> ds_cnt++; - } else if (strncmp(argv[i],"RRA:",3)==0){ + } else if (strncmp(argv[i],"RRA:",4)==0){ + char *argvcopy; char *tokptr; size_t old_size = sizeof(rra_def_t)*(rrd.stat_head->rra_cnt); if((rrd.rra_def = rrd_realloc(rrd.rra_def, @@ -192,8 +195,9 @@ rrd_create_r(char *filename, return(-1); } memset(&rrd.rra_def[rrd.stat_head->rra_cnt], 0, sizeof(rra_def_t)); - - token = strtok_r(&argv[i][4],":", &tokptr); + + argvcopy = strdup(argv[i]); + token = strtok_r(&argvcopy[4],":", &tokptr); token_idx = error_flag = 0; while (token != NULL) { @@ -211,8 +215,6 @@ rrd_create_r(char *filename, rrd.rra_def[rrd.stat_head->rra_cnt].par[RRA_hw_beta].u_val = 1.0/288; rrd.rra_def[rrd.stat_head->rra_cnt].par[RRA_dependent_rra_idx].u_cnt = rrd.stat_head -> rra_cnt; - /* need to mark the file version */ - strcpy(rrd.stat_head->version,RRD_VERSION); break; case CF_DEVSEASONAL: case CF_SEASONAL: @@ -370,12 +372,14 @@ rrd_create_r(char *filename, if (rrd_test_error()) { /* all errors are unrecoverable */ + free(argvcopy); rrd_free(&rrd); return (-1); } token = strtok_r(NULL,":", &tokptr); token_idx++; } /* end while */ + free(argvcopy); #ifdef DEBUG fprintf(stderr,"Creating RRA CF: %s, dep idx %lu, current idx %lu\n", rrd.rra_def[rrd.stat_head->rra_cnt].cf_nam, @@ -391,6 +395,7 @@ rrd_create_r(char *filename, fprintf(stderr,"Creating HW contingent RRAs\n"); #endif if (create_hw_contingent_rras(&rrd,period,hashed_name) == -1) { + rrd_set_error("creating contingent RRA"); rrd_free(&rrd); return -1; } @@ -530,7 +535,8 @@ rrd_create_fn(char *file_name, rrd_t *rrd) { unsigned long i,ii; FILE *rrd_file; - rrd_value_t unknown = DNAN ; + rrd_value_t *unknown; + int unkn_cnt; if ((rrd_file = fopen(file_name,"wb")) == NULL ) { rrd_set_error("creating '%s': %s",file_name, rrd_strerror(errno)); @@ -635,17 +641,24 @@ rrd_create_fn(char *file_name, rrd_t *rrd) } /* write the empty data area */ - for(i=0; - i < rrd->stat_head->rra_cnt; - i++) - { - for(ii=0; - ii < rrd->rra_def[i].row_cnt - * rrd->stat_head->ds_cnt; - ii++){ - fwrite(&unknown,sizeof(rrd_value_t),1,rrd_file); - } + if ((unknown = (rrd_value_t *)malloc(512 * sizeof(rrd_value_t))) == NULL) { + rrd_set_error("allocating unknown"); + rrd_free(rrd); + fclose(rrd_file); + return(-1); } + for (i = 0; i < 512; ++i) + unknown[i] = DNAN; + + unkn_cnt = 0; + for (i = 0; i < rrd->stat_head->rra_cnt; i++) + unkn_cnt += rrd->stat_head->ds_cnt * rrd->rra_def[i].row_cnt; + + while (unkn_cnt > 0) { + fwrite(unknown, sizeof(rrd_value_t), min(unkn_cnt, 512), rrd_file); + unkn_cnt -= 512; + } + free(unknown); /* lets see if we had an error */ if(ferror(rrd_file)){