fdisk: (bds) use nested partition table

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2013-03-05 15:14:04 +01:00
parent 01b207133e
commit e09435aa53
3 changed files with 35 additions and 34 deletions

View File

@ -1084,9 +1084,13 @@ static void command_prompt(struct fdisk_context *cxt)
if (fdisk_is_disklabel(cxt, SGI))
sgi_set_bootfile(cxt);
else if (fdisk_is_disklabel(cxt, DOS)) {
fdisk_context_switch_label(cxt, "bsd");
bsd_command_prompt(cxt);
fdisk_context_switch_label(cxt, "dos");
struct fdisk_context *bsd;
bsd = fdisk_new_nested_context(cxt, "bsd");
if (bsd)
bsd_command_prompt(bsd);
fdisk_free_context(bsd);
} else
unknown_command(c);
break;

View File

@ -153,12 +153,10 @@ static int is_bsd_partition_type(int type)
static int xbsd_write_disklabel (struct fdisk_context *cxt)
{
#if defined (__alpha__)
printf (_("Writing disklabel to %s.\n"), cxt->dev_path);
#if defined (__alpha__)
xbsd_writelabel (cxt, NULL, &xbsd_dlabel);
#else
printf (_("Writing disklabel to %s.\n"),
partname(cxt->dev_path, xbsd_part_index+1, 0));
xbsd_writelabel (cxt, xbsd_part, &xbsd_dlabel);
#endif
reread_partition_table(cxt, 0); /* no exit yet */
@ -228,12 +226,7 @@ static int xbsd_create_disklabel(struct fdisk_context *cxt)
assert(cxt->label);
assert(fdisk_is_disklabel(cxt, OSF));
#if defined (__alpha__)
fprintf (stderr, _("%s contains no disklabel.\n"), cxt->dev_path);
#else
fprintf (stderr, _("%s contains no disklabel.\n"),
partname(cxt->dev_path, xbsd_part_index+1, 0));
#endif
while (1) {
c = read_char(cxt, _("Do you want to create a disklabel? (y/n) "));
@ -264,19 +257,28 @@ bsd_command_prompt (struct fdisk_context *cxt)
int t, ss;
struct partition *p;
assert(cxt);
assert(cxt->parent);
for (t=0; t<4; t++) {
p = get_part_table(t);
if (p && is_bsd_partition_type(p->sys_ind)) {
xbsd_part = p;
xbsd_part_index = t;
ss = get_start_sect(xbsd_part);
/* TODO - partname uses static buffer!!! */
cxt->dev_path = partname(cxt->parent->dev_path, t+1, 0);
if (cxt->dev_path)
cxt->dev_path = strdup(cxt->dev_path);
if (ss == 0) {
fprintf (stderr, _("Partition %s has invalid starting sector 0.\n"),
partname(cxt->dev_path, t+1, 0));
cxt->dev_path);
return;
}
printf (_("Reading disklabel of %s at sector %d.\n"),
partname(cxt->dev_path, t+1, 0), ss + BSD_LABELSECTOR);
cxt->dev_path, ss + BSD_LABELSECTOR);
if (xbsd_readlabel (cxt, xbsd_part, &xbsd_dlabel) == 0)
if (xbsd_create_disklabel (cxt) == 0)
return;
@ -376,11 +378,7 @@ xbsd_print_disklabel (struct fdisk_context *cxt, int show_all)
int i, j;
if (show_all) {
#if defined (__alpha__)
fprintf(f, "# %s:\n", cxt->dev_path);
#else
fprintf(f, "# %s:\n", partname(cxt->dev_path, xbsd_part_index+1, 0));
#endif
if ((unsigned) lp->d_type < BSD_DKMAXTYPES)
fprintf(f, _("type: %s\n"), xbsd_dktypenames[lp->d_type]);
else
@ -594,12 +592,7 @@ xbsd_write_bootstrap (struct fdisk_context *cxt)
if (BSD_BBSIZE != write (cxt->dev_fd, disklabelbuffer, BSD_BBSIZE))
fatal (cxt, unable_to_write);
#if defined (__alpha__)
printf (_("Bootstrap installed on %s.\n"), cxt->dev_path);
#else
printf (_("Bootstrap installed on %s.\n"),
partname (cxt->dev_path, xbsd_part_index+1, 0));
#endif
sync_disks ();
}
@ -791,7 +784,6 @@ xbsd_readlabel (struct fdisk_context *cxt, struct partition *p, struct xbsd_disk
cxt->label->nparts_cur = d->d_npartitions;
cxt->label->nparts_max = BSD_MAXPARTITIONS;
return 1;
}
@ -862,22 +854,27 @@ xbsd_translate_fstype (int linux_type)
}
}
/*
* link partition from parent (DOS) to nested BSD partition table
*/
static void
xbsd_link_part (struct fdisk_context *cxt)
{
int k, i;
struct partition *p;
size_t k;
int i;
struct partition *p;
k = get_partition (cxt, 1, cxt->label->nparts_max);
if (fdisk_ask_partnum(cxt->parent, &k, FALSE))
return;
if (xbsd_check_new_partition(cxt, &i))
return;
if (xbsd_check_new_partition(cxt, &i))
return;
p = get_part_table(k);
p = get_part_table(k);
xbsd_dlabel.d_partitions[i].p_size = get_nr_sects(p);
xbsd_dlabel.d_partitions[i].p_offset = get_start_sect(p);
xbsd_dlabel.d_partitions[i].p_fstype = xbsd_translate_fstype(p->sys_ind);
xbsd_dlabel.d_partitions[i].p_size = get_nr_sects(p);
xbsd_dlabel.d_partitions[i].p_offset = get_start_sect(p);
xbsd_dlabel.d_partitions[i].p_fstype = xbsd_translate_fstype(p->sys_ind);
}
#endif

View File

@ -1050,7 +1050,7 @@ static struct fdisk_parttype *dos_get_parttype(
assert(cxt);
assert(cxt->label);
assert(fdisk_is_disklabel(cxt, OSF));
assert(fdisk_is_disklabel(cxt, DOS));
if (partnum >= cxt->label->nparts_max)
return NULL;
@ -1071,7 +1071,7 @@ static int dos_set_parttype(
assert(cxt);
assert(cxt->label);
assert(fdisk_is_disklabel(cxt, OSF));
assert(fdisk_is_disklabel(cxt, DOS));
if (partnum >= cxt->label->nparts_max || !t || t->type > UINT8_MAX)
return -EINVAL;