]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fdisk_partition_get_max_size
authorThomas Weißschuh <thomas@t-8ch.de>
Tue, 14 Nov 2023 16:53:21 +0000 (17:53 +0100)
committerThomas Weißschuh <thomas@t-8ch.de>
Tue, 14 Nov 2023 20:55:36 +0000 (21:55 +0100)
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
libfdisk/docs/libfdisk-sections.txt
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym
libfdisk/src/partition.c

index 1589413b86d008bfa8e3d40b314d479d51cd2de6..efc138571d28009396e2a5505cfe2acede4f45b7 100644 (file)
@@ -182,6 +182,7 @@ fdisk_partition_get_size
 fdisk_partition_get_start
 fdisk_partition_get_type
 fdisk_partition_get_uuid
+fdisk_partition_get_max_size
 fdisk_partition_has_end
 fdisk_partition_has_partno
 fdisk_partition_has_size
index 1c9714975aafa1a6dad267f95b27ca3752f27943..9c20f44bebff28c658cb2e3e7b1c6312056df719 100644 (file)
@@ -540,6 +540,9 @@ extern int fdisk_reorder_partitions(struct fdisk_context *cxt);
 
 extern int fdisk_partition_has_wipe(struct fdisk_context *cxt, struct fdisk_partition *pa);
 
+extern int fdisk_partition_get_max_size(struct fdisk_context *cxt, size_t n,
+                                       fdisk_sector_t *maxsz);
+
 
 /* table.c */
 extern struct fdisk_table *fdisk_new_table(void);
index 71de80589ccf259d5ac0653e9956e57978f13000..bb69e93c41033eb4f6e6c32e7561e8f031ff70ba 100644 (file)
@@ -320,3 +320,7 @@ FDISK_2.36 {
 FDISK_2.38 {
        fdisk_dos_fix_chs;
 } FDISK_2.36;
+
+FDISK_2.40 {
+       fdisk_partition_get_max_size;
+} FDISK_2.38;
index bf3afadb13e1d76994ac32cb46a82dc1eca02a1f..1fd3176a6d9feb1bb27e00a2c9a36a371df05fb7 100644 (file)
@@ -1625,3 +1625,55 @@ int fdisk_is_partition_used(struct fdisk_context *cxt, size_t n)
        return cxt->label->op->part_is_used(cxt, n);
 }
 
+
+/**
+ * fdisk_partition_max_size:
+ * @cxt: context
+ * @n: partition number (0 is the first partition)
+ * @maxsz: returns maximum size of partition
+ *
+ * Find maximum size the partition can be resized to.
+ * Takes into account free space between this partition and the next one.
+ *
+ * Returns: 0 on success, <0 on error.
+ */
+int fdisk_partition_get_max_size(struct fdisk_context *cxt, size_t n,
+                                fdisk_sector_t *maxsz)
+{
+       struct fdisk_partition *cur = NULL;
+       struct fdisk_table *tb = NULL;
+       int rc;
+
+       rc = fdisk_get_partitions(cxt, &tb);
+       if (rc)
+               goto out;
+
+       rc = fdisk_get_freespaces(cxt, &tb);
+       if (rc)
+               goto out;
+
+       rc = fdisk_table_sort_partitions(tb, fdisk_partition_cmp_start);
+       if (rc)
+               goto out;
+
+       cur = fdisk_table_get_partition_by_partno(tb, n);
+       if (!cur)
+               goto einval;
+
+       if (!fdisk_partition_has_start(cur))
+               goto einval;
+
+       if (resize_get_last_possible(tb, cur,
+                                    fdisk_partition_get_start(cur), maxsz))
+               goto einval;
+
+out:
+       fdisk_unref_partition(cur);
+       fdisk_unref_table(tb);
+
+       return rc;
+
+einval:
+       rc = -EINVAL;
+       goto out;
+}