chiark / gitweb /
util: add is_locale_utf8()
authorMichal Schmidt <mschmidt@redhat.com>
Fri, 2 Nov 2012 16:27:15 +0000 (17:27 +0100)
committerMichal Schmidt <mschmidt@redhat.com>
Fri, 2 Nov 2012 16:27:15 +0000 (17:27 +0100)
journalctl and vconsole-setup both implement utf8 locale detection.
Let's have a common function for it.
The next patch will add another use.

src/journal/journalctl.c
src/shared/util.c
src/shared/util.h
src/vconsole/vconsole-setup.c

index 0f20448..d1407ab 100644 (file)
@@ -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);
                 }
index 402b7ca..3ac6750 100644 (file)
@@ -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;
+}
index 284035c..b979b0e 100644 (file)
@@ -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);
index 6e016ad..cb7ade0 100644 (file)
@@ -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;