]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util: split out kbd related stuff
authorLennart Poettering <lennart@poettering.net>
Thu, 14 Mar 2019 11:40:29 +0000 (12:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 14 Mar 2019 12:25:51 +0000 (13:25 +0100)
This stuff is neither generic enough to be in def.h, nor really has much
to do with locale, hence give it its own .c/.h file pair.

src/basic/def.h
src/basic/kbd-util.c [new file with mode: 0644]
src/basic/kbd-util.h [new file with mode: 0644]
src/basic/locale-util.c
src/basic/locale-util.h
src/basic/meson.build
src/firstboot/firstboot.c
src/locale/keymap-util.c
src/locale/localectl.c
src/test/test-locale-util.c

index 48344f7a8e1cae3be9896a2e98d1988d05a49d28..196778fcf94ddb2f3526e1e40efa93bf163e2ee2 100644 (file)
 #define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
 #define SIGNALS_IGNORE SIGPIPE
 
-#if HAVE_SPLIT_USR
-#define KBD_KEYMAP_DIRS                         \
-        "/usr/share/keymaps/\0"                 \
-        "/usr/share/kbd/keymaps/\0"             \
-        "/usr/lib/kbd/keymaps/\0"               \
-        "/lib/kbd/keymaps/\0"
-#else
-#define KBD_KEYMAP_DIRS                         \
-        "/usr/share/keymaps/\0"                 \
-        "/usr/share/kbd/keymaps/\0"             \
-        "/usr/lib/kbd/keymaps/\0"
-#endif
-
 /* Note that we use the new /run prefix here (instead of /var/run) since we require them to be aliases and that way we
  * become independent of /var being mounted */
 #define DEFAULT_SYSTEM_BUS_ADDRESS "unix:path=/run/dbus/system_bus_socket"
diff --git a/src/basic/kbd-util.c b/src/basic/kbd-util.c
new file mode 100644 (file)
index 0000000..f178b5d
--- /dev/null
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#include <ftw.h>
+
+#include "kbd-util.h"
+#include "log.h"
+#include "path-util.h"
+#include "set.h"
+#include "string-util.h"
+#include "strv.h"
+#include "utf8.h"
+
+static thread_local Set *keymaps = NULL;
+
+static int nftw_cb(
+                const char *fpath,
+                const struct stat *sb,
+                int tflag,
+                struct FTW *ftwbuf) {
+
+        _cleanup_free_ char *p = NULL;
+        char *e;
+        int r;
+
+        if (tflag != FTW_F)
+                return 0;
+
+        if (!endswith(fpath, ".map") &&
+            !endswith(fpath, ".map.gz"))
+                return 0;
+
+        p = strdup(basename(fpath));
+        if (!p)
+                return FTW_STOP;
+
+        e = endswith(p, ".map");
+        if (e)
+                *e = 0;
+
+        e = endswith(p, ".map.gz");
+        if (e)
+                *e = 0;
+
+        if (!keymap_is_valid(p))
+                return 0;
+
+        r = set_consume(keymaps, TAKE_PTR(p));
+        if (r < 0 && r != -EEXIST)
+                return r;
+
+        return 0;
+}
+
+int get_keymaps(char ***ret) {
+        _cleanup_strv_free_ char **l = NULL;
+        const char *dir;
+        int r;
+
+        keymaps = set_new(&string_hash_ops);
+        if (!keymaps)
+                return -ENOMEM;
+
+        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
+                r = nftw(dir, nftw_cb, 20, FTW_PHYS|FTW_ACTIONRETVAL);
+
+                if (r == FTW_STOP)
+                        log_debug("Directory not found %s", dir);
+                else if (r < 0)
+                        log_debug_errno(r, "Can't add keymap: %m");
+        }
+
+        l = set_get_strv(keymaps);
+        if (!l) {
+                set_free_free(keymaps);
+                return -ENOMEM;
+        }
+
+        set_free(keymaps);
+
+        if (strv_isempty(l))
+                return -ENOENT;
+
+        strv_sort(l);
+
+        *ret = TAKE_PTR(l);
+
+        return 0;
+}
+
+bool keymap_is_valid(const char *name) {
+
+        if (isempty(name))
+                return false;
+
+        if (strlen(name) >= 128)
+                return false;
+
+        if (!utf8_is_valid(name))
+                return false;
+
+        if (!filename_is_valid(name))
+                return false;
+
+        if (!string_is_safe(name))
+                return false;
+
+        return true;
+}
diff --git a/src/basic/kbd-util.h b/src/basic/kbd-util.h
new file mode 100644 (file)
index 0000000..9efd2c7
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include <stdbool.h>
+
+#if HAVE_SPLIT_USR
+#define KBD_KEYMAP_DIRS                         \
+        "/usr/share/keymaps/\0"                 \
+        "/usr/share/kbd/keymaps/\0"             \
+        "/usr/lib/kbd/keymaps/\0"               \
+        "/lib/kbd/keymaps/\0"
+#else
+#define KBD_KEYMAP_DIRS                         \
+        "/usr/share/keymaps/\0"                 \
+        "/usr/share/kbd/keymaps/\0"             \
+        "/usr/lib/kbd/keymaps/\0"
+#endif
+
+int get_keymaps(char ***l);
+bool keymap_is_valid(const char *name);
index fc1577a83f666e5e5f0847a353fcc798fb8024c2..6f41f5064137795fcc26e2b6446bf642ea14a9c5 100644 (file)
@@ -255,99 +255,6 @@ out:
         return (bool) cached_answer;
 }
 
-static thread_local Set *keymaps = NULL;
-
-static int nftw_cb(
-                const char *fpath,
-                const struct stat *sb,
-                int tflag,
-                struct FTW *ftwbuf) {
-
-        char *p, *e;
-        int r;
-
-        if (tflag != FTW_F)
-                return 0;
-
-        if (!endswith(fpath, ".map") &&
-            !endswith(fpath, ".map.gz"))
-                return 0;
-
-        p = strdup(basename(fpath));
-        if (!p)
-                return FTW_STOP;
-
-        e = endswith(p, ".map");
-        if (e)
-                *e = 0;
-
-        e = endswith(p, ".map.gz");
-        if (e)
-                *e = 0;
-
-        r = set_consume(keymaps, p);
-        if (r < 0 && r != -EEXIST)
-                return r;
-
-        return 0;
-}
-
-int get_keymaps(char ***ret) {
-        _cleanup_strv_free_ char **l = NULL;
-        const char *dir;
-        int r;
-
-        keymaps = set_new(&string_hash_ops);
-        if (!keymaps)
-                return -ENOMEM;
-
-        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
-                r = nftw(dir, nftw_cb, 20, FTW_PHYS|FTW_ACTIONRETVAL);
-
-                if (r == FTW_STOP)
-                        log_debug("Directory not found %s", dir);
-                else if (r < 0)
-                        log_debug_errno(r, "Can't add keymap: %m");
-        }
-
-        l = set_get_strv(keymaps);
-        if (!l) {
-                set_free_free(keymaps);
-                return -ENOMEM;
-        }
-
-        set_free(keymaps);
-
-        if (strv_isempty(l))
-                return -ENOENT;
-
-        strv_sort(l);
-
-        *ret = TAKE_PTR(l);
-
-        return 0;
-}
-
-bool keymap_is_valid(const char *name) {
-
-        if (isempty(name))
-                return false;
-
-        if (strlen(name) >= 128)
-                return false;
-
-        if (!utf8_is_valid(name))
-                return false;
-
-        if (!filename_is_valid(name))
-                return false;
-
-        if (!string_is_safe(name))
-                return false;
-
-        return true;
-}
-
 static bool emoji_enabled(void) {
         static int cached_emoji_enabled = -1;
 
index e64f0ce15cd7f8bd9bfd1ffe165a2aba0474adf9..78abbafd8f0b2d1f0b5657e8bf9c90564c1f8efc 100644 (file)
@@ -68,9 +68,6 @@ const char *special_glyph(SpecialGlyph code) _const_;
 const char* locale_variable_to_string(LocaleVariable i) _const_;
 LocaleVariable locale_variable_from_string(const char *s) _pure_;
 
-int get_keymaps(char ***l);
-bool keymap_is_valid(const char *name);
-
 static inline void freelocalep(locale_t *p) {
         if (*p == (locale_t) 0)
                 return;
index 1f7ef8683a463b44e15d9dc26a7878f60c53e4d4..82b245c90b557922b73e6f8e76e06e43e3073fbc 100644 (file)
@@ -76,6 +76,8 @@ basic_sources = files('''
         io-util.c
         io-util.h
         ioprio.h
+        kbd-util.c
+        kbd-util.h
         khash.c
         khash.h
         label.c
index dde11576eacfb986c45e9671290251cd3768759d..6bbdafa81a161b16d86bc5beef25eae4452e8061 100644 (file)
@@ -27,6 +27,7 @@
 #include "fileio.h"
 #include "fs-util.h"
 #include "hostname-util.h"
+#include "kbd-util.h"
 #include "locale-util.h"
 #include "main-func.h"
 #include "mkdir.h"
index 6b6b32a5910cdd4d504f47a36492ddf0cbcd9fc9..64d18d916e46d42c174e549fb1ba0e0048c3e6f0 100644 (file)
@@ -6,13 +6,13 @@
 #include <unistd.h>
 
 #include "bus-util.h"
-#include "def.h"
-#include "env-file.h"
 #include "env-file-label.h"
+#include "env-file.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio-label.h"
 #include "fileio.h"
+#include "kbd-util.h"
 #include "keymap-util.h"
 #include "locale-util.h"
 #include "macro.h"
index 683b127ba18dac2a83b84790376122d5c1d7eb9a..c8b195d9a6c0968c32856d7973af5505cd7e950e 100644 (file)
@@ -11,9 +11,9 @@
 
 #include "bus-error.h"
 #include "bus-util.h"
-#include "def.h"
 #include "fd-util.h"
 #include "fileio.h"
+#include "kbd-util.h"
 #include "locale-util.h"
 #include "main-func.h"
 #include "memory-util.h"
index c6f8c1fb4f7b82be112300dd9ea7bb17e2bd410e..f1d044082b275c504c0e0adf77a9af14d90bbb05 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
+#include "kbd-util.h"
 #include "locale-util.h"
 #include "macro.h"
 #include "strv.h"