summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libfdisk/docs/libfdisk-sections.txt1
-rw-r--r--libfdisk/src/label.c41
-rw-r--r--libfdisk/src/libfdisk.h.in5
-rw-r--r--libfdisk/src/libfdisk.sym11
4 files changed, 53 insertions, 5 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt
index 02b775ea6..ea35e2bc5 100644
--- a/libfdisk/docs/libfdisk-sections.txt
+++ b/libfdisk/docs/libfdisk-sections.txt
@@ -101,6 +101,7 @@ fdisk_is_label
fdisk_label_get_field
fdisk_label_get_field_by_name
fdisk_label_get_fields_ids
+fdisk_label_get_fields_ids_all
fdisk_label_get_name
fdisk_label_get_nparttypes
fdisk_label_get_parttype
diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
index 717a8cd80..dd9fef040 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -157,6 +157,47 @@ int fdisk_label_get_fields_ids(
}
/**
+ * fdisk_label_get_fields_ids_all
+ * @lb: label (or NULL for the current label)
+ * @cxt: context
+ * @ids: returns allocated array with FDISK_FIELD_* IDs
+ * @nids: returns number of items in fields
+ *
+ * This function returns all fields for the label.
+ *
+ * Returns: 0 on success, otherwise, a corresponding error.
+ */
+int fdisk_label_get_fields_ids_all(
+ const struct fdisk_label *lb,
+ struct fdisk_context *cxt,
+ int **ids, size_t *nids)
+{
+ size_t i, n;
+ int *c;
+
+ assert(cxt);
+
+ if (!lb)
+ lb = cxt->label;
+ if (!lb)
+ return -EINVAL;
+ if (!lb->fields || !lb->nfields)
+ return -ENOSYS;
+ c = calloc(lb->nfields, sizeof(int));
+ if (!c)
+ return -ENOMEM;
+ for (n = 0, i = 0; i < lb->nfields; i++)
+ c[n++] = lb->fields[i].id;
+ if (ids)
+ *ids = c;
+ else
+ free(c);
+ if (nids)
+ *nids = n;
+ return 0;
+}
+
+/**
* fdisk_label_get_field:
* @lb: label
* @id: FDISK_FIELD_*
diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
index a5a465674..bfb22a2f7 100644
--- a/libfdisk/src/libfdisk.h.in
+++ b/libfdisk/src/libfdisk.h.in
@@ -308,6 +308,11 @@ extern int fdisk_label_get_fields_ids(
struct fdisk_context *cxt,
int **ids, size_t *nids);
+extern int fdisk_label_get_fields_ids_all(
+ const struct fdisk_label *lb,
+ struct fdisk_context *cxt,
+ int **ids, size_t *nids);
+
extern const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, int id);
extern const struct fdisk_field *fdisk_label_get_field_by_name(
const struct fdisk_label *lb,
diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym
index 1e6394465..15c268ee3 100644
--- a/libfdisk/src/libfdisk.sym
+++ b/libfdisk/src/libfdisk.sym
@@ -241,12 +241,13 @@ local:
};
FDISK_2.27 {
- fdisk_script_set_fgets;
- fdisk_script_set_userdata;
- fdisk_script_get_userdata;
fdisk_enable_bootbits_protection;
- fdisk_has_protected_bootbits;
- fdisk_table_get_partition_by_partno;
fdisk_gpt_get_partition_attrs;
fdisk_gpt_set_partition_attrs;
+ fdisk_has_protected_bootbits;
+ fdisk_label_get_fields_ids_all;
+ fdisk_script_get_userdata;
+ fdisk_script_set_fgets;
+ fdisk_script_set_userdata;
+ fdisk_table_get_partition_by_partno;
} FDISK_2.26;