summaryrefslogtreecommitdiffstats
path: root/libfdisk/src/partition.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/partition.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/partition.c')
-rw-r--r--libfdisk/src/partition.c55
1 files changed, 47 insertions, 8 deletions
diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c
index add505fba..65cdc9f48 100644
--- a/libfdisk/src/partition.c
+++ b/libfdisk/src/partition.c
@@ -8,6 +8,7 @@ struct fdisk_partition *fdisk_new_partition(void)
{
struct fdisk_partition *pa = calloc(1, sizeof(*pa));
+ pa->partno = FDISK_EMPTY_PARTNO;
DBG(PART, dbgprint("new %p", pa));
return pa;
}
@@ -21,6 +22,7 @@ void fdisk_reset_partition(struct fdisk_partition *pa)
free(pa->uuid);
free(pa->attrs);
memset(pa, 0, sizeof(*pa));
+ pa->partno = FDISK_EMPTY_PARTNO;
}
void fdisk_free_partition(struct fdisk_partition *pa)
@@ -168,6 +170,32 @@ int fdisk_partition_is_used(struct fdisk_partition *pa)
return pa && pa->used;
}
+int fdisk_partition_next_partno(
+ struct fdisk_context *cxt,
+ struct fdisk_partition *pa,
+ size_t *n)
+{
+ assert(cxt);
+ assert(n);
+
+ if (pa && pa->partno_follow_default) {
+ size_t i;
+
+ for (i = 0; i < pa->cxt->label->nparts_max; i++) {
+ if (!fdisk_is_partition_used(cxt, i)) {
+ *n = i;
+ break;
+ }
+ }
+ } else if (pa && pa->partno != FDISK_EMPTY_PARTNO) {
+ if (pa->partno >= pa->cxt->label->nparts_max)
+ return -ERANGE;
+ *n = pa->partno;
+ } else
+ return fdisk_ask_partnum(cxt, n, 1);
+
+ return 0;
+}
/**
* fdisk_partition_to_string:
@@ -198,6 +226,7 @@ int fdisk_partition_to_string(struct fdisk_partition *pa,
{
char *p = NULL;
int rc = 0;
+ uint64_t x;
if (!pa || !pa->cxt)
return -EINVAL;
@@ -213,28 +242,38 @@ int fdisk_partition_to_string(struct fdisk_partition *pa,
rc = asprintf(&p, "%c", pa->boot);
break;
case FDISK_COL_START:
+ x = fdisk_cround(pa->cxt, pa->start);
rc = pa->start_post ?
- asprintf(&p, "%ju%c", pa->start, pa->start_post) :
- asprintf(&p, "%ju", pa->start);
+ asprintf(&p, "%ju%c", x, pa->start_post) :
+ asprintf(&p, "%ju", x);
break;
case FDISK_COL_END:
+ x = fdisk_cround(pa->cxt, pa->end);
rc = pa->end_post ?
- asprintf(&p, "%ju%c", pa->end, pa->end_post) :
- asprintf(&p, "%ju", pa->end);
+ asprintf(&p, "%ju%c", x, pa->end_post) :
+ asprintf(&p, "%ju", x);
break;
case FDISK_COL_SIZE:
+ {
+ uint64_t sz = pa->size * pa->cxt->sector_size;
+
if (fdisk_context_display_details(pa->cxt)) {
rc = pa->size_post ?
- asprintf(&p, "%ju%c", pa->size, pa->size_post) :
- asprintf(&p, "%ju", pa->size);
+ asprintf(&p, "%ju%c", sz, pa->size_post) :
+ asprintf(&p, "%ju", sz);
} else {
- p = size_to_human_string(SIZE_SUFFIX_1LETTER, pa->size);
+ p = size_to_human_string(SIZE_SUFFIX_1LETTER, sz);
if (!p)
rc = -ENOMEM;
}
break;
+ }
+ case FDISK_COL_CYLINDERS:
+ rc = asprintf(&p, "%ju", (uintmax_t)
+ fdisk_cround(pa->cxt, pa->size));
+ break;
case FDISK_COL_SECTORS:
- rc = asprintf(&p, "%ju", pa->size / pa->cxt->sector_size);
+ rc = asprintf(&p, "%ju", pa->size);
break;
case FDISK_COL_BSIZE:
rc = asprintf(&p, "%ju", pa->bsize);