From: Cristian Rodríguez Date: Thu, 15 Jan 2015 05:27:34 +0000 (-0300) Subject: util: replace RUN_WITH_LOCALE with extended locale functions X-Git-Tag: v219~451 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=0193ad26ba121f3df259cc8b3bab54a99b8e5252 util: replace RUN_WITH_LOCALE with extended locale functions There were two callers, one can use strtod_l() and the other strptime_l(). (David: fix up commit-msg and coding-style) --- diff --git a/src/import/curl-util.c b/src/import/curl-util.c index 0c6c8673c..313b04b0b 100644 --- a/src/import/curl-util.c +++ b/src/import/curl-util.c @@ -416,29 +416,31 @@ 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) { + const char *e; + locale_t loc; struct tm tm; time_t v; 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); + freelocale(loc); + if (!e || *e != 0) + return -EINVAL; + v = timegm(&tm); if (v == (time_t) -1) return -EINVAL; diff --git a/src/shared/util.c b/src/shared/util.c index 884e782c4..8f6d5e660 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -507,18 +507,24 @@ 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 (loc == (locale_t) 0) + return -errno; - if (!x || x == s || *x || errno) + errno = 0; + d = strtod_l(s, &x, loc); + + if (!x || x == s || *x || errno) { + freelocale(loc); return errno ? -errno : -EINVAL; + } + freelocale(loc); *ret_d = (double) d; return 0; } diff --git a/src/shared/util.h b/src/shared/util.h index fdb9fb6ef..84453713c 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);