[systemd-devel] [PATCH 3/3] remove RUN_WITH_LOCALE et all, use extended locale functions instead
Cristian RodrÃguez
crrodriguez at opensuse.org
Wed Jan 14 21:27:34 PST 2015
There were two callers, one can use strtod_l() and the other strptime_l()
---
src/import/curl-util.c | 38 +++++++++++++++++++++++---------------
src/shared/util.c | 18 +++++++++++++-----
src/shared/util.h | 26 --------------------------
3 files changed, 36 insertions(+), 46 deletions(-)
diff --git a/src/import/curl-util.c b/src/import/curl-util.c
index 0c6c867..bbb68f7 100644
--- a/src/import/curl-util.c
+++ b/src/import/curl-util.c
@@ -418,27 +418,35 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char
int curl_parse_http_time(const char *t, usec_t *ret) {
struct tm tm;
time_t v;
+ const char *e;
+ locale_t loc;
assert(t);
assert(ret);
- RUN_WITH_LOCALE(LC_TIME, "C") {
- const char *e;
-
- /* RFC822 */
- e = strptime(t, "%a, %d %b %Y %H:%M:%S %Z", &tm);
- if (!e || *e != 0)
- /* RFC 850 */
- e = strptime(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm);
- if (!e || *e != 0)
- /* ANSI C */
- e = strptime(t, "%a %b %d %H:%M:%S %Y", &tm);
- if (!e || *e != 0)
- return -EINVAL;
-
- v = timegm(&tm);
+ loc = newlocale (LC_TIME_MASK, "C", (locale_t)0);
+
+ if (loc == (locale_t) 0)
+ return -errno;
+
+ /* RFC822 */
+ e = strptime_l(t, "%a, %d %b %Y %H:%M:%S %Z", &tm, loc);
+
+ if (!e || *e != 0)
+ /* RFC 850 */
+ e = strptime_l(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm, loc);
+ if (!e || *e != 0)
+ /* ANSI C */
+ e = strptime_l(t, "%a %b %d %H:%M:%S %Y", &tm, loc);
+ if (!e || *e != 0) {
+ freelocale(loc);
+ return -EINVAL;
}
+ freelocale(loc);
+
+ v = timegm(&tm);
+
if (v == (time_t) -1)
return -EINVAL;
diff --git a/src/shared/util.c b/src/shared/util.c
index 884e782..599f3ca 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -507,19 +507,27 @@ int safe_atolli(const char *s, long long int *ret_lli) {
int safe_atod(const char *s, double *ret_d) {
char *x = NULL;
double d = 0;
+ locale_t loc;
assert(s);
assert(ret_d);
- RUN_WITH_LOCALE(LC_NUMERIC_MASK, "C") {
- errno = 0;
- d = strtod(s, &x);
- }
+ loc = newlocale (LC_NUMERIC_MASK, "C", (locale_t)0);
- if (!x || x == s || *x || errno)
+ if(loc == (locale_t)0)
+ return -errno;
+
+ errno = 0;
+ d = strtod_l(s, &x, loc);
+
+ if (!x || x == s || *x || errno) {
+ freelocale(loc);
return errno ? -errno : -EINVAL;
+ }
*ret_d = (double) d;
+ freelocale(loc);
+
return 0;
}
diff --git a/src/shared/util.h b/src/shared/util.h
index fdb9fb6..8445371 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -942,32 +942,6 @@ int unlink_noerrno(const char *path);
_r_; \
})
-struct _locale_struct_ {
- locale_t saved_locale;
- locale_t new_locale;
- bool quit;
-};
-
-static inline void _reset_locale_(struct _locale_struct_ *s) {
- PROTECT_ERRNO;
- if (s->saved_locale != (locale_t) 0)
- uselocale(s->saved_locale);
- if (s->new_locale != (locale_t) 0)
- freelocale(s->new_locale);
-}
-
-#define RUN_WITH_LOCALE(mask, loc) \
- for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \
- ({ \
- if (!_saved_locale_.quit) { \
- PROTECT_ERRNO; \
- _saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \
- if (_saved_locale_.new_locale != (locale_t) 0) \
- _saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \
- } \
- !_saved_locale_.quit; }) ; \
- _saved_locale_.quit = true)
-
bool id128_is_valid(const char *s) _pure_;
int split_pair(const char *s, const char *sep, char **l, char **r);
--
2.2.1
More information about the systemd-devel
mailing list