summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2021-03-23 13:50:02 +0100
committerDenys Vlasenko2021-03-23 13:50:02 +0100
commitc2bd0b680667c7ec4956552f75d9ff7d040ac941 (patch)
tree8d117fedfebe03f6f97071ebc522d4ac03f08c47
parent14ed4ec8a416a60a214bf40f9185aa227ac44598 (diff)
downloadbusybox-c2bd0b680667c7ec4956552f75d9ff7d040ac941.zip
busybox-c2bd0b680667c7ec4956552f75d9ff7d040ac941.tar.gz
timeout,top,watch,ping: parse NN.N fractional duration in locales with other separators
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/printf.c1
-rw-r--r--coreutils/sleep.c4
-rw-r--r--coreutils/sort.c1
-rw-r--r--libbb/duration.c14
-rw-r--r--miscutils/dc.c1
-rw-r--r--networking/brctl.c1
6 files changed, 16 insertions, 6 deletions
diff --git a/coreutils/printf.c b/coreutils/printf.c
index a20fc33..dd94c8a 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -122,6 +122,7 @@ static void FAST_FUNC conv_strtod(const char *arg, void *result)
char *end;
/* Well, this one allows leading whitespace... so what? */
/* What I like much less is that "-" accepted too! :( */
+//TODO: needs setlocale(LC_NUMERIC, "C")?
*(double*)result = strtod(arg, &end);
if (end[0]) {
errno = ERANGE;
diff --git a/coreutils/sleep.c b/coreutils/sleep.c
index 7bfaab9..2658e84 100644
--- a/coreutils/sleep.c
+++ b/coreutils/sleep.c
@@ -74,10 +74,6 @@ int sleep_main(int argc UNUSED_PARAM, char **argv)
sleep(INT_MAX);
#if ENABLE_FEATURE_FANCY_SLEEP
-# if ENABLE_FLOAT_DURATION
- /* undo busybox.c setlocale */
- setlocale(LC_NUMERIC, "C");
-# endif
duration = 0;
do {
duration += parse_duration_str(*argv);
diff --git a/coreutils/sort.c b/coreutils/sort.c
index b194847..6c4e303 100644
--- a/coreutils/sort.c
+++ b/coreutils/sort.c
@@ -295,6 +295,7 @@ static int compare_keys(const void *xarg, const void *yarg)
#if ENABLE_FEATURE_SORT_BIG
case FLAG_g: {
char *xx, *yy;
+//TODO: needs setlocale(LC_NUMERIC, "C")?
double dx = strtod(x, &xx);
double dy = strtod(y, &yy);
/* not numbers < NaN < -infinity < numbers < +infinity) */
diff --git a/libbb/duration.c b/libbb/duration.c
index 086da15..a6a29dd 100644
--- a/libbb/duration.c
+++ b/libbb/duration.c
@@ -37,8 +37,18 @@ duration_t FAST_FUNC parse_duration_str(char *str)
if (strchr(str, '.')) {
double d;
char *pp;
- int len = strspn(str, "0123456789.");
- char sv = str[len];
+ int len;
+ char sv;
+
+# if ENABLE_LOCALE_SUPPORT
+ /* Undo busybox.c: on input, we want to use dot
+ * as fractional separator in strtod(),
+ * regardless of current locale
+ */
+ setlocale(LC_NUMERIC, "C");
+# endif
+ len = strspn(str, "0123456789.");
+ sv = str[len];
str[len] = '\0';
errno = 0;
d = strtod(str, &pp);
diff --git a/miscutils/dc.c b/miscutils/dc.c
index e94dc39..42baa67 100644
--- a/miscutils/dc.c
+++ b/miscutils/dc.c
@@ -229,6 +229,7 @@ static void stack_machine(const char *argument)
const struct op *o;
next:
+//TODO: needs setlocale(LC_NUMERIC, "C")?
number = strtod(argument, &end);
if (end != argument) {
argument = end;
diff --git a/networking/brctl.c b/networking/brctl.c
index e1f3e64..c83aac6 100644
--- a/networking/brctl.c
+++ b/networking/brctl.c
@@ -89,6 +89,7 @@ static unsigned str_to_jiffies(const char *time_str)
{
double dd;
char *endptr;
+//TODO: needs setlocale(LC_NUMERIC, "C")?
dd = /*bb_*/strtod(time_str, &endptr);
if (endptr == time_str || dd < 0)
bb_error_msg_and_die(bb_msg_invalid_arg_to, time_str, "timespec");