summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fdisks/fdisk-menu.c43
-rw-r--r--fdisks/fdisk.c34
2 files changed, 41 insertions, 36 deletions
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; }
diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c
index 09fa0746b..2ed6bcd17 100644
--- a/fdisks/fdisk.c
+++ b/fdisks/fdisk.c
@@ -58,7 +58,8 @@ char *line_ptr, /* interactive input */
int nowarn = 0; /* no warnings for fdisk -l/-s */
-unsigned int user_cylinders, user_heads, user_sectors;
+/* when C/H/S specified on command line */
+static unsigned int user_cylinders, user_heads, user_sectors;
void toggle_units(struct fdisk_context *cxt)
{
@@ -721,8 +722,6 @@ expert_command_prompt(struct fdisk_context *cxt)
{
char c;
size_t n;
- uintmax_t num;
- int rc;
assert(cxt);
@@ -748,15 +747,6 @@ expert_command_prompt(struct fdisk_context *cxt)
fdisk_ask_partnum(cxt, &n, FALSE) == 0)
dos_move_begin(cxt, n);
break;
- case 'c':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.cylinders,
- 1048576, _("Number of cylinders"), &num);
- if (rc == 0) {
- user_cylinders = num;
- fdisk_override_geometry(cxt, user_cylinders,
- user_heads, user_sectors);
- }
- break;
case 'd':
print_raw(cxt);
break;
@@ -778,14 +768,6 @@ expert_command_prompt(struct fdisk_context *cxt)
* compatibility only. */
fdisk_create_disklabel(cxt, "sgi");
break;
- case 'h':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.heads,
- 256, _("Number of heads"), &num);
- if (rc == 0)
- user_heads = num;
- fdisk_override_geometry(cxt, user_cylinders,
- user_heads, user_sectors);
- break;
case 'i':
if (fdisk_is_disklabel(cxt, SUN))
fdisk_sun_set_ilfact(cxt);
@@ -804,18 +786,6 @@ expert_command_prompt(struct fdisk_context *cxt)
case 'r':
fdisk_context_enable_details(cxt, 0);
return;
- case 's':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.sectors,
- 63, _("Number of sectors"), &num);
- if (rc == 0) {
- user_sectors = num;
- if (is_dos_compatible(cxt))
- fdisk_warn(cxt, _("setting sector "
- "offset for DOS compatibility"));
- fdisk_override_geometry(cxt, user_cylinders,
- user_heads, user_sectors);
- }
- break;
case 'v':
verify(cxt);
break;