-
- while (1){
- static struct option long_options[] =
- {
- {"heartbeat", required_argument, 0, 'h'},
- {"minimum", required_argument, 0, 'i'},
- {"maximum", required_argument, 0, 'a'},
- {"data-source-type", required_argument, 0, 'd'},
- {"data-source-rename", required_argument, 0, 'r'},
- {0,0,0,0}
- };
- int option_index = 0;
- int opt;
- opt = getopt_long(argc, argv, "h:i:a:d:r:",
- long_options, &option_index);
- if (opt == EOF)
- break;
-
- optcnt++;
- switch(opt) {
- case 'h':
- if ((matches = sscanf(optarg, DS_NAM_FMT ":%ld",ds_nam,&heartbeat)) != 2){
- rrd_set_error("invalid arguments for heartbeat");
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if ((ds=ds_match(&rrd,ds_nam))==-1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- rrd.ds_def[ds].par[DS_mrhb_cnt].u_cnt = heartbeat;
- break;
-
- case 'i':
- if ((matches = sscanf(optarg,DS_NAM_FMT ":%lf",ds_nam,&min)) <1){
- rrd_set_error("invalid arguments for minimum ds value");
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if ((ds=ds_match(&rrd,ds_nam))==-1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
-
- if(matches == 1)
- min= DNAN;
- rrd.ds_def[ds].par[DS_min_val].u_val = min;
- break;
-
- case 'a':
- if ((matches = sscanf(optarg, DS_NAM_FMT ":%lf",ds_nam,&max)) <1){
- rrd_set_error("invalid arguments for maximum ds value");
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if ((ds=ds_match(&rrd,ds_nam))==-1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if(matches == 1)
- max= DNAN;
- rrd.ds_def[ds].par[DS_max_val].u_val = max;
- break;
-
- case 'd':
- if ((matches = sscanf(optarg, DS_NAM_FMT ":" DST_FMT ,ds_nam,dst)) != 2){
- rrd_set_error("invalid arguments for data source type");
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if ((ds=ds_match(&rrd,ds_nam))==-1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if (dst_conv(dst) == -1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- strncpy(rrd.ds_def[ds].dst,dst,DST_SIZE-1);
- rrd.ds_def[ds].dst[DST_SIZE-1]='\0';
-
- rrd.pdp_prep[ds].last_ds[0] = 'U';
- rrd.pdp_prep[ds].last_ds[1] = 'N';
- rrd.pdp_prep[ds].last_ds[2] = 'K';
- rrd.pdp_prep[ds].last_ds[3] = 'N';
- rrd.pdp_prep[ds].last_ds[4] = '\0';
-
- break;
- case 'r':
- if ((matches =
- sscanf(optarg,DS_NAM_FMT ":" DS_NAM_FMT , ds_nam,ds_new)) != 2){
- rrd_set_error("invalid arguments for data source type");
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- if ((ds=ds_match(&rrd,ds_nam))==-1){
- rrd_free(&rrd);
- fclose(rrd_file);
- return -1;
- }
- strncpy(rrd.ds_def[ds].ds_nam,ds_new,DS_NAM_SIZE-1);
- rrd.ds_def[ds].ds_nam[DS_NAM_SIZE-1]='\0';
- break;
- case '?':
+ while (1) {
+ int option_index = 0;
+ int opt;
+ char *old_locale = "";
+
+ opt = getopt_long(argc, argv, "h:i:a:d:r:p:n:w:f:x:y:z:v:b:",
+ long_options, &option_index);
+ if (opt == EOF)
+ break;
+
+ optcnt++;
+ switch (opt) {
+ case 'h':
+ old_locale = setlocale(LC_NUMERIC, "C");
+ if ((matches =
+ sscanf(optarg, DS_NAM_FMT ":%ld", ds_nam,
+ &heartbeat)) != 2) {
+ rrd_set_error("invalid arguments for heartbeat");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
+ return -1;
+ }
+ setlocale(LC_NUMERIC, old_locale);
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ rrd.ds_def[ds].par[DS_mrhb_cnt].u_cnt = heartbeat;
+ break;
+
+ case 'i':
+ old_locale = setlocale(LC_NUMERIC, "C");
+ if ((matches =
+ sscanf(optarg, DS_NAM_FMT ":%lf", ds_nam, &min)) < 1) {
+ rrd_set_error("invalid arguments for minimum ds value");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
+ return -1;
+ }
+ setlocale(LC_NUMERIC, old_locale);
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+
+ if (matches == 1)
+ min = DNAN;
+ rrd.ds_def[ds].par[DS_min_val].u_val = min;
+ break;
+
+ case 'a':
+ old_locale = setlocale(LC_NUMERIC, "C");
+ if ((matches =
+ sscanf(optarg, DS_NAM_FMT ":%lf", ds_nam, &max)) < 1) {
+ rrd_set_error("invalid arguments for maximum ds value");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ setlocale(LC_NUMERIC, old_locale);
+ return -1;
+ }
+ setlocale(LC_NUMERIC, old_locale);
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ if (matches == 1)
+ max = DNAN;
+ rrd.ds_def[ds].par[DS_max_val].u_val = max;
+ break;
+
+ case 'd':
+ if ((matches =
+ sscanf(optarg, DS_NAM_FMT ":" DST_FMT, ds_nam, dst)) != 2) {
+ rrd_set_error("invalid arguments for data source type");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ if ((int) dst_conv(dst) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ strncpy(rrd.ds_def[ds].dst, dst, DST_SIZE - 1);
+ rrd.ds_def[ds].dst[DST_SIZE - 1] = '\0';
+
+ rrd.pdp_prep[ds].last_ds[0] = 'U';
+ rrd.pdp_prep[ds].last_ds[1] = 'N';
+ rrd.pdp_prep[ds].last_ds[2] = 'K';
+ rrd.pdp_prep[ds].last_ds[3] = 'N';
+ rrd.pdp_prep[ds].last_ds[4] = '\0';
+
+ break;
+ case 'r':
+ if ((matches =
+ sscanf(optarg, DS_NAM_FMT ":" DS_NAM_FMT, ds_nam,
+ ds_new)) != 2) {
+ rrd_set_error("invalid arguments for data source type");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ strncpy(rrd.ds_def[ds].ds_nam, ds_new, DS_NAM_SIZE - 1);
+ rrd.ds_def[ds].ds_nam[DS_NAM_SIZE - 1] = '\0';
+ break;
+ case 'p':
+ if (set_deltaarg(&rrd, RRA_delta_pos, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'n':
+ if (set_deltaarg(&rrd, RRA_delta_neg, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'f':
+ if (set_windowarg(&rrd, RRA_failure_threshold, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'w':
+ if (set_windowarg(&rrd, RRA_window_len, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'x':
+ if (set_hwarg(&rrd, CF_HWPREDICT, RRA_hw_alpha, optarg)) {
+ if (set_hwarg(&rrd, CF_MHWPREDICT, RRA_hw_alpha, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ rrd_clear_error();
+ }
+ break;
+ case 'y':
+ if (set_hwarg(&rrd, CF_HWPREDICT, RRA_hw_beta, optarg)) {
+ if (set_hwarg(&rrd, CF_MHWPREDICT, RRA_hw_beta, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ rrd_clear_error();
+ }
+ break;
+ case 'z':
+ if (set_hwarg(&rrd, CF_SEASONAL, RRA_seasonal_gamma, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'v':
+ if (set_hwarg(&rrd, CF_DEVSEASONAL, RRA_seasonal_gamma, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'b':
+ if (sscanf(optarg, DS_NAM_FMT, ds_nam) != 1) {
+ rrd_set_error("invalid argument for aberrant-reset");
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ if ((ds = ds_match(&rrd, ds_nam)) == -1) {
+ /* ds_match handles it own errors */
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ reset_aberrant_coefficients(&rrd, rrd_file, (unsigned long) ds);
+ if (rrd_test_error()) {
+ rrd_free(&rrd);
+ rrd_close(rrd_file);
+ return -1;
+ }
+ break;
+ case 's':
+ strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */
+ if (set_hwarg
+ (&rrd, CF_SEASONAL, RRA_seasonal_smoothing_window, optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case 'S':
+ strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */
+ if (set_hwarg
+ (&rrd, CF_DEVSEASONAL, RRA_seasonal_smoothing_window,
+ optarg)) {
+ rrd_free(&rrd);
+ return -1;
+ }
+ break;
+ case '?':