X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Frrd_create.c;h=ff943f5a81e4f9ecbea721bf35a74d407b475299;hb=d9822df7ed5e8122cf3a62e4e99678e94007f504;hp=9a971cc4777560024b65558f916188b296df579c;hpb=91b2f1022a195d008d818f283690ef63a00fd79c;p=pkg-rrdtool.git diff --git a/src/rrd_create.c b/src/rrd_create.c index 9a971cc..ff943f5 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009 + * RRDtool 1.4.8 Copyright by Tobi Oetiker, 1997-2013 ***************************************************************************** * rrd_create.c creates new rrds *****************************************************************************/ @@ -11,8 +11,11 @@ #include "rrd_tool.h" #include "rrd_rpncalc.h" #include "rrd_hw.h" +#include "rrd_client.h" +#include "../rrd_config.h" #include "rrd_is_thread_safe.h" +static int opt_no_overwrite = 0; #ifdef WIN32 # include @@ -39,6 +42,7 @@ int rrd_create( struct option long_options[] = { {"start", required_argument, 0, 'b'}, {"step", required_argument, 0, 's'}, + {"no-overwrite", no_argument, 0, 'O'}, {0, 0, 0, 0} }; int option_index = 0; @@ -54,7 +58,7 @@ int rrd_create( opterr = 0; /* initialize getopt */ while (1) { - opt = getopt_long(argc, argv, "b:s:", long_options, &option_index); + opt = getopt_long(argc, argv, "Ob:s:", long_options, &option_index); if (opt == EOF) break; @@ -90,6 +94,10 @@ int rrd_create( pdp_step = long_tmp; break; + case 'O': + opt_no_overwrite = 1; + break; + case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt); @@ -232,9 +240,10 @@ int rrd_create_r( } else if (strncmp(argv[i], "RRA:", 4) == 0) { char *argvcopy; char *tokptr = ""; + int cf_id = -1; size_t old_size = sizeof(rra_def_t) * (rrd.stat_head->rra_cnt); int row_cnt; - + int token_min = 4; if ((rrd.rra_def = (rra_def_t*)rrd_realloc(rrd.rra_def, old_size + sizeof(rra_def_t))) == NULL) { @@ -248,6 +257,7 @@ int rrd_create_r( argvcopy = strdup(argv[i]); token = strtok_r(&argvcopy[4], ":", &tokptr); token_idx = error_flag = 0; + while (token != NULL) { switch (token_idx) { case 0: @@ -255,11 +265,12 @@ int rrd_create_r( rrd.rra_def[rrd.stat_head->rra_cnt].cf_nam) != 1) rrd_set_error("Failed to parse CF name"); - switch (cf_conv - (rrd.rra_def[rrd.stat_head->rra_cnt].cf_nam)) { + cf_id = cf_conv(rrd.rra_def[rrd.stat_head->rra_cnt].cf_nam); + switch (cf_id) { case CF_MHWPREDICT: strcpy(rrd.stat_head->version, RRD_VERSION); /* MHWPREDICT causes Version 4 */ case CF_HWPREDICT: + token_min = 5; /* initialize some parameters */ rrd.rra_def[rrd.stat_head->rra_cnt].par[RRA_hw_alpha]. u_val = 0.1; @@ -270,7 +281,11 @@ int rrd_create_r( rrd.stat_head->rra_cnt; break; case CF_DEVSEASONAL: + token_min = 3; case CF_SEASONAL: + if (cf_id == CF_SEASONAL){ + token_min = 4; + } /* initialize some parameters */ rrd.rra_def[rrd.stat_head->rra_cnt]. par[RRA_seasonal_gamma].u_val = 0.1; @@ -278,10 +293,14 @@ int rrd_create_r( par[RRA_seasonal_smoothing_window].u_val = 0.05; /* fall through */ case CF_DEVPREDICT: + if (cf_id == CF_DEVPREDICT){ + token_min = 3; + } rrd.rra_def[rrd.stat_head->rra_cnt]. par[RRA_dependent_rra_idx].u_cnt = -1; break; case CF_FAILURES: + token_min = 5; rrd.rra_def[rrd.stat_head->rra_cnt]. par[RRA_delta_pos].u_val = 2.0; rrd.rra_def[rrd.stat_head->rra_cnt]. @@ -424,6 +443,12 @@ int rrd_create_r( row_cnt = atoi(token); if (row_cnt <= 0) rrd_set_error("Invalid row count: %i", row_cnt); +#if SIZEOF_TIME_T == 4 + if ((long long) pdp_step * rrd.rra_def[rrd.stat_head->rra_cnt].pdp_cnt * row_cnt > 4294967296){ + /* database timespan > 2**32, would overflow time_t */ + rrd_set_error("The time spanned by the database is too large: must be <= 4294967296 seconds"); + } +#endif rrd.rra_def[rrd.stat_head->rra_cnt].row_cnt = row_cnt; break; } @@ -503,6 +528,11 @@ int rrd_create_r( token_idx++; } /* end while */ free(argvcopy); + if (token_idx < token_min){ + rrd_set_error("Expected at least %i arguments for RRA but got %i",token_min,token_idx); + rrd_free2(&rrd); + return(-1); + } #ifdef DEBUG fprintf(stderr, "Creating RRA CF: %s, dep idx %lu, current idx %lu\n", @@ -565,7 +595,8 @@ void parseGENERIC_DS( &(rrd -> ds_def[ds_idx].par[DS_mrhb_cnt].u_cnt), minstr,maxstr); */ - old_locale = setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, NULL); + setlocale(LC_NUMERIC, "C"); if (sscanf(def, "%lu:%18[^:]:%18[^:]", &(rrd->ds_def[ds_idx].par[DS_mrhb_cnt].u_cnt), minstr, maxstr) == 3) { @@ -679,6 +710,10 @@ int rrd_create_fn( rrd_t rrd_dn; unsigned rrd_flags = RRD_READWRITE | RRD_CREAT; + if (opt_no_overwrite) { + rrd_flags |= RRD_EXCL ; + } + 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;