]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
portable: support .mstack images
authorLennart Poettering <lennart@amutable.com>
Tue, 25 Nov 2025 08:01:36 +0000 (09:01 +0100)
committerLennart Poettering <lennart@amutable.com>
Thu, 19 Feb 2026 14:05:15 +0000 (15:05 +0100)
src/portable/portable.c

index ed249fed9bc1adc81fec6bcafa52f01ce294d398..191125b9c58bfb65057d2f59c9ea74f58d1de3d7 100644 (file)
@@ -1267,11 +1267,36 @@ void portable_changes_free(PortableChange *changes, size_t n_changes) {
 }
 
 static const char *root_setting_from_image(ImageType type) {
-        return IN_SET(type, IMAGE_DIRECTORY, IMAGE_SUBVOLUME) ? "RootDirectory=" : "RootImage=";
+        switch (type) {
+        case IMAGE_DIRECTORY:
+        case IMAGE_SUBVOLUME:
+                return "RootDirectory=";
+
+        case IMAGE_RAW:
+        case IMAGE_BLOCK:
+                return "RootImage=";
+
+        case IMAGE_MSTACK:
+                return "RootMStack=";
+
+        default:
+                return NULL;
+        }
 }
 
 static const char *extension_setting_from_image(ImageType type) {
-        return IN_SET(type, IMAGE_DIRECTORY, IMAGE_SUBVOLUME) ? "ExtensionDirectories=" : "ExtensionImages=";
+        switch (type) {
+        case IMAGE_DIRECTORY:
+        case IMAGE_SUBVOLUME:
+                return "ExtensionDirectories=";
+
+        case IMAGE_RAW:
+        case IMAGE_BLOCK:
+                return "ExtensionImages=";
+
+        default:
+                return NULL;
+        }
 }
 
 static int make_marker_text(const char *image_path, OrderedHashmap *extension_images, char **ret_text) {
@@ -1401,6 +1426,8 @@ static int install_chroot_dropin(
                 Image *ext;
 
                 root_type = root_setting_from_image(type);
+                if (!root_type)
+                        return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Image type '%s' not supported as portable service.", image_type_to_string(type));
 
                 r = path_extract_filename(m->image_path ?: image_path, &base_name);
                 if (r < 0)
@@ -1453,15 +1480,19 @@ static int install_chroot_dropin(
 
                 if (m->image_path && !path_equal(m->image_path, image_path))
                         ORDERED_HASHMAP_FOREACH(ext, extension_images) {
-                                _cleanup_free_ char *extension_base_name = NULL;
 
+                                const char *extension_setting = extension_setting_from_image(ext->type);
+                                if (!extension_setting)
+                                        return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Image type '%s' not supported for extensions: %m", image_type_to_string(ext->type));
+
+                                _cleanup_free_ char *extension_base_name = NULL;
                                 r = path_extract_filename(ext->path, &extension_base_name);
                                 if (r < 0)
                                         return log_debug_errno(r, "Failed to extract basename from '%s': %m", ext->path);
 
                                 if (!strextend(&text,
                                                "\n",
-                                               extension_setting_from_image(ext->type),
+                                               extension_setting,
                                                ext->path,
                                                /* With --force tell PID1 to avoid enforcing that the image <name> and
                                                 * extension-release.<name> have to match. */