summaryrefslogtreecommitdiffstats
path: root/fdisks/fdiskdoslabel.c
diff options
context:
space:
mode:
authorKarel Zak2013-03-05 13:08:10 +0100
committerKarel Zak2013-03-11 13:00:57 +0100
commit1bf3a03438b96665f22708096db71cfa8dda3ee6 (patch)
treecd6e8f96dc13ab6e27a2e124cf077f4d74b603c1 /fdisks/fdiskdoslabel.c
parentlibfdisk: improve fdisk_ask_partnum() (diff)
downloadkernel-qcow2-util-linux-1bf3a03438b96665f22708096db71cfa8dda3ee6.tar.gz
kernel-qcow2-util-linux-1bf3a03438b96665f22708096db71cfa8dda3ee6.tar.xz
kernel-qcow2-util-linux-1bf3a03438b96665f22708096db71cfa8dda3ee6.zip
fdisk: (dos) use new dialog to ask for prim. partitions
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'fdisks/fdiskdoslabel.c')
-rw-r--r--fdisks/fdiskdoslabel.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c
index 464a18475..8af391fb7 100644
--- a/fdisks/fdiskdoslabel.c
+++ b/fdisks/fdiskdoslabel.c
@@ -78,33 +78,25 @@ static void warn_alignment(struct fdisk_context *cxt)
}
-static int get_nonexisting_partition(struct fdisk_context *cxt, int warn, size_t max)
+static int get_partition_unused_primary(struct fdisk_context *cxt)
{
- int pno = -1;
- size_t i;
- int dflt = 0;
+ size_t orgmax = cxt->label->nparts_max;
+ size_t n;
+ int rc;
- for (i = 0; i < max; i++) {
- struct pte *pe = &ptes[i];
- struct partition *p = pe->part_table;
+ cxt->label->nparts_max = 4;
+ rc = fdisk_ask_partnum(cxt, &n, TRUE);
+ cxt->label->nparts_max = orgmax;
- if (p && is_cleared_partition(p)) {
- if (pno >= 0) {
- dflt = pno + 1;
- goto not_unique;
- }
- pno = i;
- }
- }
- if (pno >= 0) {
- printf(_("Selected partition %d\n"), pno+1);
- return pno;
+ switch (rc) {
+ case 1:
+ fdisk_info(cxt, _("All primary partitions have been defined already"));
+ return -1;
+ case 0:
+ return n;
+ default:
+ return rc;
}
- printf(_("All primary partitions have been defined already!\n"));
- return -1;
-
- not_unique:
- return get_partition_dflt(cxt, warn, max, dflt);
}
@@ -935,7 +927,7 @@ static int dos_add_partition(
printf(_("The maximum number of partitions has been created\n"));
return -EINVAL;
}
-
+ rc = 1;
if (!free_primary) {
if (extended_offset) {
printf(_("All primary partitions are in use\n"));
@@ -944,9 +936,14 @@ static int dos_add_partition(
printf(_("If you want to create more than four partitions, you must replace a\n"
"primary partition with an extended partition first.\n"));
} else if (cxt->label->nparts_max >= MAXIMUM_PARTS) {
+ int i;
+
printf(_("All logical partitions are in use\n"));
printf(_("Adding a primary partition\n"));
- rc = add_partition(cxt, get_partition(cxt, 0, 4), t);
+
+ i = get_partition_unused_primary(cxt);
+ if (i >= 0)
+ rc = add_partition(cxt, i, t);
} else {
char c, line[LINE_LENGTH];
int dflt;
@@ -968,7 +965,7 @@ static int dos_add_partition(
printf(_("Using default response %c\n"), c);
}
if (c == 'p') {
- int i = get_nonexisting_partition(cxt, 0, 4);
+ int i = get_partition_unused_primary(cxt);
if (i >= 0)
rc = add_partition(cxt, i, t);
goto done;
@@ -976,7 +973,7 @@ static int dos_add_partition(
rc = add_logical(cxt);
goto done;
} else if (c == 'e' && !extended_offset) {
- int i = get_nonexisting_partition(cxt, 0, 4);
+ int i = get_partition_unused_primary(cxt);
if (i >= 0) {
t = fdisk_get_parttype_from_code(cxt, EXTENDED);
rc = add_partition(cxt, i, t);