summaryrefslogtreecommitdiffstats
path: root/libfdisk/src/bsd.c
diff options
context:
space:
mode:
authorKarel Zak2013-11-29 21:55:53 +0100
committerKarel Zak2014-03-11 11:35:12 +0100
commit77d6a70ac40aaaf693eb9c71d01ebac41218e9b3 (patch)
treecd9ab7687078935a2d8b9a822e5b2c7f99516ab7 /libfdisk/src/bsd.c
parentlibfdisk: remove fdisk_get_partition_type() (diff)
downloadkernel-qcow2-util-linux-77d6a70ac40aaaf693eb9c71d01ebac41218e9b3.tar.gz
kernel-qcow2-util-linux-77d6a70ac40aaaf693eb9c71d01ebac41218e9b3.tar.xz
kernel-qcow2-util-linux-77d6a70ac40aaaf693eb9c71d01ebac41218e9b3.zip
libfdisk: use partition template
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src/bsd.c')
-rw-r--r--libfdisk/src/bsd.c139
1 files changed, 78 insertions, 61 deletions
diff --git a/libfdisk/src/bsd.c b/libfdisk/src/bsd.c
index fc7786892..4ee31b6dd 100644
--- a/libfdisk/src/bsd.c
+++ b/libfdisk/src/bsd.c
@@ -85,9 +85,7 @@ static int bsd_list_disklabel(struct fdisk_context *cxt);
static int bsd_initlabel(struct fdisk_context *cxt);
static int bsd_readlabel(struct fdisk_context *cxt);
static void sync_disks(struct fdisk_context *cxt);
-
-#define bsd_cround(c, n) \
- (fdisk_context_use_cylinders(c) ? ((n)/self_disklabel(c)->d_secpercyl) + 1 : (n))
+static int bsd_set_parttype(struct fdisk_context *cxt, size_t partnum, struct fdisk_parttype *t);
static inline struct fdisk_bsd_label *self_label(struct fdisk_context *cxt)
{
@@ -195,80 +193,97 @@ static int bsd_probe_label(struct fdisk_context *cxt)
return 0; /* not found */
}
-static int bsd_add_part (struct fdisk_context *cxt,
- size_t i,
- struct fdisk_parttype *t __attribute__((__unused__)))
+static int bsd_add_partition(struct fdisk_context *cxt,
+ struct fdisk_partition *pa)
{
struct fdisk_bsd_label *l = self_label(cxt);
struct bsd_disklabel *d = self_disklabel(cxt);
- struct fdisk_ask *ask;
+ size_t i;
unsigned int begin = 0, end;
- int rc;
+ int rc = 0;
+ rc = fdisk_partition_next_partno(cxt, pa, &i);
+ if (rc)
+ return rc;
if (i >= BSD_MAXPARTITIONS)
- return -EINVAL;
-
+ return -ERANGE;
if (l->dos_part) {
begin = dos_partition_get_start(l->dos_part);
end = begin + dos_partition_get_size(l->dos_part) - 1;
} else
end = d->d_secperunit - 1;
- ask = fdisk_new_ask();
-
/*
* First sector
*/
- if (fdisk_context_use_cylinders(cxt))
- fdisk_ask_set_query(ask, _("First cylinder"));
- else
- fdisk_ask_set_query(ask, _("First sector"));
-
- fdisk_ask_set_type(ask, FDISK_ASKTYPE_NUMBER);
- fdisk_ask_number_set_low(ask, bsd_cround(cxt, begin));
- fdisk_ask_number_set_default(ask, bsd_cround(cxt, begin));
- fdisk_ask_number_set_high(ask, bsd_cround(cxt, end));
-
- rc = fdisk_do_ask(cxt, ask);
- if (rc) {
+ if (pa && pa->start_follow_default)
+ ;
+ else if (pa && pa->start) {
+ if (pa->start < begin || pa->start > end)
+ return -ERANGE;
+ begin = pa->start;
+ } else {
+ struct fdisk_ask *ask = fdisk_new_ask();
+
+ if (!ask)
+ return -ENOMEM;
+ fdisk_ask_set_query(ask,
+ fdisk_context_use_cylinders(cxt) ?
+ _("First cylinder") : _("First sector"));
+ fdisk_ask_set_type(ask, FDISK_ASKTYPE_NUMBER);
+ fdisk_ask_number_set_low(ask, fdisk_cround(cxt, begin));
+ fdisk_ask_number_set_default(ask, fdisk_cround(cxt, begin));
+ fdisk_ask_number_set_high(ask, fdisk_cround(cxt, end));
+
+ rc = fdisk_do_ask(cxt, ask);
+ begin = fdisk_ask_number_get_result(ask);
fdisk_free_ask(ask);
- return rc;
+ if (rc)
+ return rc;
+ if (fdisk_context_use_cylinders(cxt))
+ begin = (begin - 1) * d->d_secpercyl;
}
- begin = fdisk_ask_number_get_result(ask);
-
- if (fdisk_context_use_cylinders(cxt))
- begin = (begin - 1) * d->d_secpercyl;
-
- fdisk_reset_ask(ask);
/*
* Last sector
*/
- fdisk_ask_set_type(ask, FDISK_ASKTYPE_OFFSET);
-
- if (fdisk_context_use_cylinders(cxt)) {
- fdisk_ask_set_query(ask, _("Last cylinder, +cylinders or +size{K,M,G,T,P}"));
- fdisk_ask_number_set_unit(ask,
- cxt->sector_size *
- fdisk_context_get_units_per_sector(cxt));
+ if (pa && pa->end_follow_default)
+ ;
+ else if (pa && pa->size) {
+ if (begin + pa->size > end)
+ return -ERANGE;
+ end = begin + pa->size;
} else {
- fdisk_ask_set_query(ask, _("Last sector, +sectors or +size{K,M,G,T,P}"));
- fdisk_ask_number_set_unit(ask,cxt->sector_size);
- }
-
- fdisk_ask_number_set_low(ask, bsd_cround(cxt, begin));
- fdisk_ask_number_set_default(ask, bsd_cround(cxt, end));
- fdisk_ask_number_set_high(ask, bsd_cround(cxt, end));
- fdisk_ask_number_set_base(ask, bsd_cround(cxt, begin));
+ /* ask user by dialog */
+ struct fdisk_ask *ask = fdisk_new_ask();
+
+ if (!ask)
+ return -ENOMEM;
+ fdisk_ask_set_type(ask, FDISK_ASKTYPE_OFFSET);
+
+ if (fdisk_context_use_cylinders(cxt)) {
+ fdisk_ask_set_query(ask, _("Last cylinder, +cylinders or +size{K,M,G,T,P}"));
+ fdisk_ask_number_set_unit(ask,
+ cxt->sector_size *
+ fdisk_context_get_units_per_sector(cxt));
+ } else {
+ fdisk_ask_set_query(ask, _("Last sector, +sectors or +size{K,M,G,T,P}"));
+ fdisk_ask_number_set_unit(ask,cxt->sector_size);
+ }
- rc = fdisk_do_ask(cxt, ask);
- end = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
- if (rc)
- return rc;
+ fdisk_ask_number_set_low(ask, fdisk_cround(cxt, begin));
+ fdisk_ask_number_set_default(ask, fdisk_cround(cxt, end));
+ fdisk_ask_number_set_high(ask, fdisk_cround(cxt, end));
+ fdisk_ask_number_set_base(ask, fdisk_cround(cxt, begin));
- if (fdisk_context_use_cylinders(cxt))
- end = end * d->d_secpercyl - 1;
+ rc = fdisk_do_ask(cxt, ask);
+ end = fdisk_ask_number_get_result(ask);
+ fdisk_free_ask(ask);
+ if (rc)
+ return rc;
+ if (fdisk_context_use_cylinders(cxt))
+ end = end * d->d_secpercyl - 1;
+ }
d->d_partitions[i].p_size = end - begin + 1;
d->d_partitions[i].p_offset = begin;
@@ -278,6 +293,9 @@ static int bsd_add_part (struct fdisk_context *cxt,
d->d_npartitions = i + 1;
cxt->label->nparts_cur = d->d_npartitions;
+ if (pa && pa->type)
+ bsd_set_parttype(cxt, i, pa->type);
+
fdisk_label_set_changed(cxt->label, 1);
return 0;
}
@@ -403,17 +421,11 @@ static int bsd_get_partition(struct fdisk_context *cxt, size_t n,
return 0;
if (fdisk_context_use_cylinders(cxt) && d->d_secpercyl) {
- pa->start = p->p_offset / d->d_secpercyl + 1;
pa->start_post = p->p_offset % d->d_secpercyl ? '*' : ' ';
-
- pa->end = (p->p_offset + p->p_size + d->d_secpercyl - 1) / d->d_secpercyl;
pa->end_post = (p->p_offset + p->p_size) % d->d_secpercyl ? '*' : ' ';
- } else {
- pa->start = p->p_offset;
- pa->end = p->p_offset + p->p_size - 1;
}
- pa->size = p->p_size * cxt->sector_size;
+ pa->size = p->p_size;
pa->type = bsd_partition_parttype(cxt, p);
if (p->p_fstype == BSD_FS_UNUSED || p->p_fstype == BSD_FS_BSDFFS) {
@@ -697,6 +709,11 @@ static int bsd_readlabel(struct fdisk_context *cxt)
fdisk_warnx(cxt, ("Too many partitions (%d, maximum is %d)."),
d->d_npartitions, BSD_MAXPARTITIONS);
+ /* let's follow in-PT geometry */
+ cxt->geom.sectors = d->d_nsectors;
+ cxt->geom.heads = d->d_ntracks;
+ cxt->geom.cylinders = d->d_ncylinders;
+
cxt->label->nparts_cur = d->d_npartitions;
cxt->label->nparts_max = BSD_MAXPARTITIONS;
DBG(LABEL, dbgprint("read BSD label"));
@@ -848,10 +865,10 @@ static const struct fdisk_label_operations bsd_operations =
.list = bsd_list_disklabel,
.write = bsd_write_disklabel,
.create = bsd_create_disklabel,
- .part_add = bsd_add_part,
.part_delete = bsd_delete_part,
.get_part = bsd_get_partition,
+ .add_part = bsd_add_partition,
.part_set_type = bsd_set_parttype,
.part_is_used = bsd_partition_is_used,