X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_resize.c;h=36855b8de7f36424aa12db0b4da98f26e6cba27f;hb=fbe390e15d3484315efe5802577249c8959e3556;hp=3dbe058a483306db55f2d36a220c9cc324e3054c;hpb=5837606887a6d81e8b1f7588525cb1c8783fb62b;p=rrdtool.git diff --git a/src/rrd_resize.c b/src/rrd_resize.c index 3dbe058..36855b8 100644 --- a/src/rrd_resize.c +++ b/src/rrd_resize.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.0.33 Copyright Tobias Oetiker, 1997 - 2000 + * RRDtool 1.2.21 Copyright by Tobi Oetiker, 1997-2007 ***************************************************************************** * rrd_resize.c Alters size of an RRA ***************************************************************************** @@ -11,15 +11,16 @@ int rrd_resize(int argc, char **argv) { - char *infilename,outfilename[11]="resize.rrd"; - FILE *infile,*outfile; - rrd_t rrdold,rrdnew; - rrd_value_t buffer; - unsigned long l,rra; - long modify; - unsigned long target_rra; - int grow=0,shrink=0; - char *endptr; + char *infilename,outfilename[11]="resize.rrd"; + FILE *infile,*outfile; + rrd_t rrdold,rrdnew; + rrd_value_t buffer; + int version; + unsigned long l,rra; + long modify; + unsigned long target_rra; + int grow=0,shrink=0; + char *endptr; infilename=argv[1]; if (!strcmp(infilename,"resize.rrd")) { @@ -43,7 +44,7 @@ rrd_resize(int argc, char **argv) modify=strtol(argv[4],&endptr,0); if ((modify<1)) { - rrd_set_error("you must have at least one row in the RRA"); + rrd_set_error("Please grow or shrink with at least 1 row"); return(-1); } @@ -67,12 +68,14 @@ rrd_resize(int argc, char **argv) fclose(infile); return(-1); } - if ((rrdold.rra_def[target_rra].row_cnt+modify)<0) { - rrd_set_error("This RRA is not that big"); - rrd_free(&rrdold); - fclose(infile); - return(-1); - } + + if (modify < 0) + if ((long)rrdold.rra_def[target_rra].row_cnt <= -modify) { + rrd_set_error("This RRA is not that big"); + rrd_free(&rrdold); + fclose(infile); + return(-1); + } rrdnew.stat_head = rrdold.stat_head; rrdnew.ds_def = rrdold.ds_def; @@ -82,6 +85,19 @@ rrd_resize(int argc, char **argv) rrdnew.cdp_prep = rrdold.cdp_prep; rrdnew.rra_ptr = rrdold.rra_ptr; + version = atoi(rrdold.stat_head->version); + switch (version) { + case 3: break; + case 1: rrdold.stat_head->version[3]='3'; + break; + default: { + rrd_set_error("Do not know how to handle RRD version %s",rrdold.stat_head->version); + rrd_free(&rrdold); + fclose(infile); + return(-1); + } + } + if ((outfile=fopen(outfilename,"wb"))==NULL) { rrd_set_error("Can't create '%s'",outfilename); return(-1); @@ -102,7 +118,7 @@ rrd_resize(int argc, char **argv) fwrite(rrdnew.rra_ptr,sizeof(rra_ptr_t),rrdnew.stat_head->rra_cnt,outfile); /* Move the CDPs from the old to the new database. - ** This can be made (much) faster but isn't worth the efford. Clarity + ** This can be made (much) faster but isn't worth the effort. Clarity ** is much more important. */ @@ -143,7 +159,7 @@ rrd_resize(int argc, char **argv) signed long int remove_end=0; remove_end=(rrdnew.rra_ptr[target_rra].cur_row-modify)%rrdnew.rra_def[target_rra].row_cnt; - if (remove_end <= rrdnew.rra_ptr[target_rra].cur_row) { + if (remove_end <= (signed long int)rrdnew.rra_ptr[target_rra].cur_row) { while (remove_end >= 0) { fseek(infile,sizeof(rrd_value_t)*rrdnew.stat_head->ds_cnt,SEEK_CUR); rrdnew.rra_ptr[target_rra].cur_row--; @@ -168,8 +184,10 @@ rrd_resize(int argc, char **argv) } /* Move the rest of the CDPs */ - while (!(feof(infile))) { - fread(&buffer,sizeof(rrd_value_t),1,infile); + while (1) { + fread(&buffer,sizeof(rrd_value_t),1,infile); + if (feof(infile)) + break; fwrite(&buffer,sizeof(rrd_value_t),1,outfile); } rrdnew.rra_def[target_rra].row_cnt += modify;