diff options
author | Thomas Haller <thaller@redhat.com> | 2020-04-01 12:26:20 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-04-01 17:18:01 +0200 |
commit | 35a9f632a81df40209e3d71f2328ccdfcf175aee (patch) | |
tree | 8dd8469e5ed76c50182270659ea8904b97a26e8f | |
parent | f4446e34c689d6bd81deb8bbab01387716db801f (diff) | |
download | NetworkManager-35a9f632a81df40209e3d71f2328ccdfcf175aee.tar.gz |
shared: add nm_g_ascii_strtod() to workaround bug
-rw-r--r-- | shared/nm-glib-aux/nm-shared-utils.c | 37 | ||||
-rw-r--r-- | shared/nm-glib-aux/nm-shared-utils.h | 3 |
2 files changed, 40 insertions, 0 deletions
diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c index 96c966f16f..783887214b 100644 --- a/shared/nm-glib-aux/nm-shared-utils.c +++ b/shared/nm-glib-aux/nm-shared-utils.c @@ -1021,6 +1021,43 @@ again: return v; } +/* see nm_g_ascii_strtoll(). */ +double +nm_g_ascii_strtod (const char *nptr, + char **endptr) +{ + int try_count = 2; + double v; + int errsv; + + nm_assert (nptr); + +again: + v = g_ascii_strtod (nptr, endptr); + errsv = errno; + + if (errsv == 0) + return v; + + if (errsv == ERANGE) + return v; + + if (try_count-- > 0) + goto again; + +#if NM_MORE_ASSERTS + g_critical ("g_ascii_strtod() for \"%s\" failed with errno=%d (%s) and v=%f", + nptr, + errsv, + nm_strerror_native (errsv), + v); +#endif + + /* Not really much else to do. Return the parsed value and leave errno set + * to the unexpected value. */ + return v; +} + /* _nm_utils_ascii_str_to_int64: * * A wrapper for g_ascii_strtoll, that checks whether the whole string diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index 7ee024550b..79ea31771e 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -661,6 +661,9 @@ gint64 nm_g_ascii_strtoll (const char *nptr, char **endptr, guint base); +double nm_g_ascii_strtod (const char *nptr, + char **endptr); + gint64 _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback); guint64 _nm_utils_ascii_str_to_uint64 (const char *str, guint base, guint64 min, guint64 max, guint64 fallback); |