Code

fix use of setlocale all over the place ...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Wed, 8 Sep 2010 12:15:13 +0000 (12:15 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Wed, 8 Sep 2010 12:15:13 +0000 (12:15 +0000)
-    old_locale = setlocale(LC_NUMERIC, "C");
+    old_locale = setlocale(LC_NUMERIC, NULL);
+    setlocale(LC_NUMERIC, "C");

the original version never restored the locale since it held a copy of the
new locale and not the old one despite the name. bug found by  Pawe? 'Reef' Polewicz

git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.3@2127 a5681a0c-68f1-0310-ab6d-d61299d08faa

program/src/rrd_create.c
program/src/rrd_dump.c
program/src/rrd_graph.c
program/src/rrd_rpncalc.c
program/src/rrd_tool.c
program/src/rrd_tune.c
program/src/rrd_update.c

index 4e98d53c40be069539ee45c19334f271362f631b..d9fd6fffa9652149f25a84dab892e8e36ae7af5f 100644 (file)
@@ -574,7 +574,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) {
index 226f5ecd19c9a035ddf2e6c36fabea24d6bedbdb..de037b87f6d2e8e2dfc98e471184942a4d0247f6 100644 (file)
@@ -90,7 +90,8 @@ int rrd_dump_opt_r(
         out_file = stdout;
     }
 #ifdef HAVE_SETLOCALE
-    old_locale = setlocale(LC_NUMERIC, "C");
+    old_locale = setlocale(LC_NUMERIC, NULL);
+    setlocale(LC_NUMERIC, "C");  
 #endif
     if (!opt_noheader) {
         fputs("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", out_file);
index 022ca27d8521cded9f12fe21a3e702fcb687afb4..dcc20241120b7bf70875e853bc04740869d68451 100644 (file)
@@ -3706,15 +3706,19 @@ rrd_info_t *rrd_graph_v(
     rrd_info_t *grinfo;
     rrd_graph_init(&im);
     /* a dummy surface so that we can measure text sizes for placements */
+     old_locale = setlocale(LC_NUMERIC, NULL);
+     setlocale(LC_NUMERIC, "C");
     
     rrd_graph_options(argc, argv, &im);
     if (rrd_test_error()) {
+        setlocale(LC_NUMERIC, old_locale); /* reenable locale */
         rrd_info_free(im.grinfo);
         im_free(&im);
         return NULL;
     }
 
     if (optind >= argc) {
+        setlocale(LC_NUMERIC, old_locale); /* reenable locale */
         rrd_info_free(im.grinfo);
         im_free(&im);
         rrd_set_error("missing filename");
@@ -3722,6 +3726,7 @@ rrd_info_t *rrd_graph_v(
     }
 
     if (strlen(argv[optind]) >= MAXPATH) {
+        setlocale(LC_NUMERIC, old_locale); /* reenable locale */
         rrd_set_error("filename (including path) too long");
         rrd_info_free(im.grinfo);
         im_free(&im);
@@ -3736,6 +3741,7 @@ rrd_info_t *rrd_graph_v(
     }
 
     rrd_graph_script(argc, argv, &im, 1);
+    setlocale(LC_NUMERIC, old_locale); /* reenable locale */
     if (rrd_test_error()) {
         rrd_info_free(im.grinfo);
         im_free(&im);
index d46de8067017ae22152175174166511775899a2b..e4b224de0a7b4fd342a7f107bf77a7dc65acc969 100644 (file)
@@ -297,7 +297,8 @@ rpnp_t   *rpn_parse(
     char      vname[MAX_VNAME_LEN + 10];
     char     *old_locale;
 
-    old_locale = setlocale(LC_NUMERIC, "C");
+    old_locale = setlocale(LC_NUMERIC, NULL);
+    setlocale(LC_NUMERIC, "C");
 
     rpnp = NULL;
     expr = (char *) expr_const;
index 454907386cb0c66a468aa49dbf7a83a044ef76bf..8fe46a2c48a8cc25282ca2977904031bd0199c35 100644 (file)
@@ -718,7 +718,8 @@ int HandleInputLine(
         if (rrd_xport
             (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
              &legend_v, &data) != -1) {
-            char *old_locale = setlocale(LC_NUMERIC, "C");
+            char *old_locale = setlocale(LC_NUMERIC,NULL);
+            setlocale(LC_NUMERIC, "C");
             row_cnt = (end - start) / step;
             ptr = data;
             printf("<?xml version=\"1.0\" encoding=\"%s\"?>\n\n",
index 55aff3d5d35ff465dbc9a6274475618f89b1e5fc..1d783801e26c652b2bf4500751fc24175dc2cc01 100644 (file)
@@ -121,7 +121,8 @@ int rrd_tune(
         optcnt++;
         switch (opt) {
         case 'h':
-            old_locale = setlocale(LC_NUMERIC, "C");
+            old_locale = setlocale(LC_NUMERIC, NULL);
+            setlocale(LC_NUMERIC, "C");
             if ((matches =
                  sscanf(optarg, DS_NAM_FMT ":%ld", ds_nam,
                         &heartbeat)) != 2) {
@@ -141,7 +142,8 @@ int rrd_tune(
             break;
 
         case 'i':
-            old_locale = setlocale(LC_NUMERIC, "C");
+            old_locale = setlocale(LC_NUMERIC, NULL);
+            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");
@@ -163,7 +165,8 @@ int rrd_tune(
             break;
 
         case 'a':
-            old_locale = setlocale(LC_NUMERIC, "C");
+            old_locale = setlocale(LC_NUMERIC, NULL);
+            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");
index 200f412071b42e75688b40b13139df15d5213d75..6e15b080af8895f494c2e3d8e249ec31b3885dcf 100644 (file)
@@ -946,7 +946,8 @@ static int get_time_from_reading(
         *current_time = tmp_time.tv_sec;
         *current_time_usec = tmp_time.tv_usec;
     } else {
-        old_locale = setlocale(LC_NUMERIC, "C");
+        old_locale = setlocale(LC_NUMERIC, NULL);
+        setlocale(LC_NUMERIC, "C");
         errno = 0;
         tmp = strtod(updvals[0], 0);
         if (errno > 0) {
@@ -1058,7 +1059,8 @@ static int update_pdp_prep(
                 }
                 break;
             case DST_ABSOLUTE:
-                old_locale = setlocale(LC_NUMERIC, "C");
+                old_locale = setlocale(LC_NUMERIC, NULL);
+                setlocale(LC_NUMERIC, "C");
                 errno = 0;
                 pdp_new[ds_idx] = strtod(updvals[ds_idx + 1], &endptr);
                 if (errno > 0) {
@@ -1076,7 +1078,8 @@ static int update_pdp_prep(
                 rate = pdp_new[ds_idx] / interval;
                 break;
             case DST_GAUGE:
-                old_locale = setlocale(LC_NUMERIC, "C");
+                old_locale = setlocale(LC_NUMERIC, NULL);
+                setlocale(LC_NUMERIC, "C");
                 errno = 0;
                 pdp_new[ds_idx] =
                     strtod(updvals[ds_idx + 1], &endptr) * interval;