|
@@ -0,0 +1,194 @@
|
|
|
+From e5f31446166de7212213c62a019945afb8e197ef Mon Sep 17 00:00:00 2001
|
|
|
+From: Karel Zak <kzak@redhat.com>
|
|
|
+Date: Tue, 14 Jan 2020 11:43:24 +0100
|
|
|
+Subject: [PATCH] libfdisk: add fdisk_set_disklabel_id_from_string()
|
|
|
+
|
|
|
+We have fdisk_set_disklabel_id(), but it's old ask-API based function.
|
|
|
+It's not comfortable if you want to avoid dialog or template.
|
|
|
+
|
|
|
+Addresses: https://github.com/karelzak/util-linux/issues/916
|
|
|
+Signed-off-by: Karel Zak <kzak@redhat.com>
|
|
|
+---
|
|
|
+ libfdisk/docs/libfdisk-sections.txt | 1 +
|
|
|
+ libfdisk/src/dos.c | 29 ++++++++++++++++++-----------
|
|
|
+ libfdisk/src/fdiskP.h | 2 +-
|
|
|
+ libfdisk/src/gpt.c | 18 ++++++++++--------
|
|
|
+ libfdisk/src/label.c | 19 ++++++++++++++++++-
|
|
|
+ libfdisk/src/libfdisk.h.in | 1 +
|
|
|
+ libfdisk/src/libfdisk.sym | 3 +++
|
|
|
+ 7 files changed, 52 insertions(+), 21 deletions(-)
|
|
|
+
|
|
|
+diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt
|
|
|
+index f148da527..6675c1100 100644
|
|
|
+--- a/libfdisk/docs/libfdisk-sections.txt
|
|
|
++++ b/libfdisk/docs/libfdisk-sections.txt
|
|
|
+@@ -81,6 +81,7 @@ fdisk_list_disklabel
|
|
|
+ fdisk_locate_disklabel
|
|
|
+ fdisk_reorder_partitions
|
|
|
+ fdisk_set_disklabel_id
|
|
|
++fdisk_set_disklabel_id_from_string
|
|
|
+ fdisk_set_partition_type
|
|
|
+ fdisk_toggle_partition_flag
|
|
|
+ fdisk_verify_disklabel
|
|
|
+diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c
|
|
|
+index 53713ec5f..98314dfa6 100644
|
|
|
+--- a/libfdisk/src/dos.c
|
|
|
++++ b/libfdisk/src/dos.c
|
|
|
+@@ -707,12 +707,12 @@ static int dos_create_disklabel(struct fdisk_context *cxt)
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+-static int dos_set_disklabel_id(struct fdisk_context *cxt)
|
|
|
++static int dos_set_disklabel_id(struct fdisk_context *cxt, const char *str)
|
|
|
+ {
|
|
|
+- char *end = NULL, *str = NULL;
|
|
|
++ char *str0 = str;
|
|
|
+ unsigned int id, old;
|
|
|
+ struct fdisk_dos_label *l;
|
|
|
+- int rc;
|
|
|
++ int rc = 0;
|
|
|
+
|
|
|
+ assert(cxt);
|
|
|
+ assert(cxt->label);
|
|
|
+@@ -722,18 +722,25 @@ static int dos_set_disklabel_id(struct fdisk_context *cxt)
|
|
|
+
|
|
|
+ l = self_label(cxt);
|
|
|
+ old = mbr_get_id(cxt->firstsector);
|
|
|
+- rc = fdisk_ask_string(cxt,
|
|
|
++
|
|
|
++ if (!str)
|
|
|
++ rc = fdisk_ask_string(cxt,
|
|
|
+ _("Enter the new disk identifier"), &str);
|
|
|
+- if (rc)
|
|
|
+- return rc;
|
|
|
++ if (!rc) {
|
|
|
++ char *end = NULL;
|
|
|
+
|
|
|
+- errno = 0;
|
|
|
+- id = strtoul(str, &end, 0);
|
|
|
+- if (errno || str == end || (end && *end)) {
|
|
|
+- fdisk_warnx(cxt, _("Incorrect value."));
|
|
|
+- return -EINVAL;
|
|
|
++ errno = 0;
|
|
|
++ id = strtoul(str, &end, 0);
|
|
|
++ if (errno || str == end || (end && *end)) {
|
|
|
++ fdisk_warnx(cxt, _("Incorrect value."));
|
|
|
++ rc = -EINVAL;
|
|
|
++ }
|
|
|
+ }
|
|
|
+
|
|
|
++ if (!str0)
|
|
|
++ free(str);
|
|
|
++ if (rc)
|
|
|
++ return -EINVAL;
|
|
|
+
|
|
|
+ mbr_set_id(cxt->firstsector, id);
|
|
|
+ l->non_pt_changed = 1;
|
|
|
+diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
|
|
|
+index fefebae2a..0487466e3 100644
|
|
|
+--- a/libfdisk/src/fdiskP.h
|
|
|
++++ b/libfdisk/src/fdiskP.h
|
|
|
+@@ -220,7 +220,7 @@ struct fdisk_label_operations {
|
|
|
+ /* get details from label */
|
|
|
+ int (*get_item)(struct fdisk_context *cxt, struct fdisk_labelitem *item);
|
|
|
+ /* set disk label ID */
|
|
|
+- int (*set_id)(struct fdisk_context *cxt);
|
|
|
++ int (*set_id)(struct fdisk_context *cxt, const char *str);
|
|
|
+
|
|
|
+
|
|
|
+ /* new partition */
|
|
|
+diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c
|
|
|
+index f50bb4441..9608053a2 100644
|
|
|
+--- a/libfdisk/src/gpt.c
|
|
|
++++ b/libfdisk/src/gpt.c
|
|
|
+@@ -2502,11 +2502,11 @@ done:
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+-static int gpt_set_disklabel_id(struct fdisk_context *cxt)
|
|
|
++static int gpt_set_disklabel_id(struct fdisk_context *cxt, const char *str)
|
|
|
+ {
|
|
|
+ struct fdisk_gpt_label *gpt;
|
|
|
+ struct gpt_guid uuid;
|
|
|
+- char *str, *old, *new;
|
|
|
++ char *old, *new;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ assert(cxt);
|
|
|
+@@ -2514,12 +2514,14 @@ static int gpt_set_disklabel_id(struct fdisk_context *cxt)
|
|
|
+ assert(fdisk_is_label(cxt, GPT));
|
|
|
+
|
|
|
+ gpt = self_label(cxt);
|
|
|
+- if (fdisk_ask_string(cxt,
|
|
|
+- _("Enter new disk UUID (in 8-4-4-4-12 format)"), &str))
|
|
|
+- return -EINVAL;
|
|
|
+-
|
|
|
+- rc = string_to_guid(str, &uuid);
|
|
|
+- free(str);
|
|
|
++ if (!str) {
|
|
|
++ if (fdisk_ask_string(cxt,
|
|
|
++ _("Enter new disk UUID (in 8-4-4-4-12 format)"), &str))
|
|
|
++ return -EINVAL;
|
|
|
++ rc = string_to_guid(str, &uuid);
|
|
|
++ free(str);
|
|
|
++ } else
|
|
|
++ rc = string_to_guid(str, &uuid);
|
|
|
+
|
|
|
+ if (rc) {
|
|
|
+ fdisk_warnx(cxt, _("Failed to parse your UUID."));
|
|
|
+diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
|
|
|
+index a18cdeaff..fd4555de2 100644
|
|
|
+--- a/libfdisk/src/label.c
|
|
|
++++ b/libfdisk/src/label.c
|
|
|
+@@ -481,7 +481,24 @@ int fdisk_set_disklabel_id(struct fdisk_context *cxt)
|
|
|
+ return -ENOSYS;
|
|
|
+
|
|
|
+ DBG(CXT, ul_debugobj(cxt, "setting %s disk ID", cxt->label->name));
|
|
|
+- return cxt->label->op->set_id(cxt);
|
|
|
++ return cxt->label->op->set_id(cxt, NULL);
|
|
|
++}
|
|
|
++
|
|
|
++/**
|
|
|
++ * fdisk_set_disklabel_id_from_string
|
|
|
++ * @cxt: fdisk context
|
|
|
++ *
|
|
|
++ * Returns: 0 on success, otherwise, a corresponding error.
|
|
|
++ */
|
|
|
++int fdisk_set_disklabel_id_from_string(struct fdisk_context *cxt, const char *str)
|
|
|
++{
|
|
|
++ if (!cxt || !cxt->label || !str)
|
|
|
++ return -EINVAL;
|
|
|
++ if (!cxt->label->op->set_id)
|
|
|
++ return -ENOSYS;
|
|
|
++
|
|
|
++ DBG(CXT, ul_debugobj(cxt, "setting %s disk ID from '%s'", cxt->label->name, str));
|
|
|
++ return cxt->label->op->set_id(cxt, str);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
|
|
|
+index 0669c0a7c..2ba34dc0a 100644
|
|
|
+--- a/libfdisk/src/libfdisk.h.in
|
|
|
++++ b/libfdisk/src/libfdisk.h.in
|
|
|
+@@ -399,6 +399,7 @@ extern int fdisk_get_disklabel_item(struct fdisk_context *cxt, int id, struct fd
|
|
|
+
|
|
|
+ extern int fdisk_get_disklabel_id(struct fdisk_context *cxt, char **id);
|
|
|
+ extern int fdisk_set_disklabel_id(struct fdisk_context *cxt);
|
|
|
++extern int fdisk_set_disklabel_id_from_string(struct fdisk_context *cxt, const char *str);
|
|
|
+
|
|
|
+ extern int fdisk_get_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition **pa);
|
|
|
+ extern int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa);
|
|
|
+diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym
|
|
|
+index 96fcadd71..eee2d6bda 100644
|
|
|
+--- a/libfdisk/src/libfdisk.sym
|
|
|
++++ b/libfdisk/src/libfdisk.sym
|
|
|
+@@ -308,3 +308,6 @@ FDISK_2.35 {
|
|
|
+ fdisk_script_set_table;
|
|
|
+ fdisk_assign_device_by_fd;
|
|
|
+ } FDISK_2.33;
|
|
|
++FDISK_2.36 {
|
|
|
++ fdisk_set_disklabel_id_from_string;
|
|
|
++} FDISK_2.35;
|
|
|
+--
|
|
|
+2.18.2
|
|
|
+
|