summaryrefslogtreecommitdiffstats
path: root/libfdisk/src/gpt.c
diff options
context:
space:
mode:
authorKarel Zak2013-01-29 15:28:30 +0100
committerKarel Zak2013-03-11 13:00:55 +0100
commit4114da08d090dcf02d77c8e6ed343b40d9c8ff96 (patch)
tree30b43ccf140df7bd6584c7d17529a634441ae7e8 /libfdisk/src/gpt.c
parentlib/strutils: simplify strtosize(), return info about suffix (diff)
downloadkernel-qcow2-util-linux-4114da08d090dcf02d77c8e6ed343b40d9c8ff96.tar.gz
kernel-qcow2-util-linux-4114da08d090dcf02d77c8e6ed343b40d9c8ff96.tar.xz
kernel-qcow2-util-linux-4114da08d090dcf02d77c8e6ed343b40d9c8ff96.zip
libfdisk: extend "ask" API, add support for offsets
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src/gpt.c')
-rw-r--r--libfdisk/src/gpt.c73
1 files changed, 40 insertions, 33 deletions
diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c
index 520416c45..278cb1853 100644
--- a/libfdisk/src/gpt.c
+++ b/libfdisk/src/gpt.c
@@ -44,17 +44,6 @@
#include "strutils.h"
#include "all-io.h"
-/* temporary -- exported from fdisk/sfdisk.c
- * TODO: use fdisk_dialog API
- */
-extern unsigned int read_int(struct fdisk_context *cxt,
- unsigned int low, unsigned int dflt,
- unsigned int high, unsigned int base, char *mesg);
-
-extern unsigned int read_int_with_suffix(struct fdisk_context *cxt,
- unsigned int low, unsigned int dflt, unsigned int high,
- unsigned int base, char *mesg, int *is_suffix_used);
-
#define GPT_HEADER_SIGNATURE 0x5452415020494645LL /* EFI PART */
#define GPT_HEADER_REVISION_V1_02 0x00010200
#define GPT_HEADER_REVISION_V1_00 0x00010000
@@ -1564,6 +1553,8 @@ static int gpt_add_partition(
struct fdisk_gpt_label *gpt;
struct gpt_header *pheader;
struct gpt_entry *ents;
+ struct fdisk_ask *ask = NULL;
+ int rc;
assert(cxt);
assert(cxt->label);
@@ -1608,35 +1599,48 @@ static int gpt_add_partition(
/* get user input for first and last sectors of the new partition */
for (;;) {
- int is_suffix_used = 0;
-
- /* first sector */
- user_f = read_int(cxt, disk_f, /* minimal */
- dflt_f, /* default */
- disk_l, /* maximal */
- 0, _("First sector"));
-
- if (user_f < disk_f || user_f > disk_l)
- continue; /* bug in read_int() dialog? */
-
+ if (!ask)
+ ask = fdisk_new_ask();
+ else
+ fdisk_reset_ask(ask);
+
+ /* First sector */
+ fdisk_ask_set_query(ask, _("First sector"));
+ fdisk_ask_set_type(ask, FDISK_ASKTYPE_NUMBER);
+ fdisk_ask_number_set_low(ask, disk_f); /* minimal */
+ fdisk_ask_number_set_default(ask, dflt_f); /* default */
+ fdisk_ask_number_set_high(ask, disk_l); /* maximal */
+
+ rc = fdisk_do_ask(cxt, ask);
+ if (rc)
+ goto done;
+
+ user_f = fdisk_ask_number_get_result(ask);
if (user_f != find_first_available(pheader, ents, user_f)) {
printf(_("Sector %ju already used\n"), user_f);
continue;
}
+ fdisk_reset_ask(ask);
+
/* Last sector */
dflt_l = find_last_free(pheader, ents, user_f);
- user_l = read_int_with_suffix(cxt,
- user_f, /* minimal */
- dflt_l, /* default */
- dflt_l, /* maximal */
- user_f, /* base for relative input */
- _("Last sector, +sectors or +size{K,M,G}"),
- &is_suffix_used);
-
- if (is_suffix_used)
- user_l = fdisk_align_lba_in_range(cxt, user_l, user_f, dflt_l) - 1;
+ fdisk_ask_set_query(ask, _("Last sector, +sectors or +size{K,M,G,T,P}"));
+ fdisk_ask_set_type(ask, FDISK_ASKTYPE_OFFSET);
+ fdisk_ask_number_set_low(ask, user_f); /* minimal */
+ fdisk_ask_number_set_default(ask, dflt_l); /* default */
+ fdisk_ask_number_set_high(ask, dflt_l); /* maximal */
+ fdisk_ask_number_set_base(ask, user_f); /* base for relative input */
+ fdisk_ask_number_set_unit(ask, cxt->sector_size);
+
+ rc = fdisk_do_ask(cxt, ask);
+ if (rc)
+ goto done;
+
+ user_l = fdisk_ask_number_get_result(ask);
+ if (fdisk_ask_number_is_relative(ask))
+ user_l = fdisk_align_lba_in_range(cxt, user_l, user_f, dflt_l) - 1;
if (user_l > user_f && user_l <= disk_l)
break;
}
@@ -1650,7 +1654,10 @@ static int gpt_add_partition(
fdisk_label_set_changed(cxt->label, 1);
}
- return 0;
+ rc = 0;
+done:
+ fdisk_free_ask(ask);
+ return rc;
}
/*