libfdisk: (dos) implement fdisk_set_partition() backend

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2014-09-11 12:52:49 +02:00
parent 0dad217785
commit 0ecf3ab504
2 changed files with 49 additions and 87 deletions

View File

@ -360,87 +360,6 @@ static int command_dump(struct sfdisk *sf, int argc, char **argv)
return 0;
}
/* appply things from @tpl template to the on-disk partition @n */
static int sfdisk_modify_partition(struct sfdisk *sf,
struct fdisk_partition *tpl,
size_t n)
{
struct fdisk_partition *pa = NULL;
const struct fdisk_parttype *type;
const char *data;
sector_t num;
size_t new_partno = 0;
int rc = 0;
/* get the current partition */
rc = fdisk_get_partition(sf->cxt, n, &pa);
if (rc)
goto done;
assert(n == fdisk_partition_get_partno(pa));
/* uuid */
data = fdisk_partition_get_uuid(tpl);
if (data) {
rc = fdisk_partition_set_uuid(pa, data);
if (rc)
goto done;
}
/* name */
data = fdisk_partition_get_name(tpl);
if (data) {
rc = fdisk_partition_set_name(pa, data);
if (rc)
goto done;
}
/* attributes
data = fdisk_partition_get_attrs(tpl);
if (data) {
rc = fdisk_partition_set_attrs(pa, data);
if (rc)
goto done;
}*/
/* type */
type = fdisk_partition_get_type(tpl);
if (type) {
rc = fdisk_partition_set_type(pa, type);
if (rc)
goto done;
}
/* size */
num = fdisk_partition_get_size(tpl);
if (num) {
rc = fdisk_partition_set_size(pa, num);
if (rc)
goto done;
}
/* start */
num = fdisk_partition_get_start(tpl);
if (num) {
rc = fdisk_partition_set_start(pa, num);
if (rc)
goto done;
}
/* drop the old partition */
rc = fdisk_delete_partition(sf->cxt, n);
if (rc)
goto done;
/* add a new partition */
rc = fdisk_add_partition(sf->cxt, pa, &new_partno);
assert(new_partno == n);
done:
fdisk_unref_partition(pa);
return rc;
}
static void sfdisk_print_partition(struct sfdisk *sf, size_t n)
{
struct fdisk_partition *pa = NULL;
@ -685,7 +604,7 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
created = !rc;
}
if (!rc && partno >= 0) { /* -N <partno>, modify partition */
rc = sfdisk_modify_partition(sf, pa, partno);
rc = fdisk_set_partition(sf->cxt, partno, pa);
if (rc == 0)
rc = SFDISK_DONE_ASK;
break;

View File

@ -843,11 +843,6 @@ static void set_partition(struct fdisk_context *cxt,
dos_partition_set_start(p, start - offset);
dos_partition_set_size(p, stop - start + 1);
if (!doext) {
struct fdisk_parttype *t =
fdisk_label_get_parttype_from_code(cxt->label, sysid);
fdisk_info_new_partition(cxt, i + 1, start, stop, t);
}
if (is_dos_compatible(cxt) && (start/(cxt->geom.sectors*cxt->geom.heads) > 1023))
start = cxt->geom.heads*cxt->geom.sectors*1024 - 1;
set_hsc(p->bh, p->bs, p->bc, start);
@ -1142,6 +1137,15 @@ static int add_partition(struct fdisk_context *cxt, size_t n,
MBR_DOS_EXTENDED_PARTITION, 0);
}
/* report */
{
struct fdisk_parttype *t =
fdisk_label_get_parttype_from_code(cxt->label, sys);
fdisk_info_new_partition(cxt, n + 1, start, stop, t);
fdisk_free_parttype(t);
}
if (IS_EXTENDED(sys)) {
struct pte *pen = self_pte(cxt, n);
@ -1807,6 +1811,44 @@ static int dos_get_partition(struct fdisk_context *cxt, size_t n,
return 0;
}
static int dos_set_partition(struct fdisk_context *cxt, size_t n,
struct fdisk_partition *pa)
{
struct dos_partition *p;
struct pte *pe;
sector_t start, size;
assert(cxt);
assert(pa);
assert(cxt->label);
assert(fdisk_is_label(cxt, DOS));
if (n >= cxt->label->nparts_max)
return -EINVAL;
if (pa->type && IS_EXTENDED(pa->type->code)) {
fdisk_warnx(cxt, _("You cannot change a partition into an "
"extended one or vice versa. Delete it first."));
return -EINVAL;
}
if (pa->type && !pa->type->code)
fdisk_warnx(cxt, _("Type 0 means free space to many systems. "
"Having partitions of type 0 is probably unwise."));
pe = self_pte(cxt, n);
p = self_partition(cxt, n);
start = pa->start ? pa->start : get_abs_partition_start(pe);
size = pa->size ? pa->size : dos_partition_get_size(p);
set_partition(cxt, n, 0, start, start + size - 1,
pa->type ? pa->type->code : p->sys_ind,
pa->boot);
partition_set_changed(cxt, n, 1);
return 0;
}
static void print_chain_of_logicals(struct fdisk_context *cxt)
{
size_t i;
@ -2114,6 +2156,7 @@ static const struct fdisk_label_operations dos_operations =
.set_id = dos_set_disklabel_id,
.get_part = dos_get_partition,
.set_part = dos_set_partition,
.add_part = dos_add_partition,
.del_part = dos_delete_partition,