]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fdisk_set_disklabel_id_from_string()
authorKarel Zak <kzak@redhat.com>
Tue, 14 Jan 2020 10:43:24 +0000 (11:43 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 23 Jan 2020 14:50:12 +0000 (15:50 +0100)
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
libfdisk/src/dos.c
libfdisk/src/fdiskP.h
libfdisk/src/gpt.c
libfdisk/src/label.c
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym

index f148da5271e04256f9215dafe1042868a853447e..6675c1100e22aef994452899038e49f6d81ce28c 100644 (file)
@@ -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
index 53713ec5ffd9d2ee98f77f42c5d6e5d3860f7c4d..98314dfa61edc52e82070accc0d63db9a4eb36d0 100644 (file)
@@ -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;
index fefebae2a9dfd41e74e8168fc1ce7dd372928220..0487466e3a96b8bd166d72163899db07ab769e8a 100644 (file)
@@ -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 */
index f50bb4441f8ceecc038b7ac4ad00a2039c741643..9608053a245f283fc1545e673c8bc56a33489c14 100644 (file)
@@ -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."));
index a18cdeaffbf7d576c4891fd82d8808202bfd87d5..fd4555de2ed415e321cd0cb4d62ffa8126847a62 100644 (file)
@@ -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);
 }
 
 /**
index 0669c0a7c3063eaa44a76b03ac6cb71fc5a99648..2ba34dc0ac64503f8eec02408e9433a57d024090 100644 (file)
@@ -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);
index 96fcadd7130326e27e91732edaf958df72151fc0..eee2d6bda57b920e4c0cef4ccd45c825642ccddd 100644 (file)
@@ -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;