]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dissect-image: Return mount point fd if requested
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 22 Dec 2022 12:00:31 +0000 (13:00 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 17 Feb 2023 13:58:55 +0000 (14:58 +0100)
13 files changed:
src/analyze/analyze.c
src/boot/bootctl.c
src/coredump/coredumpctl.c
src/firstboot/firstboot.c
src/journal/journalctl.c
src/machine-id-setup/machine-id-setup-main.c
src/partition/repart.c
src/shared/dissect-image.c
src/shared/dissect-image.h
src/systemctl/systemctl.c
src/sysupdate/sysupdate.c
src/sysusers/sysusers.c
src/tmpfiles/tmpfiles.c

index ef2e60962b3e346ad46a6014c6da832cededdfcf..aaa7e4b706ae71ebd6d19be0ecb012051af87e3d 100644 (file)
@@ -625,6 +625,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_RELAX_VAR_CHECK |
                                 DISSECT_IMAGE_READ_ONLY,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 914825564ebed106531d100be0cd573c29300054..53794d1b7a1851a73f17a6f9f1e3ade5211f6904 100644 (file)
@@ -467,6 +467,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_GENERIC_ROOT |
                                 DISSECT_IMAGE_RELAX_VAR_CHECK,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 8a4f31aa624a6c97c992e180a9f493ba13236a85..4c312d0fbb964a2d6b51f598a9fef2cf8107279e 100644 (file)
@@ -1366,6 +1366,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_RELAX_VAR_CHECK |
                                 DISSECT_IMAGE_VALIDATE_OS,
                                 &mounted_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 9e79f846916a82b5cc7baa13a4099767c13f3ed2..5eaaff7d8417f522d0bfb1be89add2fa734adb7a 100644 (file)
@@ -1389,6 +1389,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_FSCK |
                                 DISSECT_IMAGE_GROWFS,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 0267fc6506cfc315a9b8af61db916eb690a82421..e10f0b756433653574730c86265433249055f417 100644 (file)
@@ -2125,6 +2125,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_RELAX_VAR_CHECK |
                                 (arg_action == ACTION_UPDATE_CATALOG ? DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS : DISSECT_IMAGE_READ_ONLY),
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 9101f4e11a724bea6e563a40f04d23c21b6a5112..5620bf9bafc750da7c1b8bd155548a846a94fac0 100644 (file)
@@ -147,6 +147,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_FSCK |
                                 DISSECT_IMAGE_GROWFS,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 272bf19431d934aa58ac0f5c9ad8d30e1bfbaf83..0e51f4d8d364d5c6438db6fe140148a881f03003 100644 (file)
@@ -6429,6 +6429,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_USR_NO_ROOT |
                                 DISSECT_IMAGE_REQUIRE_ROOT,
                                 &mounted_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 210e2c7cf7d0f0d546dee11c08f9c591db878e22..9a4bac99a173308a85956a6c5b3468590300138b 100644 (file)
@@ -3315,6 +3315,7 @@ int mount_image_privately_interactively(
                 const char *image,
                 DissectImageFlags flags,
                 char **ret_directory,
+                int *ret_dir_fd,
                 LoopDevice **ret_loop_device) {
 
         _cleanup_(verity_settings_done) VeritySettings verity = VERITY_SETTINGS_DEFAULT;
@@ -3388,6 +3389,16 @@ int mount_image_privately_interactively(
         if (r < 0)
                 return log_error_errno(r, "Failed to relinquish DM and loopback block devices: %m");
 
+        if (ret_dir_fd) {
+                _cleanup_close_ int dir_fd = -EBADF;
+
+                dir_fd = open(created_dir, O_CLOEXEC|O_DIRECTORY);
+                if (dir_fd < 0)
+                        return log_error_errno(errno, "Failed to open mount point directory: %m");
+
+                *ret_dir_fd = TAKE_FD(dir_fd);
+        }
+
         *ret_directory = TAKE_PTR(created_dir);
         *ret_loop_device = TAKE_PTR(d);
 
index 143d6ff501e386ed3ccf3303ba0ad662d55569d7..3efe784ee90a281f86941293f602d8c3ab5af7c4 100644 (file)
@@ -183,7 +183,7 @@ bool dissected_image_verity_candidate(const DissectedImage *image, PartitionDesi
 bool dissected_image_verity_ready(const DissectedImage *image, PartitionDesignator d);
 bool dissected_image_verity_sig_ready(const DissectedImage *image, PartitionDesignator d);
 
-int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, LoopDevice **ret_loop_device);
+int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, int *ret_dir_fd, LoopDevice **ret_loop_device);
 
 int verity_dissect_and_mount(int src_fd, const char *src, const char *dest, const MountOptions *options, const char *required_host_os_release_id, const char *required_host_os_release_version_id, const char *required_host_os_release_sysext_level, const char *required_sysext_scope);
 
index 4732398dd79a13bc643238881452e65a50b38ddc..a752c6dce49a2b8e18fb9ae26e9fa2f7c6b5cc6c 100644 (file)
@@ -1222,6 +1222,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_RELAX_VAR_CHECK |
                                 DISSECT_IMAGE_VALIDATE_OS,
                                 &mounted_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index f6e89130bc3965fee40666aedf85e3d34446fa1f..a3d2c5a9b91b1dfa4102bf6b0ab556f47f9c012b 100644 (file)
@@ -881,6 +881,7 @@ static int process_image(
                         DISSECT_IMAGE_GENERIC_ROOT |
                         DISSECT_IMAGE_REQUIRE_ROOT,
                         &mounted_dir,
+                        /* ret_dir_fd= */ NULL,
                         &loop_device);
         if (r < 0)
                 return r;
index 3c438a38f11b058ca541a0ca65ddff01a011ad48..70abcfa1317429f223e28f558d802f3d62dd3967 100644 (file)
@@ -2180,6 +2180,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_FSCK |
                                 DISSECT_IMAGE_GROWFS,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;
index 458aed7054163544eb5b73030697f7449cee2f88..04a860c0215acbe04c0e393f613e2705486b5f6a 100644 (file)
@@ -4142,6 +4142,7 @@ static int run(int argc, char *argv[]) {
                                 DISSECT_IMAGE_FSCK |
                                 DISSECT_IMAGE_GROWFS,
                                 &unlink_dir,
+                                /* ret_dir_fd= */ NULL,
                                 &loop_device);
                 if (r < 0)
                         return r;