X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_create.c;h=0d0671fc0dd578d856af77c84a584eba2fb43910;hp=ffa2a872cbc48a58477d37b95779e2f987c7e284;hb=8ef6cdbdd680e4269a164cd885ec14a161fa3f57;hpb=c112f7c06e534ce7a5a4e25b6f7f742aeb051850 diff --git a/src/rrd_create.c b/src/rrd_create.c index ffa2a87..0d0671f 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.2rc3 Copyright by Tobi Oetiker, 1997-2005 + * RRDtool 1.2.6 Copyright by Tobi Oetiker, 1997-2005 ***************************************************************************** * rrd_create.c creates new rrds *****************************************************************************/ @@ -23,6 +23,7 @@ rrd_create(int argc, char **argv) char *parsetime_error = NULL; long long_tmp; int rc; + optind = 0; opterr = 0; /* initialize getopt */ while (1){ static struct option long_options[] = @@ -94,7 +95,7 @@ rrd_create_r(char *filename, rrd_t rrd; long i; int offset; - char *token; + char *token,dummychar1,dummychar2; unsigned short token_idx, error_flag, period=0; unsigned long hashed_name; @@ -145,19 +146,31 @@ rrd_create_r(char *filename, } memset(&rrd.ds_def[rrd.stat_head->ds_cnt], 0, sizeof(ds_def_t)); /* extract the name and type */ - if (sscanf(&argv[i][3], - DS_NAM_FMT ":" DST_FMT ":%n", - rrd.ds_def[rrd.stat_head->ds_cnt].ds_nam, - rrd.ds_def[rrd.stat_head->ds_cnt].dst,&offset) == 2) - { - /* check for duplicate datasource names */ - for(ii=0;iids_cnt;ii++) - if(strcmp(rrd.ds_def[rrd.stat_head->ds_cnt].ds_nam, - rrd.ds_def[ii].ds_nam) == 0){ - rrd_set_error("Duplicate DS name: %s",rrd.ds_def[ii].ds_nam); - } - } else { - rrd_set_error("invalid DS format"); + switch (sscanf(&argv[i][3], + DS_NAM_FMT "%1[:]" DST_FMT "%1[:]%n", + rrd.ds_def[rrd.stat_head->ds_cnt].ds_nam, + &dummychar1, + rrd.ds_def[rrd.stat_head->ds_cnt].dst, + &dummychar2, + &offset)) { + case 0: + case 1: rrd_set_error("Invalid DS name"); break; + case 2: + case 3: rrd_set_error("Invalid DS type"); break; + case 4: /* (%n may or may not be counted) */ + case 5: /* check for duplicate datasource names */ + for (ii=0;iids_cnt;ii++) + if(strcmp(rrd.ds_def[rrd.stat_head->ds_cnt].ds_nam, + rrd.ds_def[ii].ds_nam) == 0) + rrd_set_error("Duplicate DS name: %s", + rrd.ds_def[ii].ds_nam); + /* DS_type may be valid or not. Checked later */ + break; + default: rrd_set_error("invalid DS format"); + } + if (rrd_test_error()) { + rrd_free(&rrd); + return -1; } /* parse the remainder of the arguments */ @@ -182,7 +195,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, @@ -193,8 +207,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) { @@ -369,12 +384,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,