From: Karel Zak Date: Tue, 30 Apr 2013 09:57:30 +0000 (+0200) Subject: libfdisk: add list() label operation X-Git-Tag: v2.24-rc1~264 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3c5fb4757fa2ca0e4c30b9ec65ec87af2cc60bcb;p=thirdparty%2Futil-linux.git libfdisk: add list() label operation ... and use it for GPT Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c index 33049da182..3da40b6a98 100644 --- a/fdisks/fdisk.c +++ b/fdisks/fdisk.c @@ -668,18 +668,14 @@ static void list_table(struct fdisk_context *cxt, int xtra) list_disk_geometry(cxt); - if (fdisk_is_disklabel(cxt, GPT)) { - gpt_list_table(cxt, xtra); - return; - } - - if (fdisk_is_disklabel(cxt, OSF)) { + if (fdisk_is_disklabel(cxt, OSF)) xbsd_print_disklabel(cxt, xtra); - return; - } - if (fdisk_is_disklabel(cxt, DOS)) + else if (fdisk_is_disklabel(cxt, DOS)) dos_list_table(cxt, xtra); + else + fdisk_list_disklabel(cxt); + } static void verify(struct fdisk_context *cxt) diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 01b9ec6f42..c4d61b6c56 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -145,6 +145,9 @@ struct fdisk_label_operations { int (*verify)(struct fdisk_context *cxt); /* create new disk label */ int (*create)(struct fdisk_context *cxt); + /* list partition table */ + int (*list)(struct fdisk_context *cxt); + /* new partition */ int (*part_add)(struct fdisk_context *cxt, size_t partnum, diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index bceb09b052..5a434e9465 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -1137,9 +1137,9 @@ static char *encode_to_utf8(unsigned char *src, size_t count) * requirements, but once partition semantics are added to the fdisk * API it can be removed for custom implementation (see gpt_label struct). */ -void gpt_list_table(struct fdisk_context *cxt, - int xtra __attribute__ ((__unused__))) +static int gpt_list_disklabel(struct fdisk_context *cxt) { + int rc; uint32_t i; struct fdisk_gpt_label *gpt; uint64_t fu; @@ -1156,7 +1156,8 @@ void gpt_list_table(struct fdisk_context *cxt, tb = tt_new_table(TT_FL_FREEDATA); if (!tb) - return; /* ENOMEM */ + return -ENOMEM; + tt_define_column(tb, "#", 2, TT_FL_RIGHT); tt_define_column(tb, "Start", 12, TT_FL_RIGHT); tt_define_column(tb, "End", 12, TT_FL_RIGHT); @@ -1203,8 +1204,10 @@ void gpt_list_table(struct fdisk_context *cxt, fdisk_free_parttype(t); } - fdisk_print_table(cxt, tb); + rc = fdisk_print_table(cxt, tb); tt_free_table(tb); + + return rc; } /* @@ -1856,6 +1859,7 @@ static const struct fdisk_label_operations gpt_operations = .write = gpt_write_disklabel, .verify = gpt_verify_disklabel, .create = gpt_create_disklabel, + .list = gpt_list_disklabel, .part_add = gpt_add_partition, .part_delete = gpt_delete_partition, .part_get_type = gpt_get_partition_type, diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c index cc21f759ec..d518d876de 100644 --- a/libfdisk/src/label.c +++ b/libfdisk/src/label.c @@ -98,6 +98,24 @@ int fdisk_verify_disklabel(struct fdisk_context *cxt) return cxt->label->op->verify(cxt); } +/** + * fdisk_list_disklabel: + * @cxt: fdisk context + * + * Lists in-memory partition table + * + * Returns 0 on success, otherwise, a corresponding error. + */ +int fdisk_list_disklabel(struct fdisk_context *cxt) +{ + if (!cxt || !cxt->label) + return -EINVAL; + if (!cxt->label->op->list) + return -ENOSYS; + + return cxt->label->op->list(cxt); +} + /** * fdisk_add_partition: * @cxt: fdisk context diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index c3e6ad582d..343eece81f 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -112,6 +112,7 @@ extern int fdisk_dev_is_disklabel(struct fdisk_context *cxt, enum fdisk_labeltyp extern int fdisk_write_disklabel(struct fdisk_context *cxt); extern int fdisk_verify_disklabel(struct fdisk_context *cxt); extern int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name); +extern int fdisk_list_disklabel(struct fdisk_context *cxt); extern int fdisk_add_partition(struct fdisk_context *cxt, struct fdisk_parttype *t); extern int fdisk_delete_partition(struct fdisk_context *cxt, size_t partnum);