Move os-util.[ch] to basic/
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 19 Feb 2021 15:51:18 +0000 (16:51 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 22 Feb 2021 19:10:55 +0000 (20:10 +0100)
parse_os_release() will be used basic/hostname-util.c later on.

12 files changed:
src/basic/meson.build
src/basic/os-util.c [new file with mode: 0644]
src/basic/os-util.h [new file with mode: 0644]
src/machine/image-dbus.c
src/machine/machined-dbus.c
src/portable/portablectl.c
src/portable/portabled-image-bus.c
src/shared/discover-image.c
src/shared/discover-image.h
src/shared/meson.build
src/shared/os-util.c [deleted file]
src/shared/os-util.h [deleted file]

index 0b0982d54313bb6aa32b194e8c15218dc6cbcd53..bacd519a867a4c9eee71505c07eb042ff5939341 100644 (file)
@@ -170,6 +170,8 @@ basic_sources = files('''
         nulstr-util.h
         ordered-set.c
         ordered-set.h
+        os-util.c
+        os-util.h
         parse-util.c
         parse-util.h
         path-lookup.c
diff --git a/src/basic/os-util.c b/src/basic/os-util.c
new file mode 100644 (file)
index 0000000..e6f9f7c
--- /dev/null
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "alloc-util.h"
+#include "env-file.h"
+#include "env-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "macro.h"
+#include "os-util.h"
+#include "path-util.h"
+#include "string-util.h"
+#include "strv.h"
+#include "utf8.h"
+
+bool image_name_is_valid(const char *s) {
+        if (!filename_is_valid(s))
+                return false;
+
+        if (string_has_cc(s, NULL))
+                return false;
+
+        if (!utf8_is_valid(s))
+                return false;
+
+        /* Temporary files for atomically creating new files */
+        if (startswith(s, ".#"))
+                return false;
+
+        return true;
+}
+
+int path_is_extension_tree(const char *path, const char *extension) {
+        int r;
+
+        assert(path);
+
+        /* Does the path exist at all? If not, generate an error immediately. This is useful so that a missing root dir
+         * always results in -ENOENT, and we can properly distinguish the case where the whole root doesn't exist from
+         * the case where just the os-release file is missing. */
+        if (laccess(path, F_OK) < 0)
+                return -errno;
+
+        /* We use /usr/lib/extension-release.d/extension-release.NAME as flag file if something is a system extension,
+         * and {/etc|/usr/lib}/os-release as flag file if something is an OS (in case extension == NULL) */
+        r = open_extension_release(path, extension, NULL, NULL);
+        if (r == -ENOENT) /* We got nothing */
+                return 0;
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
+int open_extension_release(const char *root, const char *extension, char **ret_path, int *ret_fd) {
+        _cleanup_free_ char *q = NULL;
+        int r, fd;
+
+        if (extension) {
+                const char *extension_full_path;
+
+                if (!image_name_is_valid(extension))
+                        return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+                                               "The extension name %s is invalid.", extension);
+
+                extension_full_path = strjoina("/usr/lib/extension-release.d/extension-release.", extension);
+                r = chase_symlinks(extension_full_path, root, CHASE_PREFIX_ROOT,
+                                  ret_path ? &q : NULL,
+                                  ret_fd ? &fd : NULL);
+        } else {
+                const char *p;
+
+                FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
+                        r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
+                                        ret_path ? &q : NULL,
+                                        ret_fd ? &fd : NULL);
+                        if (r != -ENOENT)
+                                break;
+                }
+        }
+        if (r < 0)
+                return r;
+
+        if (ret_fd) {
+                int real_fd;
+
+                /* Convert the O_PATH fd into a proper, readable one */
+                real_fd = fd_reopen(fd, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                safe_close(fd);
+                if (real_fd < 0)
+                        return real_fd;
+
+                *ret_fd = real_fd;
+        }
+
+        if (ret_path)
+                *ret_path = TAKE_PTR(q);
+
+        return 0;
+}
+
+int fopen_extension_release(const char *root, const char *extension, char **ret_path, FILE **ret_file) {
+        _cleanup_free_ char *p = NULL;
+        _cleanup_close_ int fd = -1;
+        FILE *f;
+        int r;
+
+        if (!ret_file)
+                return open_extension_release(root, extension, ret_path, NULL);
+
+        r = open_extension_release(root, extension, ret_path ? &p : NULL, &fd);
+        if (r < 0)
+                return r;
+
+        f = take_fdopen(&fd, "r");
+        if (!f)
+                return -errno;
+
+        *ret_file = f;
+
+        if (ret_path)
+                *ret_path = TAKE_PTR(p);
+
+        return 0;
+}
+
+static int parse_release_internal(const char *root, const char *extension, va_list ap) {
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_free_ char *p = NULL;
+        int r;
+
+        r = fopen_extension_release(root, extension, &p, &f);
+        if (r < 0)
+                return r;
+
+        return parse_env_filev(f, p, ap);
+}
+
+int parse_extension_release(const char *root, const char *extension, ...) {
+        va_list ap;
+        int r;
+
+        va_start(ap, extension);
+        r = parse_release_internal(root, extension, ap);
+        va_end(ap);
+
+        return r;
+}
+
+int parse_os_release(const char *root, ...) {
+        va_list ap;
+        int r;
+
+        va_start(ap, root);
+        r = parse_release_internal(root, NULL, ap);
+        va_end(ap);
+
+        return r;
+}
+
+int load_os_release_pairs(const char *root, char ***ret) {
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_free_ char *p = NULL;
+        int r;
+
+        r = fopen_os_release(root, &p, &f);
+        if (r < 0)
+                return r;
+
+        return load_env_file_pairs(f, p, ret);
+}
+
+int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret) {
+        _cleanup_strv_free_ char **os_release_pairs = NULL, **os_release_pairs_prefixed = NULL;
+        char **p, **q;
+        int r;
+
+        r = load_os_release_pairs(root, &os_release_pairs);
+        if (r < 0)
+                return r;
+
+        STRV_FOREACH_PAIR(p, q, os_release_pairs) {
+                char *line;
+
+                /* We strictly return only the four main ID fields and ignore the rest */
+                if (!STR_IN_SET(*p, "ID", "VERSION_ID", "BUILD_ID", "VARIANT_ID"))
+                        continue;
+
+                ascii_strlower(*p);
+                line = strjoin(prefix, *p, "=", *q);
+                if (!line)
+                        return -ENOMEM;
+                r = strv_consume(&os_release_pairs_prefixed, line);
+                if (r < 0)
+                        return r;
+        }
+
+        *ret = TAKE_PTR(os_release_pairs_prefixed);
+
+        return 0;
+}
+
+int load_extension_release_pairs(const char *root, const char *extension, char ***ret) {
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_free_ char *p = NULL;
+        int r;
+
+        r = fopen_extension_release(root, extension, &p, &f);
+        if (r < 0)
+                return r;
+
+        return load_env_file_pairs(f, p, ret);
+}
diff --git a/src/basic/os-util.h b/src/basic/os-util.h
new file mode 100644 (file)
index 0000000..f7789c0
--- /dev/null
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include <stdio.h>
+
+/* The *_extension_release flavours will look for /usr/lib/extension-release/extension-release.NAME
+ * in accordance with the OS extension specification, rather than for /usr/lib/ or /etc/os-release. */
+
+bool image_name_is_valid(const char *s) _pure_;
+
+int path_is_extension_tree(const char *path, const char *extension);
+static inline int path_is_os_tree(const char *path) {
+        return path_is_extension_tree(path, NULL);
+}
+
+int open_extension_release(const char *root, const char *extension, char **ret_path, int *ret_fd);
+static inline int open_os_release(const char *root, char **ret_path, int *ret_fd) {
+        return open_extension_release(root, NULL, ret_path, ret_fd);
+}
+
+int fopen_extension_release(const char *root, const char *extension, char **ret_path, FILE **ret_file);
+static inline int fopen_os_release(const char *root, char **ret_path, FILE **ret_file) {
+        return fopen_extension_release(root, NULL, ret_path, ret_file);
+}
+
+int parse_extension_release(const char *root, const char *extension, ...) _sentinel_;
+int parse_os_release(const char *root, ...) _sentinel_;
+int load_extension_release_pairs(const char *root, const char *extension, char ***ret);
+int load_os_release_pairs(const char *root, char ***ret);
+int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret);
index 539b4c802a62e640c5f60d1c6207cb5198f179f5..309de0b116c80bc2e6d754987c159cd2b2fc9923 100644 (file)
@@ -18,6 +18,7 @@
 #include "loop-util.h"
 #include "missing_capability.h"
 #include "mount-util.h"
+#include "os-util.h"
 #include "process-util.h"
 #include "raw-clone.h"
 #include "strv.h"
index 08179eb4006cc277b01ad9155e09bd50d8f38490..bb6a2bc5761ba09779046104ce98e12c18539692 100644 (file)
@@ -24,6 +24,7 @@
 #include "machine-pool.h"
 #include "machined.h"
 #include "missing_capability.h"
+#include "os-util.h"
 #include "path-util.h"
 #include "process-util.h"
 #include "stdio-util.h"
index 278dae0e1b56a8ae34ad3d5e9fadc2e802f1ded6..af4acc21257c7eb83f53de21951e30b2de2ce54e 100644 (file)
@@ -12,7 +12,6 @@
 #include "bus-wait-for-jobs.h"
 #include "def.h"
 #include "dirent-util.h"
-#include "discover-image.h"
 #include "env-file.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -20,6 +19,7 @@
 #include "fs-util.h"
 #include "locale-util.h"
 #include "main-func.h"
+#include "os-util.h"
 #include "pager.h"
 #include "parse-util.h"
 #include "path-util.h"
index 018cc9b818ad7633e602f50ef6bf3b2df335abdd..8332332c9159ce1989766fede7ccd4905c25528b 100644 (file)
@@ -17,6 +17,7 @@
 #include "fileio.h"
 #include "io-util.h"
 #include "missing_capability.h"
+#include "os-util.h"
 #include "portable.h"
 #include "portabled-bus.h"
 #include "portabled-image-bus.h"
index fbce201e297eee79afc51702031e34c1187536da..fb59d1d704a5628ae56ce620fa173614ad3e4f38 100644 (file)
@@ -1250,23 +1250,6 @@ int image_name_lock(const char *name, int operation, LockFile *ret) {
         return make_lock_file(p, operation, ret);
 }
 
-bool image_name_is_valid(const char *s) {
-        if (!filename_is_valid(s))
-                return false;
-
-        if (string_has_cc(s, NULL))
-                return false;
-
-        if (!utf8_is_valid(s))
-                return false;
-
-        /* Temporary files for atomically creating new files */
-        if (startswith(s, ".#"))
-                return false;
-
-        return true;
-}
-
 bool image_in_search_path(
                 ImageClass class,
                 const char *root,
index af67d167c4988a621afc5778c7222bb8eb2a8ac0..3726e98d30c3d4224d8d656247c2a25dd3d1a288 100644 (file)
@@ -76,8 +76,6 @@ int image_read_only(Image *i, bool b);
 const char* image_type_to_string(ImageType t) _const_;
 ImageType image_type_from_string(const char *s) _pure_;
 
-bool image_name_is_valid(const char *s) _pure_;
-
 int image_path_lock(const char *path, int operation, LockFile *global, LockFile *local);
 int image_name_lock(const char *name, int operation, LockFile *ret);
 
index dfa3275b049bd6f20040fe352f7dc7d4d480548f..4b27a95cc2301a47eb8514b84943b465831b9f74 100644 (file)
@@ -198,8 +198,6 @@ shared_sources = files('''
         numa-util.h
         openssl-util.c
         openssl-util.h
-        os-util.c
-        os-util.h
         output-mode.c
         output-mode.h
         pager.c
diff --git a/src/shared/os-util.c b/src/shared/os-util.c
deleted file mode 100644 (file)
index 3405c9a..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include "alloc-util.h"
-#include "discover-image.h"
-#include "env-file.h"
-#include "env-util.h"
-#include "fd-util.h"
-#include "fileio.h"
-#include "fs-util.h"
-#include "macro.h"
-#include "os-util.h"
-#include "string-util.h"
-#include "strv.h"
-
-int path_is_extension_tree(const char *path, const char *extension) {
-        int r;
-
-        assert(path);
-
-        /* Does the path exist at all? If not, generate an error immediately. This is useful so that a missing root dir
-         * always results in -ENOENT, and we can properly distinguish the case where the whole root doesn't exist from
-         * the case where just the os-release file is missing. */
-        if (laccess(path, F_OK) < 0)
-                return -errno;
-
-        /* We use /usr/lib/extension-release.d/extension-release.NAME as flag file if something is a system extension,
-         * and {/etc|/usr/lib}/os-release as flag file if something is an OS (in case extension == NULL) */
-        r = open_extension_release(path, extension, NULL, NULL);
-        if (r == -ENOENT) /* We got nothing */
-                return 0;
-        if (r < 0)
-                return r;
-
-        return 1;
-}
-
-int open_extension_release(const char *root, const char *extension, char **ret_path, int *ret_fd) {
-        _cleanup_free_ char *q = NULL;
-        int r, fd;
-
-        if (extension) {
-                const char *extension_full_path;
-
-                if (!image_name_is_valid(extension))
-                        return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
-                                               "The extension name %s is invalid.", extension);
-
-                extension_full_path = strjoina("/usr/lib/extension-release.d/extension-release.", extension);
-                r = chase_symlinks(extension_full_path, root, CHASE_PREFIX_ROOT,
-                                  ret_path ? &q : NULL,
-                                  ret_fd ? &fd : NULL);
-        } else {
-                const char *p;
-
-                FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
-                        r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
-                                        ret_path ? &q : NULL,
-                                        ret_fd ? &fd : NULL);
-                        if (r != -ENOENT)
-                                break;
-                }
-        }
-        if (r < 0)
-                return r;
-
-        if (ret_fd) {
-                int real_fd;
-
-                /* Convert the O_PATH fd into a proper, readable one */
-                real_fd = fd_reopen(fd, O_RDONLY|O_CLOEXEC|O_NOCTTY);
-                safe_close(fd);
-                if (real_fd < 0)
-                        return real_fd;
-
-                *ret_fd = real_fd;
-        }
-
-        if (ret_path)
-                *ret_path = TAKE_PTR(q);
-
-        return 0;
-}
-
-int fopen_extension_release(const char *root, const char *extension, char **ret_path, FILE **ret_file) {
-        _cleanup_free_ char *p = NULL;
-        _cleanup_close_ int fd = -1;
-        FILE *f;
-        int r;
-
-        if (!ret_file)
-                return open_extension_release(root, extension, ret_path, NULL);
-
-        r = open_extension_release(root, extension, ret_path ? &p : NULL, &fd);
-        if (r < 0)
-                return r;
-
-        f = take_fdopen(&fd, "r");
-        if (!f)
-                return -errno;
-
-        *ret_file = f;
-
-        if (ret_path)
-                *ret_path = TAKE_PTR(p);
-
-        return 0;
-}
-
-static int parse_release_internal(const char *root, const char *extension, va_list ap) {
-        _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *p = NULL;
-        int r;
-
-        r = fopen_extension_release(root, extension, &p, &f);
-        if (r < 0)
-                return r;
-
-        return parse_env_filev(f, p, ap);
-}
-
-int parse_extension_release(const char *root, const char *extension, ...) {
-        va_list ap;
-        int r;
-
-        va_start(ap, extension);
-        r = parse_release_internal(root, extension, ap);
-        va_end(ap);
-
-        return r;
-}
-
-int parse_os_release(const char *root, ...) {
-        va_list ap;
-        int r;
-
-        va_start(ap, root);
-        r = parse_release_internal(root, NULL, ap);
-        va_end(ap);
-
-        return r;
-}
-
-int load_os_release_pairs(const char *root, char ***ret) {
-        _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *p = NULL;
-        int r;
-
-        r = fopen_os_release(root, &p, &f);
-        if (r < 0)
-                return r;
-
-        return load_env_file_pairs(f, p, ret);
-}
-
-int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret) {
-        _cleanup_strv_free_ char **os_release_pairs = NULL, **os_release_pairs_prefixed = NULL;
-        char **p, **q;
-        int r;
-
-        r = load_os_release_pairs(root, &os_release_pairs);
-        if (r < 0)
-                return r;
-
-        STRV_FOREACH_PAIR(p, q, os_release_pairs) {
-                char *line;
-
-                /* We strictly return only the four main ID fields and ignore the rest */
-                if (!STR_IN_SET(*p, "ID", "VERSION_ID", "BUILD_ID", "VARIANT_ID"))
-                        continue;
-
-                ascii_strlower(*p);
-                line = strjoin(prefix, *p, "=", *q);
-                if (!line)
-                        return -ENOMEM;
-                r = strv_consume(&os_release_pairs_prefixed, line);
-                if (r < 0)
-                        return r;
-        }
-
-        *ret = TAKE_PTR(os_release_pairs_prefixed);
-
-        return 0;
-}
-
-int load_extension_release_pairs(const char *root, const char *extension, char ***ret) {
-        _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *p = NULL;
-        int r;
-
-        r = fopen_extension_release(root, extension, &p, &f);
-        if (r < 0)
-                return r;
-
-        return load_env_file_pairs(f, p, ret);
-}
diff --git a/src/shared/os-util.h b/src/shared/os-util.h
deleted file mode 100644 (file)
index bdb9e6a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#pragma once
-
-#include <stdio.h>
-
-/* The *_extension_release flavours will look for /usr/lib/extension-release/extension-release.NAME
- * in accordance with the OS extension specification, rather than for /usr/lib/ or /etc/os-release. */
-
-int path_is_extension_tree(const char *path, const char *extension);
-static inline int path_is_os_tree(const char *path) {
-        return path_is_extension_tree(path, NULL);
-}
-
-int open_extension_release(const char *root, const char *extension, char **ret_path, int *ret_fd);
-static inline int open_os_release(const char *root, char **ret_path, int *ret_fd) {
-        return open_extension_release(root, NULL, ret_path, ret_fd);
-}
-
-int fopen_extension_release(const char *root, const char *extension, char **ret_path, FILE **ret_file);
-static inline int fopen_os_release(const char *root, char **ret_path, FILE **ret_file) {
-        return fopen_extension_release(root, NULL, ret_path, ret_file);
-}
-
-int parse_extension_release(const char *root, const char *extension, ...) _sentinel_;
-int parse_os_release(const char *root, ...) _sentinel_;
-int load_extension_release_pairs(const char *root, const char *extension, char ***ret);
-int load_os_release_pairs(const char *root, char ***ret);
-int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret);