]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add functions to geometry menu
authorKarel Zak <kzak@redhat.com>
Wed, 22 May 2013 13:37:47 +0000 (15:37 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:46:56 +0000 (16:46 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk-menu.c
fdisks/fdisk.c

index 99141a78d82f890eb44cbc3769cf6fdb183111ea..369f83fa70e4d89a3deab04911fe05da9628eff2 100644 (file)
@@ -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; }
index 09fa0746b31d68769cab6a5c1e68eb7168b9e2b1..2ed6bcd179561a5ce2c174d8d258bc6b2e791d62 100644 (file)
@@ -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;