]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: (dos) add dos menu callback
authorKarel Zak <kzak@redhat.com>
Tue, 25 Jun 2013 13:55:02 +0000 (15:55 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:47:04 +0000 (16:47 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk-menu.c
fdisks/fdisk.c
fdisks/fdisk.h

index e854f0bc77da682568dbba64cd873cd61cb5c2fc..ae6dda8bd6f201541e38d65d2ac208d7a5a255d5 100644 (file)
@@ -8,6 +8,10 @@
 #include "c.h"
 #include "fdisk.h"
 #include "pt-sun.h"
+#include "pt-mbr.h"
+
+#include "fdiskdoslabel.h"
+#include "fdiskbsdlabel.h"
 
 struct menu_entry {
        const char      key;
@@ -47,6 +51,7 @@ struct menu_context {
 DECLARE_MENU_CB(gpt_menu_cb);
 DECLARE_MENU_CB(sun_menu_cb);
 DECLARE_MENU_CB(geo_menu_cb);
+DECLARE_MENU_CB(dos_menu_cb);
 
 /*
  * Menu entry macros:
@@ -172,7 +177,7 @@ struct menu menu_sgi = {
 };
 
 struct menu menu_dos = {
-/*     .callback = dos_menu_cb, */
+       .callback = dos_menu_cb,
        .label = FDISK_DISKLABEL_DOS,
        .entries = {
                MENU_BSEP(N_("DOS (MBR)")),
@@ -409,6 +414,66 @@ static int gpt_menu_cb(struct fdisk_context *cxt,
        return rc;
 }
 
+
+/*
+ * This is fdisk frontend for MBR specific libfdisk functions that
+ * are not expported by generic libfdisk API.
+ */
+static int dos_menu_cb(struct fdisk_context *cxt,
+                      const struct menu *menu __attribute__((__unused__)),
+                      const struct menu_entry *ent)
+{
+       int rc = 0;
+
+       if (!ent->expert) {
+               switch (ent->key) {
+               case 'a':
+               {
+                       size_t n;
+                       rc = fdisk_ask_partnum(cxt, &n, FALSE);
+                       if (!rc)
+                               rc = fdisk_partition_toggle_flag(cxt, n, DOS_FLAG_ACTIVE);
+                       break;
+               }
+               case 'b':
+               {
+                       struct fdisk_context *bsd
+                                       = fdisk_new_nested_context(cxt, "bsd");
+                       if (bsd)
+                               bsd_command_prompt(bsd);
+                       fdisk_free_context(bsd);
+                       break;
+               }
+               case 'c':
+                       toggle_dos_compatibility_flag(cxt);
+                       break;
+               }
+               return rc;
+       }
+
+       /* expert mode */
+       switch (ent->key) {
+       case 'b':
+       {
+               size_t n;
+               rc = fdisk_ask_partnum(cxt, &n, FALSE);
+               if (!rc)
+                       dos_move_begin(cxt, n);
+               break;
+       }
+       case 'e':
+               rc = fdisk_dos_list_extended(cxt);
+               break;
+       case 'f':
+               dos_fix_partition_table_order(cxt);
+               break;
+       case 'i':
+               rc = fdisk_set_disklabel_id(cxt);
+               break;
+       }
+       return rc;
+}
+
 static int sun_menu_cb(struct fdisk_context *cxt,
                       const struct menu *menu __attribute__((__unused__)),
                       const struct menu_entry *ent)
index ff581ce74c795af7212f9e870d711bc551db4ebe..c7fe3b48f23805a5d7270754e2fc61374908038c 100644 (file)
@@ -161,7 +161,7 @@ int warn_geometry(struct fdisk_context *cxt)
        return 0;
 }
 
-static void toggle_dos_compatibility_flag(struct fdisk_context *cxt)
+void toggle_dos_compatibility_flag(struct fdisk_context *cxt)
 {
        struct fdisk_label *lb = fdisk_context_get_label(cxt, "dos");
        int flag;
@@ -386,7 +386,6 @@ static void
 expert_command_prompt(struct fdisk_context *cxt)
 {
        char c;
-       size_t n;
 
        assert(cxt);
 
@@ -403,30 +402,14 @@ expert_command_prompt(struct fdisk_context *cxt)
                 * are not yet implemented by menu callbacks. Let's
                 * perform the commands here */
                switch (c) {
-               case 'b':
-                       if (fdisk_is_disklabel(cxt, DOS) &&
-                           fdisk_ask_partnum(cxt, &n, FALSE) == 0)
-                               dos_move_begin(cxt, n);
-                       break;
                case 'd':
                        print_raw(cxt);
                        break;
-               case 'e':
-                       if (fdisk_is_disklabel(cxt, DOS))
-                               fdisk_dos_list_extended(cxt);
-                       break;
-               case 'f':
-                       if (fdisk_is_disklabel(cxt, DOS))
-                               dos_fix_partition_table_order(cxt);
-                       break;
                case 'g':
                        /* Deprecated, use 'G' in main menu, just for backward
                         * compatibility only. */
                        fdisk_create_disklabel(cxt, "sgi");
                        break;
-               case 'i':
-                       fdisk_set_disklabel_id(cxt);
-                       break;
                case 'p':
                        list_table(cxt, 1);
                        break;
@@ -551,11 +534,7 @@ static void command_prompt(struct fdisk_context *cxt)
                 * perform the commands here */
                switch (c) {
                case 'a':
-                       if (fdisk_is_disklabel(cxt, DOS) &&
-                           fdisk_ask_partnum(cxt, &n, FALSE) == 0)
-                               fdisk_partition_toggle_flag(cxt, n, DOS_FLAG_ACTIVE);
-
-                       else if (fdisk_is_disklabel(cxt, SGI) &&
+                       if (fdisk_is_disklabel(cxt, SGI) &&
                                 fdisk_ask_partnum(cxt, &n, FALSE) == 0)
                                fdisk_partition_toggle_flag(cxt, n, SGI_FLAG_BOOT);
                        else
@@ -564,22 +543,11 @@ static void command_prompt(struct fdisk_context *cxt)
                case 'b':
                        if (fdisk_is_disklabel(cxt, SGI))
                                sgi_set_bootfile(cxt);
-                       else if (fdisk_is_disklabel(cxt, DOS)) {
-
-                               struct fdisk_context *bsd;
-
-                               bsd = fdisk_new_nested_context(cxt, "bsd");
-                               if (bsd)
-                                       bsd_command_prompt(bsd);
-                               fdisk_free_context(bsd);
-                       } else
+                       else
                                unknown_command(c);
                        break;
                case 'c':
-                       if (fdisk_is_disklabel(cxt, DOS))
-                               toggle_dos_compatibility_flag(cxt);
-
-                       else if (fdisk_is_disklabel(cxt, SGI) &&
+                       if (fdisk_is_disklabel(cxt, SGI) &&
                                 fdisk_ask_partnum(cxt, &n, FALSE) == 0)
                                fdisk_partition_toggle_flag(cxt, n, SGI_FLAG_SWAP);
                        else
index 6c3475c0eb9abc4c11214028093c8a30747fa12d..23c4e3f0a6b5e7fccb12c405c689c72377953cc1 100644 (file)
@@ -62,6 +62,7 @@ extern unsigned int read_int(struct fdisk_context *cxt,
 extern char *partition_type(struct fdisk_context *cxt, unsigned char type);
 extern char read_chars(struct fdisk_context *cxt, char *mesg);
 extern int warn_geometry(struct fdisk_context *cxt);
+extern void toggle_dos_compatibility_flag(struct fdisk_context *cxt);
 extern void warn_limits(struct fdisk_context *cxt);
 extern unsigned int read_int_with_suffix(struct fdisk_context *cxt,
                                         unsigned int low, unsigned int dflt, unsigned int high,