Code

Imported upstream version 1.4.8
[pkg-rrdtool.git] / src / rrd_create.c
index 9a971cc4777560024b65558f916188b296df579c..ff943f5a81e4f9ecbea721bf35a74d407b475299 100644 (file)
@@ -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
  *****************************************************************************/
 #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 <process.h>
@@ -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;