diff options
author | Jean Delvare <khali@linux-fr.org> | 2008-04-08 14:50:13 +0000 |
---|---|---|
committer | Jean Delvare <khali@linux-fr.org> | 2008-04-08 14:50:13 +0000 |
commit | 399410079f9918271a980e34a726fd1a716c903e (patch) | |
tree | 00bfcb39c2d7d6d702317ed2c80cf8bc531ef418 /lib/init.c | |
parent | f2e518511d926fa3764b12bf9f242326bc808b03 (diff) | |
download | lm-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.c | 31 |
1 files changed, 29 insertions, 2 deletions
@@ -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; } |