summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--disk-utils/cfdisk.c2
-rw-r--r--disk-utils/fdisk-menu.c49
-rw-r--r--disk-utils/fdisk.c48
3 files changed, 61 insertions, 38 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c
index fb6e1f625..88f9b48fa 100644
--- a/disk-utils/cfdisk.c
+++ b/disk-utils/cfdisk.c
@@ -1613,7 +1613,7 @@ static int ui_create_label(struct cfdisk *cf)
while (fdisk_next_label(cf->cxt, &lb) == 0) {
if (fdisk_label_is_disabled(lb) ||
- fdisk_label_is_labeltype(lb, FDISK_DISKLABEL_BSD))
+ fdisk_label_get_type(lb) == FDISK_DISKLABEL_BSD)
continue;
cm[i++].name = fdisk_label_get_name(lb);
}
diff --git a/disk-utils/fdisk-menu.c b/disk-utils/fdisk-menu.c
index 29bc01593..2233322e5 100644
--- a/disk-utils/fdisk-menu.c
+++ b/disk-utils/fdisk-menu.c
@@ -247,6 +247,16 @@ static const struct menu_entry *next_menu_entry(
struct fdisk_context *cxt,
struct menu_context *mc)
{
+ struct fdisk_label *lb = fdisk_get_label(cxt, NULL);
+ struct fdisk_context *parent = fdisk_get_parent(cxt);
+ unsigned int type = 0, pr_type = 0;
+
+ assert(cxt);
+
+ type = fdisk_label_get_type(lb);
+ if (parent)
+ pr_type = fdisk_label_get_type(fdisk_get_label(parent, NULL));
+
while (mc->menu_idx < ARRAY_SIZE(menus)) {
const struct menu *m = menus[mc->menu_idx];
const struct menu_entry *e = &(m->entries[mc->entry_idx]);
@@ -258,11 +268,11 @@ static const struct menu_entry *next_menu_entry(
/* no more entries */
if (e->title == NULL ||
/* menu wanted for specified labels only */
- (m->label && cxt->label && !(m->label & cxt->label->id)) ||
+ (m->label && lb && !(m->label & type)) ||
/* unwanted for nested PT */
- (m->nonested && cxt->parent) ||
+ (m->nonested && parent) ||
/* menu excluded for specified labels */
- (m->exclude && cxt->label && (m->exclude & cxt->label->id))) {
+ (m->exclude && lb && (m->exclude & type))) {
mc->menu_idx++;
mc->entry_idx = 0;
continue;
@@ -273,16 +283,15 @@ static const struct menu_entry *next_menu_entry(
*/
/* excluded for the current label */
- if ((e->exclude && cxt->label && e->exclude & cxt->label->id) ||
+ if ((e->exclude && lb && e->exclude & type) ||
/* entry wanted for specified labels only */
- (e->label && cxt->label && !(e->label & cxt->label->id)) ||
+ (e->label && lb && !(e->label & type)) ||
/* exclude non-expert entries in expect mode */
(e->expert == 0 && fdisk_is_details(cxt)) ||
/* nested only */
- (e->parent && (!cxt->parent || cxt->parent->label->id != e->parent)) ||
+ (e->parent && (!parent || pr_type != e->parent)) ||
/* exclude non-normal entries in normal mode */
(e->normal == 0 && !fdisk_is_details(cxt))) {
-
mc->entry_idx++;
continue;
}
@@ -367,11 +376,15 @@ static int print_fdisk_menu(struct fdisk_context *cxt)
}
fputc('\n', stdout);
- if (cxt->parent)
+ if (fdisk_get_parent(cxt)) {
+ struct fdisk_label *l = fdisk_get_label(cxt, NULL),
+ *p = fdisk_get_label(fdisk_get_parent(cxt), NULL);
+
fdisk_info(cxt, _("You're editing nested '%s' partition table, "
"primary partition table is '%s'."),
- cxt->label->name,
- cxt->parent->label->name);
+ fdisk_label_get_name(l),
+ fdisk_label_get_name(p));
+ }
return 0;
}
@@ -454,7 +467,7 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
rc = fdisk_write_disklabel(cxt);
if (rc)
err(EXIT_FAILURE, _("failed to write disklabel"));
- if (cxt->parent)
+ if (fdisk_get_parent(cxt))
break; /* nested PT, don't leave */
fdisk_info(cxt, _("The partition table has been altered."));
rc = fdisk_reread_partition_table(cxt);
@@ -526,8 +539,8 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
break;
case 'r':
/* return from nested BSD to DOS */
- if (cxt->parent) {
- *cxt0 = cxt->parent;
+ if (fdisk_get_parent(cxt)) {
+ *cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
fdisk_free_context(cxt);
@@ -666,8 +679,8 @@ static int dos_menu_cb(struct fdisk_context **cxt0,
break;
case 'M':
/* return from nested MBR to GPT */
- if (cxt->parent) {
- *cxt0 = cxt->parent;
+ if (fdisk_get_parent(cxt)) {
+ *cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
fdisk_free_context(cxt);
@@ -825,15 +838,15 @@ static int geo_menu_cb(struct fdisk_context **cxt0,
switch (ent->key) {
case 'c':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.cylinders,
+ rc = fdisk_ask_number(cxt, 1, fdisk_get_geom_cylinders(cxt),
1048576, _("Number of cylinders"), &c);
break;
case 'h':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.heads,
+ rc = fdisk_ask_number(cxt, 1, fdisk_get_geom_heads(cxt),
256, _("Number of heads"), &h);
break;
case 's':
- rc = fdisk_ask_number(cxt, 1, cxt->geom.sectors,
+ rc = fdisk_ask_number(cxt, 1, fdisk_get_geom_sectors(cxt),
63, _("Number of sectors"), &s);
break;
}
diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c
index 3b9431af3..d817afaff 100644
--- a/disk-utils/fdisk.c
+++ b/disk-utils/fdisk.c
@@ -59,7 +59,7 @@ int get_user_reply(struct fdisk_context *cxt, const char *prompt,
fflush(stdout);
if (!fgets(buf, bufsz, stdin)) {
- if (fdisk_label_is_changed(cxt->label)) {
+ if (fdisk_label_is_changed(fdisk_get_label(cxt, NULL))) {
fprintf(stderr, _("\nDo you really want to quit? "));
if (fgets(buf, bufsz, stdin) && !rpmatch(buf))
@@ -478,7 +478,6 @@ void change_partition_type(struct fdisk_context *cxt)
const char *old = NULL;
assert(cxt);
- assert(cxt->label);
if (fdisk_ask_partnum(cxt, &i, FALSE))
return;
@@ -511,34 +510,39 @@ void list_disk_geometry(struct fdisk_context *cxt)
{
char *id = NULL;
struct fdisk_label *lb = fdisk_get_label(cxt, NULL);
- uint64_t bytes = cxt->total_sectors * cxt->sector_size;
+ uint64_t bytes = fdisk_get_nsectors(cxt) * fdisk_get_sector_size(cxt);
char *strsz = size_to_human_string(SIZE_SUFFIX_SPACE
| SIZE_SUFFIX_3LETTER, bytes);
fdisk_info(cxt, _("Disk %s: %s, %ju bytes, %ju sectors"),
- cxt->dev_path, strsz,
- bytes, (uintmax_t) cxt->total_sectors);
+ fdisk_get_devname(cxt), strsz,
+ bytes, (uintmax_t) fdisk_get_nsectors(cxt));
free(strsz);
if (fdisk_label_require_geometry(lb) || fdisk_use_cylinders(cxt))
fdisk_info(cxt, _("Geometry: %d heads, %llu sectors/track, %llu cylinders"),
- cxt->geom.heads, cxt->geom.sectors, cxt->geom.cylinders);
+ fdisk_get_geom_heads(cxt),
+ fdisk_get_geom_sectors(cxt),
+ fdisk_get_geom_cylinders(cxt));
fdisk_info(cxt, _("Units: %s of %d * %ld = %ld bytes"),
fdisk_get_unit(cxt, PLURAL),
fdisk_get_units_per_sector(cxt),
- cxt->sector_size,
- fdisk_get_units_per_sector(cxt) * cxt->sector_size);
+ fdisk_get_sector_size(cxt),
+ fdisk_get_units_per_sector(cxt) * fdisk_get_sector_size(cxt));
fdisk_info(cxt, _("Sector size (logical/physical): %lu bytes / %lu bytes"),
- cxt->sector_size, cxt->phy_sector_size);
+ fdisk_get_sector_size(cxt),
+ fdisk_get_physector_size(cxt));
fdisk_info(cxt, _("I/O size (minimum/optimal): %lu bytes / %lu bytes"),
- cxt->min_io_size, cxt->io_size);
- if (cxt->alignment_offset)
+ fdisk_get_minimal_iosize(cxt),
+ fdisk_get_optimal_iosize(cxt));
+ if (fdisk_get_alignment_offset(cxt))
fdisk_info(cxt, _("Alignment offset: %lu bytes"),
- cxt->alignment_offset);
+ fdisk_get_alignment_offset(cxt));
if (fdisk_has_label(cxt))
- fdisk_info(cxt, _("Disklabel type: %s"), cxt->label->name);
+ fdisk_info(cxt, _("Disklabel type: %s"),
+ fdisk_label_get_name(lb));
if (fdisk_get_disklabel_id(cxt, &id) == 0 && id)
fdisk_info(cxt, _("Disk identifier: %s"), id);
@@ -549,6 +553,7 @@ void list_disklabel(struct fdisk_context *cxt)
struct fdisk_table *tb = NULL;
struct fdisk_partition *pa = NULL;
struct fdisk_iter *itr = NULL;
+ struct fdisk_label *lb;
struct libscols_table *out = NULL;
const char *bold = NULL;
int *ids = NULL; /* IDs of fdisk_fields */
@@ -581,12 +586,15 @@ void list_disklabel(struct fdisk_context *cxt)
bold = color_scheme_get_sequence("header", UL_COLOR_BOLD);
}
+ lb = fdisk_get_label(cxt, NULL);
+ assert(lb);
+
/* define output table columns */
for (i = 0; i < nids; i++) {
int fl = 0;
struct libscols_column *co;
const struct fdisk_field *field =
- fdisk_label_get_field(cxt->label, ids[i]);
+ fdisk_label_get_field(lb, ids[i]);
if (!field)
goto done;
if (fdisk_field_is_number(field))
@@ -693,15 +701,19 @@ static void dump_buffer(off_t base, unsigned char *buf, size_t sz, int all)
static void dump_blkdev(struct fdisk_context *cxt, const char *name,
off_t offset, size_t size, int all)
{
+ int fd = fdisk_get_devfd(cxt);
+
fdisk_info(cxt, _("\n%s: offset = %ju, size = %zu bytes."),
name, offset, size);
- if (lseek(cxt->dev_fd, offset, SEEK_SET) == (off_t) -1)
+ assert(fd >= 0);
+
+ if (lseek(fd, offset, SEEK_SET) == (off_t) -1)
fdisk_warn(cxt, _("cannot seek"));
else {
unsigned char *buf = xmalloc(size);
- if (read_all(cxt->dev_fd, (char *) buf, size) != (ssize_t) size)
+ if (read_all(fd, (char *) buf, size) != (ssize_t) size)
fdisk_warn(cxt, _("cannot read"));
else
dump_buffer(offset, buf, size, all);
@@ -714,9 +726,8 @@ void dump_firstsector(struct fdisk_context *cxt)
int all = !isatty(STDOUT_FILENO);
assert(cxt);
- assert(cxt->label);
- dump_blkdev(cxt, _("First sector"), 0, cxt->sector_size, all);
+ dump_blkdev(cxt, _("First sector"), 0, fdisk_get_sector_size(cxt), all);
}
void dump_disklabel(struct fdisk_context *cxt)
@@ -728,7 +739,6 @@ void dump_disklabel(struct fdisk_context *cxt)
size_t size = 0;
assert(cxt);
- assert(cxt->label);
while (fdisk_locate_disklabel(cxt, i++, &name, &offset, &size) == 0 && size)
dump_blkdev(cxt, name, offset, size, all);