]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fdisk-util: Make fdisk_new_context_fd() more generic
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 14 Aug 2023 08:27:57 +0000 (10:27 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 14 Aug 2023 08:27:57 +0000 (10:27 +0200)
Let's make this an openat() style function so we can also pass a
device path.

src/home/homework-luks.c
src/partition/repart.c
src/shared/fdisk-util.c
src/shared/fdisk-util.h

index 7f23d1e158678322a3a2be348364b16c711006d5..5920fbb732c47a71aa84d198646c93597634e1f1 100644 (file)
@@ -1870,7 +1870,7 @@ static int make_partition_table(
         if (r < 0)
                 return log_error_errno(r, "Failed to initialize partition type: %m");
 
-        r = fdisk_new_context_fd(fd, /* read_only= */ false, sector_size, &c);
+        r = fdisk_new_context_at(fd, /* path= */ NULL, /* read_only= */ false, sector_size, &c);
         if (r < 0)
                 return log_error_errno(r, "Failed to open device: %m");
 
@@ -2698,7 +2698,7 @@ static int prepare_resize_partition(
                 return 0;
         }
 
-        r = fdisk_new_context_fd(fd, /* read_only= */ false, UINT32_MAX, &c);
+        r = fdisk_new_context_at(fd, /* path= */ NULL, /* read_only= */ false, UINT32_MAX, &c);
         if (r < 0)
                 return log_error_errno(r, "Failed to open device: %m");
 
@@ -2855,7 +2855,7 @@ static int apply_resize_partition(
         if ((size_t) n != ssz * 2)
                 return log_error_errno(SYNTHETIC_ERRNO(EIO), "Short write while wiping partition table.");
 
-        r = fdisk_new_context_fd(fd, /* read_only= */ false, ssz, &c);
+        r = fdisk_new_context_at(fd, /* path= */ NULL, /* read_only= */ false, ssz, &c);
         if (r < 0)
                 return log_error_errno(r, "Failed to open device: %m");
 
index 88669db5865c2d6e14cce3acfd3e1281c938e47f..52b03ec7f0ab2300a99b1f0868c25bc12649ae7d 100644 (file)
@@ -1924,7 +1924,7 @@ static int context_copy_from_one(Context *context, const char *src) {
         if (r < 0)
                 return log_error_errno(r, "%s is not a file: %m", src);
 
-        r = fdisk_new_context_fd(fd, /* read_only = */ true, /* sector_size = */ UINT32_MAX, &c);
+        r = fdisk_new_context_at(fd, /* path = */ NULL, /* read_only = */ true, /* sector_size = */ UINT32_MAX, &c);
         if (r < 0)
                 return log_error_errno(r, "Failed to create fdisk context: %m");
 
@@ -6931,7 +6931,7 @@ static int resize_pt(int fd, uint64_t sector_size) {
          * possession of the enlarged backing file. For this it suffices to open the device with libfdisk and
          * immediately write it again, with no changes. */
 
-        r = fdisk_new_context_fd(fd, /* read_only= */ false, sector_size, &c);
+        r = fdisk_new_context_at(fd, /* path= */ NULL, /* read_only= */ false, sector_size, &c);
         if (r < 0)
                 return log_error_errno(r, "Failed to open device '%s': %m", FORMAT_PROC_FD_PATH(fd));
 
index 9a301f38ac3017fca3fd887699fa8752385dc32c..20f32d19affe439ef6b59489524963108af62162 100644 (file)
@@ -8,26 +8,34 @@
 
 #if HAVE_LIBFDISK
 
-int fdisk_new_context_fd(
-                int fd,
+int fdisk_new_context_at(
+                int dir_fd,
+                const char *path,
                 bool read_only,
                 uint32_t sector_size,
                 struct fdisk_context **ret) {
 
         _cleanup_(fdisk_unref_contextp) struct fdisk_context *c = NULL;
+        _cleanup_close_ int fd = -EBADF;
         int r;
 
+        assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
         assert(ret);
 
-        if (fd < 0)
-                return -EBADF;
+        if (!isempty(path)) {
+                fd = openat(dir_fd, path, (read_only ? O_RDONLY : O_RDWR)|O_CLOEXEC);
+                if (fd < 0)
+                        return -errno;
+
+                dir_fd = fd;
+        }
 
         c = fdisk_new_context();
         if (!c)
                 return -ENOMEM;
 
         if (sector_size == UINT32_MAX) {
-                r = probe_sector_size_prefer_ioctl(fd, &sector_size);
+                r = probe_sector_size_prefer_ioctl(dir_fd, &sector_size);
                 if (r < 0)
                         return r;
         }
@@ -38,7 +46,7 @@ int fdisk_new_context_fd(
                         return r;
         }
 
-        r = fdisk_assign_device(c, FORMAT_PROC_FD_PATH(fd), read_only);
+        r = fdisk_assign_device(c, FORMAT_PROC_FD_PATH(dir_fd), read_only);
         if (r < 0)
                 return r;
 
index b82ff705d77f9ea30a311efc219edbfe3ad75f6f..a72a596f4728daff38e4f6b3ff1362fcde8a3bf3 100644 (file)
@@ -14,7 +14,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct fdisk_partition*, fdisk_unref_partition,
 DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct fdisk_parttype*, fdisk_unref_parttype, NULL);
 DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct fdisk_table*, fdisk_unref_table, NULL);
 
-int fdisk_new_context_fd(int fd, bool read_only, uint32_t sector_size, struct fdisk_context **ret);
+int fdisk_new_context_at(int dir_fd, const char *path, bool read_only, uint32_t sector_size, struct fdisk_context **ret);
 
 int fdisk_partition_get_uuid_as_id128(struct fdisk_partition *p, sd_id128_t *ret);
 int fdisk_partition_get_type_as_id128(struct fdisk_partition *p, sd_id128_t *ret);