summaryrefslogtreecommitdiff
path: root/lib/init.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2008-04-08 14:50:13 +0000
committerJean Delvare <khali@linux-fr.org>2008-04-08 14:50:13 +0000
commit399410079f9918271a980e34a726fd1a716c903e (patch)
tree00bfcb39c2d7d6d702317ed2c80cf8bc531ef418 /lib/init.c
parentf2e518511d926fa3764b12bf9f242326bc808b03 (diff)
downloadlm-sensors-git-399410079f9918271a980e34a726fd1a716c903e.tar.gz
The configuration file is currently parsed in the locale set by the main
program using the library. This means that if the decimal separator (defined in LC_NUMERIC) is not '.' the values in the compute lines are truncated. This happens for example with sensors-applet and a French locale. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=469333 Parsing the configuration file in C locale fixes the problem. Original patch from Aurelien Jarno. git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@5169 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'lib/init.c')
-rw-r--r--lib/init.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/lib/init.c b/lib/init.c
index 1c1f8834..d1ec201c 100644
--- a/lib/init.c
+++ b/lib/init.c
@@ -19,8 +19,10 @@
MA 02110-1301 USA.
*/
+#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
#include <errno.h>
#include "sensors.h"
#include "data.h"
@@ -34,6 +36,31 @@
#define DEFAULT_CONFIG_FILE ETCDIR "/sensors3.conf"
#define ALT_CONFIG_FILE ETCDIR "/sensors.conf"
+/* Wrapper around sensors_yyparse(), which clears the locale so that
+ the decimal numbers are always parsed properly. */
+static int sensors_parse(void)
+{
+ int res;
+ char *locale;
+
+ /* Remember the current locale and clear it */
+ locale = setlocale(LC_ALL, NULL);
+ if (locale) {
+ locale = strdup(locale);
+ setlocale(LC_ALL, "C");
+ }
+
+ res = sensors_yyparse();
+
+ /* Restore the old locale */
+ if (locale) {
+ setlocale(LC_ALL, locale);
+ free(locale);
+ }
+
+ return res;
+}
+
int sensors_init(FILE *input)
{
int res;
@@ -47,7 +74,7 @@ int sensors_init(FILE *input)
res = -SENSORS_ERR_PARSE;
if (input) {
if (sensors_scanner_init(input) ||
- sensors_yyparse())
+ sensors_parse())
goto exit_cleanup;
} else {
/* No configuration provided, use default */
@@ -56,7 +83,7 @@ int sensors_init(FILE *input)
input = fopen(ALT_CONFIG_FILE, "r");
if (input) {
if (sensors_scanner_init(input) ||
- sensors_yyparse()) {
+ sensors_parse()) {
fclose(input);
goto exit_cleanup;
}