summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Schmidt <mschmidt@redhat.com>2012-11-02 17:27:15 +0100
committerMichal Schmidt <mschmidt@redhat.com>2012-11-02 17:27:15 +0100
commit0901758558506273c0b7553dc3cae587f2b94290 (patch)
tree654ff82aa499e9113e8de546d8972ffd25ab1bac
parent4940c64240541e91411620b7dc0963e012aa6b91 (diff)
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.
-rw-r--r--src/journal/journalctl.c6
-rw-r--r--src/shared/util.c25
-rw-r--r--src/shared/util.h2
-rw-r--r--src/vconsole/vconsole-setup.c15
4 files changed, 28 insertions, 20 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 0f20448bf0..d1407abd9e 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -33,8 +33,6 @@
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
-#include <locale.h>
-#include <langinfo.h>
#include <systemd/sd-journal.h>
@@ -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 402b7caa3f..3ac67505f0 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -57,6 +57,8 @@
#include <sys/vfs.h>
#include <linux/magic.h>
#include <limits.h>
+#include <langinfo.h>
+#include <locale.h>
#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 284035c33b..b979b0e89f 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 6e016ad338..cb7ade0d24 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -29,8 +29,6 @@
#include <stdbool.h>
#include <stdarg.h>
#include <limits.h>
-#include <locale.h>
-#include <langinfo.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <linux/tiocl.h>
@@ -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;