prep for 1.2rc4 release
[rrdtool.git] / src / rrd_create.c
index e9dc2aa..d571ea7 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.1.x  Copyright Tobias Oetiker, 1997 - 2002
+ * RRDtool 1.2rc4  Copyright by Tobi Oetiker, 1997-2005
  *****************************************************************************
  * rrd_create.c  creates new rrds
  *****************************************************************************/
@@ -19,7 +19,7 @@ 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;
@@ -103,19 +103,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 */
@@ -170,8 +171,6 @@ rrd_create_r(char *filename,
                 break;
             case DST_CDEF:
                 parseCDEF_DS(&argv[i][offset+3],&rrd, rrd.stat_head->ds_cnt);
-                /* need to mark the file w/ current version */
-                strcpy(rrd.stat_head->version,RRD_VERSION);
                 break;
             default:
                 rrd_set_error("invalid DS type specified");
@@ -213,8 +212,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 w/ current version */
-                        strcpy(rrd.stat_head->version,RRD_VERSION);
                         break;
                     case CF_DEVSEASONAL:
                     case CF_SEASONAL:
@@ -393,6 +390,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;
                 }
@@ -532,7 +530,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));
@@ -637,17 +636,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)){