]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machine-image: extend search path
authorLennart Poettering <lennart@poettering.net>
Tue, 17 Apr 2018 09:08:54 +0000 (11:08 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 24 May 2018 15:01:57 +0000 (17:01 +0200)
This adds directories in /etc and /run to the search paths for OS
images. While it doesn't make much sense to actually place huge disk
images there, it's good enough for symlinks to those.

The main reason for supporting this is that this allows us to neatly
symlink portable image files located outside of the search path into the
search path when attaching them, so that attaching them also means they
are discoverable properly for all commands.

src/shared/machine-image.c
src/shared/machine-image.h

index 41e9513abc1923379a2c5649d7eedd8ca4fe2e13..d97b522bdb28f4011e4efc9ce7f8dcb0f48b0da5 100644 (file)
 #include "xattr-util.h"
 
 static const char* const image_search_path[_IMAGE_CLASS_MAX] = {
-        [IMAGE_MACHINE] =  "/var/lib/machines\0"
-                           "/var/lib/container\0" /* legacy */
+        [IMAGE_MACHINE] =  "/etc/machines\0"              /* only place symlinks here */
+                           "/run/machines\0"              /* and here too */
+                           "/var/lib/machines\0"          /* the main place for images */
+                           "/var/lib/container\0"         /* legacy */
                            "/usr/local/lib/machines\0"
                            "/usr/lib/machines\0",
 
-        [IMAGE_PORTABLE] = "/var/lib/portables\0"
+        [IMAGE_PORTABLE] = "/etc/portables\0"             /* only place symlinks here */
+                           "/run/portables\0"             /* and here too */
+                           "/var/lib/portables\0"         /* the main place for images */
                            "/usr/local/lib/portables\0"
                            "/usr/lib/portables\0",
 };
@@ -1224,6 +1228,35 @@ bool image_name_is_valid(const char *s) {
         return true;
 }
 
+bool image_in_search_path(ImageClass class, const char *image) {
+        const char *path;
+
+        assert(image);
+
+        NULSTR_FOREACH(path, image_search_path[class]) {
+                const char *p;
+                size_t k;
+
+                p = path_startswith(image, path);
+                if (!p)
+                        continue;
+
+                /* Make sure there's a filename following */
+                k = strcspn(p, "/");
+                if (k == 0)
+                        continue;
+
+                p += k;
+
+                /* Accept trailing slashes */
+                if (p[strspn(p, "/")] == 0)
+                        return true;
+
+        }
+
+        return false;
+}
+
 static const char* const image_type_table[_IMAGE_TYPE_MAX] = {
         [IMAGE_DIRECTORY] = "directory",
         [IMAGE_SUBVOLUME] = "subvolume",
index 7e09e8002a7bf886f1cfbc707fdf4f8e751d8626..60868fac9457173562450805affe92c589dbd1de 100644 (file)
@@ -92,6 +92,8 @@ int image_set_limit(Image *i, uint64_t referenced_max);
 
 int image_read_metadata(Image *i);
 
+bool image_in_search_path(ImageClass class, const char *image);
+
 static inline bool IMAGE_IS_HIDDEN(const struct Image *i) {
         assert(i);