From: Michal Schmidt Date: Fri, 2 Nov 2012 16:27:15 +0000 (+0100) Subject: util: add is_locale_utf8() X-Git-Tag: v196~147 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=0901758558506273c0b7553dc3cae587f2b94290 util: add is_locale_utf8() journalctl and vconsole-setup both implement utf8 locale detection. Let's have a common function for it. The next patch will add another use. --- diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 0f20448bf..d1407abd9 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -33,8 +33,6 @@ #include #include #include -#include -#include #include @@ -719,9 +717,7 @@ static int setup_keys(void) { #ifdef HAVE_QRENCODE /* If this is not an UTF-8 system don't print any QR codes */ - setlocale(LC_CTYPE, ""); - - if (streq_ptr(nl_langinfo(CODESET), "UTF-8")) { + if (is_locale_utf8()) { fputs("\nTo transfer the verification key to your phone please scan the QR code below:\n\n", stderr); print_qr_code(stderr, seed, seed_size, n, arg_interval, hn, machine); } diff --git a/src/shared/util.c b/src/shared/util.c index 402b7caa3..3ac67505f 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -57,6 +57,8 @@ #include #include #include +#include +#include #include "macro.h" #include "util.h" @@ -6115,3 +6117,26 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, } return NULL; } + +bool is_locale_utf8(void) { + const char *set; + static int cached_answer = -1; + + if (cached_answer >= 0) + goto out; + + if (!setlocale(LC_ALL, "")) { + cached_answer = true; + goto out; + } + + set = nl_langinfo(CODESET); + if (!set) { + cached_answer = true; + goto out; + } + + cached_answer = streq(set, "UTF-8"); +out: + return (bool)cached_answer; +} diff --git a/src/shared/util.h b/src/shared/util.h index 284035c33..b979b0e89 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -598,3 +598,5 @@ int parse_timestamp(const char *t, usec_t *usec); void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg); + +bool is_locale_utf8(void); diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 6e016ad33..cb7ade0d2 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -29,8 +29,6 @@ #include #include #include -#include -#include #include #include #include @@ -48,19 +46,6 @@ static bool is_vconsole(int fd) { return ioctl(fd, TIOCLINUX, data) >= 0; } -static bool is_locale_utf8(void) { - const char *set; - - if (!setlocale(LC_ALL, "")) - return true; - - set = nl_langinfo(CODESET); - if (!set) - return true; - - return streq(set, "UTF-8"); -} - static int disable_utf8(int fd) { int r = 0, k;