]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add asktype "string" and support UUID partition change
authorKarel Zak <kzak@redhat.com>
Wed, 15 May 2013 11:33:24 +0000 (13:33 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:46:54 +0000 (16:46 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk-ask.c
fdisks/fdisk.c

index 11c4dd5ff1649e316ff054f94424579d1aff52ac..439552f296b310b68b2b9d1eb965650eb16177a5 100644 (file)
@@ -8,6 +8,7 @@
 #include "c.h"
 #include "strutils.h"
 #include "rpmatch.h"
+#include "xalloc.h"
 
 #include "fdisk.h"
 
@@ -196,12 +197,23 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
                fputs(fdisk_ask_get_query(ask), stdout);
                rc = get_user_reply(cxt, _(" [Y]es/[N]o: "), buf, sizeof(buf));
                if (rc == 0)
-                       ask->data.yesno.result = rpmatch(buf);
+                       fdisk_ask_yesno_set_result(ask, rpmatch(buf));
                DBG(ASK, dbgprint("yes-no ask: reply '%s' [rc=%d]", buf, rc));
                break;
        case FDISK_ASKTYPE_TABLE:
                tt_print_table(fdisk_ask_get_table(ask));
                break;
+       case FDISK_ASKTYPE_STRING:
+       {
+               char prmt[BUFSIZ];
+               snprintf(prmt, sizeof(prmt), "%s: ", fdisk_ask_get_query(ask));
+               fputc('\n', stdout);
+               rc = get_user_reply(cxt, prmt, buf, sizeof(buf));
+               if (rc == 0)
+                       fdisk_ask_string_set_result(ask, xstrdup(buf));
+               DBG(ASK, dbgprint("string ask: reply '%s' [rc=%d]", buf, rc));
+               break;
+       }
        default:
                warnx(_("internal error: unsupported dialog type %d"), fdisk_ask_get_type(ask));
                return -EINVAL;
index 1964e4af89787f7d214507d8f8015e16933975ee..f209d58745dd564ead8735a5bd504d9365c54227 100644 (file)
@@ -69,7 +69,7 @@ static const struct menulist_descr menulist[] = {
        {'c', N_("toggle the dos compatibility flag"), {FDISK_DISKLABEL_DOS, 0}},
        {'c', N_("toggle the mountable flag"), {FDISK_DISKLABEL_SUN, 0}},
        {'d', N_("delete a partition"), {FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI | FDISK_DISKLABEL_OSF | FDISK_DISKLABEL_GPT, 0}},
-       {'d', N_("print the raw data in the partition table"), {0, FDISK_DISKLABEL_ANY}},
+       {'d', N_("print the raw data of the first sector"), {0, FDISK_DISKLABEL_ANY}},
        {'e', N_("change number of extra sectors per cylinder"), {0, FDISK_DISKLABEL_SUN}},
        {'e', N_("edit drive data"), {FDISK_DISKLABEL_OSF, 0}},
        {'e', N_("list extended partitions"), {0, FDISK_DISKLABEL_DOS}},
@@ -94,6 +94,7 @@ static const struct menulist_descr menulist[] = {
        {'s', N_("show complete disklabel"), {FDISK_DISKLABEL_OSF, 0}},
        {'t', N_("change a partition's system id"), {FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI | FDISK_DISKLABEL_OSF, 0}},
        {'u', N_("change display/entry units"), {FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI | FDISK_DISKLABEL_OSF, 0}},
+       {'u', N_("change partition UUID"), {0, FDISK_DISKLABEL_GPT}},
        {'v', N_("verify the partition table"), {FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI, FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI}},
        {'w', N_("write disklabel to disk"), {FDISK_DISKLABEL_OSF, 0}},
        {'w', N_("write table to disk and exit"), {FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI  | FDISK_DISKLABEL_GPT, FDISK_DISKLABEL_DOS | FDISK_DISKLABEL_SUN | FDISK_DISKLABEL_SGI}},
@@ -856,7 +857,7 @@ expert_command_prompt(struct fdisk_context *cxt)
                case 'p':
                        if (fdisk_is_disklabel(cxt, SUN))
                                list_table(cxt, 1);
-                       else
+                       else if (fdisk_is_disklabel(cxt, DOS))
                                dos_list_table_expert(cxt, 0);
                        break;
                case 'q':
@@ -873,6 +874,11 @@ expert_command_prompt(struct fdisk_context *cxt)
                                        "compatibility\n"));
                        fdisk_override_geometry(cxt, user_cylinders, user_heads, user_sectors);
                        break;
+               case 'u':
+                       if (fdisk_is_disklabel(cxt, GPT) &&
+                           fdisk_ask_partnum(cxt, &n, FALSE) == 0)
+                               fdisk_gpt_partition_set_uuid(cxt, n);
+                       break;
                case 'v':
                        verify(cxt);
                        break;