From 8e40a677bdbe466d44c613ecdc3589635e28b4a7 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 22 May 2013 15:37:47 +0200 Subject: fdisk: add functions to geometry menu Signed-off-by: Karel Zak --- fdisks/fdisk-menu.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'fdisks/fdisk-menu.c') diff --git a/fdisks/fdisk-menu.c b/fdisks/fdisk-menu.c index 99141a78d..369f83fa7 100644 --- a/fdisks/fdisk-menu.c +++ b/fdisks/fdisk-menu.c @@ -38,10 +38,13 @@ struct menu_context { }; #define MENU_CXT_EMPTY { 0, 0 } +#define DECLARE_MENU_CB(x) \ + static int x(struct fdisk_context *, \ + const struct menu *, \ + const struct menu_entry *) -static int gpt_menu_cb(struct fdisk_context *cxt, - const struct menu *menu, - const struct menu_entry *ent); +DECLARE_MENU_CB(gpt_menu_cb); +DECLARE_MENU_CB(geo_menu_cb); /* * Menu entry macros: @@ -113,7 +116,7 @@ struct menu menu_createlabel = { }; struct menu menu_geo = { -/* .callback = geo_menu_cb, */ + .callback = geo_menu_cb, .exclude = FDISK_DISKLABEL_GPT, .entries = { MENU_XSEP(N_("Geometry")), @@ -366,6 +369,7 @@ int process_fdisk_menu(struct fdisk_context *cxt) return key; } + /* * This is fdisk frontend for GPT specific libfdisk functions that * are not expported by generic libfdisk API. @@ -398,6 +402,37 @@ static int gpt_menu_cb(struct fdisk_context *cxt, return rc; } +/* C/H/S commands */ +static int geo_menu_cb(struct fdisk_context *cxt, + const struct menu *menu __attribute__((__unused__)), + const struct menu_entry *ent) +{ + int rc = -EINVAL; + uintmax_t c = 0, h = 0, s = 0; + + assert(cxt); + assert(ent); + + switch (ent->key) { + case 'c': + rc = fdisk_ask_number(cxt, 1, cxt->geom.cylinders, + 1048576, _("Number of cylinders"), &c); + break; + case 'h': + rc = fdisk_ask_number(cxt, 1, cxt->geom.heads, + 256, _("Number of heads"), &h); + break; + case 's': + rc = fdisk_ask_number(cxt, 1, cxt->geom.sectors, + 63, _("Number of sectors"), &s); + break; + } + + if (!rc) + fdisk_override_geometry(cxt, c, h, s); + return rc; +} + #ifdef TEST_PROGRAM struct fdisk_label *fdisk_new_dos_label(struct fdisk_context *cxt) { return NULL; } struct fdisk_label *fdisk_new_bsd_label(struct fdisk_context *cxt) { return NULL; } -- cgit v1.2.3-55-g7522