From: Thomas Weißschuh Date: Tue, 14 Nov 2023 16:53:21 +0000 (+0100) Subject: libfdisk: add fdisk_partition_get_max_size X-Git-Tag: v2.40-rc1~157^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ee1a36cdd02dd09aba9a3e40c52efdc04c60f14;p=thirdparty%2Futil-linux.git libfdisk: add fdisk_partition_get_max_size Signed-off-by: Thomas Weißschuh --- diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index 1589413b86..efc138571d 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -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 diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 1c9714975a..9c20f44beb 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -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); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index 71de80589c..bb69e93c41 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -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; diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c index bf3afadb13..1fd3176a6d 100644 --- a/libfdisk/src/partition.c +++ b/libfdisk/src/partition.c @@ -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; +}