prepare for the release of rrdtool-1.2.16
[rrdtool.git] / src / rrd_resize.c
index ddbf9ec..4931b47 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.1.x  Copyright Tobias Oetiker, 1997 - 2002
+ * RRDtool 1.2.16  Copyright by Tobi Oetiker, 1997-2006
  *****************************************************************************
  * rrd_resize.c Alters size of an RRA
  *****************************************************************************
 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")) {
@@ -69,7 +70,7 @@ rrd_resize(int argc, char **argv)
     }
 
     if (modify < 0)
-       if (rrdold.rra_def[target_rra].row_cnt <= -modify) {
+       if ((long)rrdold.rra_def[target_rra].row_cnt <= -modify) {
            rrd_set_error("This RRA is not that big");
            rrd_free(&rrdold);
            fclose(infile);
@@ -84,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);
@@ -145,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--;
@@ -170,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;