From f02fecd19a658c54eb2ef2d5af35c0b46380461b Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 25 Jun 2013 15:55:02 +0200 Subject: [PATCH] fdisk: (dos) add dos menu callback Signed-off-by: Karel Zak --- fdisks/fdisk-menu.c | 67 ++++++++++++++++++++++++++++++++++++++++++++- fdisks/fdisk.c | 40 +++------------------------ fdisks/fdisk.h | 1 + 3 files changed, 71 insertions(+), 37 deletions(-) diff --git a/fdisks/fdisk-menu.c b/fdisks/fdisk-menu.c index e854f0bc7..ae6dda8bd 100644 --- a/fdisks/fdisk-menu.c +++ b/fdisks/fdisk-menu.c @@ -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) diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c index ff581ce74..c7fe3b48f 100644 --- a/fdisks/fdisk.c +++ b/fdisks/fdisk.c @@ -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 diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index 6c3475c0e..23c4e3f0a 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -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,