summaryrefslogtreecommitdiffstats
path: root/libfdisk
diff options
context:
space:
mode:
Diffstat (limited to 'libfdisk')
-rw-r--r--libfdisk/src/fdiskP.h3
-rw-r--r--libfdisk/src/gpt.c12
-rw-r--r--libfdisk/src/label.c18
-rw-r--r--libfdisk/src/libfdisk.h1
4 files changed, 30 insertions, 4 deletions
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index 01b9ec6f4..c4d61b6c5 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 bceb09b05..5a434e946 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 cc21f759e..d518d876d 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -99,6 +99,24 @@ int fdisk_verify_disklabel(struct fdisk_context *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
* @t: partition type to create or NULL for label-specific default
diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
index c3e6ad582..343eece81 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);