summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fdisks/fdisk-menu.c8
-rw-r--r--fdisks/fdisk.c15
-rw-r--r--fdisks/fdiskbsdlabel.c228
-rw-r--r--fdisks/fdiskbsdlabel.h1
4 files changed, 147 insertions, 105 deletions
diff --git a/fdisks/fdisk-menu.c b/fdisks/fdisk-menu.c
index f78dfe762..59289ec96 100644
--- a/fdisks/fdisk-menu.c
+++ b/fdisks/fdisk-menu.c
@@ -558,7 +558,7 @@ static int bsd_menu_cb(struct fdisk_context **cxt0,
const struct menu_entry *ent)
{
struct fdisk_context *cxt = *cxt0;
- int rc = 0;
+ int rc = 0, org;
assert(cxt);
assert(ent);
@@ -574,7 +574,11 @@ static int bsd_menu_cb(struct fdisk_context **cxt0,
rc = fdisk_bsd_write_bootstrap(cxt);
break;
case 's':
- xbsd_print_disklabel(cxt, 1);
+ org = fdisk_context_display_details(cxt);
+
+ fdisk_context_enable_details(cxt, 1);
+ fdisk_list_disklabel(cxt);
+ fdisk_context_enable_details(cxt, org);
break;
case 'x':
rc = fdisk_bsd_link_partition(cxt);
diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c
index 36f436191..a27d64ee2 100644
--- a/fdisks/fdisk.c
+++ b/fdisks/fdisk.c
@@ -256,15 +256,10 @@ static void list_disk_geometry(struct fdisk_context *cxt)
printf("\n");
}
-static void list_table(struct fdisk_context *cxt, int xtra)
+static void list_table(struct fdisk_context *cxt)
{
list_disk_geometry(cxt);
-
- if (fdisk_is_disklabel(cxt, BSD))
- xbsd_print_disklabel(cxt, xtra);
- else
- fdisk_list_disklabel(cxt);
-
+ fdisk_list_disklabel(cxt);
}
static void verify(struct fdisk_context *cxt)
@@ -401,7 +396,7 @@ expert_command_prompt(struct fdisk_context *cxt)
fdisk_create_disklabel(cxt, "sgi");
break;
case 'p':
- list_table(cxt, 1);
+ list_table(cxt);
break;
case 'q':
handle_quit(cxt);
@@ -439,7 +434,7 @@ static void print_partition_table_from_option(
err(EXIT_FAILURE, _("cannot open %s"), device);
if (fdisk_dev_has_disklabel(cxt))
- list_table(cxt, 0);
+ list_table(cxt);
else
list_disk_geometry(cxt);
}
@@ -557,7 +552,7 @@ static void command_prompt(struct fdisk_context *cxt)
fdisk_create_disklabel(cxt, "dos");
break;
case 'p':
- list_table(cxt, 0);
+ list_table(cxt);
break;
case 'q':
handle_quit(cxt);
diff --git a/fdisks/fdiskbsdlabel.c b/fdisks/fdiskbsdlabel.c
index ab9642fb2..8792c5070 100644
--- a/fdisks/fdiskbsdlabel.c
+++ b/fdisks/fdiskbsdlabel.c
@@ -119,6 +119,7 @@ struct fdisk_bsd_label {
#endif
};
+static int bsd_list_disklabel(struct fdisk_context *cxt);
static int xbsd_delete_part (struct fdisk_context *cxt, size_t partnum);
static unsigned short xbsd_dkcksum (struct bsd_disklabel *lp);
@@ -343,9 +344,14 @@ static int xbsd_create_disklabel(struct fdisk_context *cxt)
rc = xbsd_initlabel(cxt);
if (!rc) {
- xbsd_print_disklabel (cxt, 1);
+ int org = fdisk_context_display_details(cxt);
+
cxt->label->nparts_cur = d->d_npartitions;
cxt->label->nparts_max = BSD_MAXPARTITIONS;
+
+ fdisk_context_enable_details(cxt, 1);
+ bsd_list_disklabel(cxt);
+ fdisk_context_enable_details(cxt, org);
}
return rc;
@@ -370,101 +376,138 @@ static int xbsd_delete_part(
return 0;
}
-void
-xbsd_print_disklabel (struct fdisk_context *cxt, int show_all)
+static int bsd_list_disklabel(struct fdisk_context *cxt)
{
- struct bsd_disklabel *lp = self_disklabel(cxt);
- struct bsd_partition *pp;
- FILE *f = stdout;
- int i, j;
-
- if (show_all) {
- fprintf(f, "# %s:\n", cxt->dev_path);
- if ((unsigned) lp->d_type < BSD_DKMAXTYPES)
- fprintf(f, _("type: %s\n"), xbsd_dktypenames[lp->d_type]);
- else
- fprintf(f, _("type: %d\n"), lp->d_type);
- fprintf(f, _("disk: %.*s\n"), (int) sizeof(lp->d_typename), lp->d_typename);
- fprintf(f, _("label: %.*s\n"), (int) sizeof(lp->d_packname), lp->d_packname);
- fprintf(f, _("flags:"));
- if (lp->d_flags & BSD_D_REMOVABLE)
- fprintf(f, _(" removable"));
- if (lp->d_flags & BSD_D_ECC)
- fprintf(f, _(" ecc"));
- if (lp->d_flags & BSD_D_BADSECT)
- fprintf(f, _(" badsect"));
- fprintf(f, "\n");
- /* On various machines the fields of *lp are short/int/long */
- /* In order to avoid problems, we cast them all to long. */
- fprintf(f, _("bytes/sector: %ld\n"), (long) lp->d_secsize);
- fprintf(f, _("sectors/track: %ld\n"), (long) lp->d_nsectors);
- fprintf(f, _("tracks/cylinder: %ld\n"), (long) lp->d_ntracks);
- fprintf(f, _("sectors/cylinder: %ld\n"), (long) lp->d_secpercyl);
- fprintf(f, _("cylinders: %ld\n"), (long) lp->d_ncylinders);
- fprintf(f, _("rpm: %d\n"), lp->d_rpm);
- fprintf(f, _("interleave: %d\n"), lp->d_interleave);
- fprintf(f, _("trackskew: %d\n"), lp->d_trackskew);
- fprintf(f, _("cylinderskew: %d\n"), lp->d_cylskew);
- fprintf(f, _("headswitch: %ld\t\t# milliseconds\n"),
- (long) lp->d_headswitch);
- fprintf(f, _("track-to-track seek: %ld\t# milliseconds\n"),
- (long) lp->d_trkseek);
- fprintf(f, _("drivedata: "));
- for (i = ARRAY_SIZE(lp->d_drivedata)- 1; i >= 0; i--)
- if (lp->d_drivedata[i])
- break;
- if (i < 0)
- i = 0;
- for (j = 0; j <= i; j++)
- fprintf(f, "%ld ", (long) lp->d_drivedata[j]);
- }
- fprintf (f, _("\n%d partitions:\n"), lp->d_npartitions);
- fprintf (f, _("# start end size fstype [fsize bsize cpg]\n"));
- pp = lp->d_partitions;
- for (i = 0; i < lp->d_npartitions; i++, pp++) {
- if (pp->p_size) {
- if (fdisk_context_use_cylinders(cxt) && lp->d_secpercyl) {
- fprintf(f, " %c: %8ld%c %8ld%c %8ld%c ",
- 'a' + i,
- (long) pp->p_offset / lp->d_secpercyl + 1,
- (pp->p_offset % lp->d_secpercyl) ? '*' : ' ',
- (long) (pp->p_offset + pp->p_size + lp->d_secpercyl - 1)
- / lp->d_secpercyl,
- ((pp->p_offset + pp->p_size) % lp->d_secpercyl) ? '*' : ' ',
- (long) pp->p_size / lp->d_secpercyl,
- (pp->p_size % lp->d_secpercyl) ? '*' : ' ');
- } else {
- fprintf(f, " %c: %8ld %8ld %8ld ",
- 'a' + i,
- (long) pp->p_offset,
- (long) pp->p_offset + pp->p_size - 1,
- (long) pp->p_size);
- }
- if ((unsigned) pp->p_fstype < BSD_FSMAXTYPES)
- fprintf(f, "%8.8s", xbsd_fstypes[pp->p_fstype].name);
- else
- fprintf(f, "%8x", pp->p_fstype);
- switch (pp->p_fstype) {
- case BSD_FS_UNUSED:
- fprintf(f, " %5ld %5ld %5.5s ",
- (long) pp->p_fsize, (long) pp->p_fsize * pp->p_frag, "");
- break;
-
- case BSD_FS_BSDFFS:
- fprintf(f, " %5ld %5ld %5d ",
- (long) pp->p_fsize, (long) pp->p_fsize * pp->p_frag,
- pp->p_cpg);
- break;
+ struct bsd_disklabel *d = self_disklabel(cxt);
+ struct bsd_partition *p;
+ struct tt *tb = NULL;
+ int i, rc, trunc = TT_FL_TRUNC;
- default:
- fprintf(f, "%22.22s", "");
- break;
- }
- fprintf(f, "\n");
- }
- }
+ assert(cxt);
+ assert(cxt->label);
+ assert(fdisk_is_disklabel(cxt, BSD));
+
+ if (fdisk_context_display_details(cxt)) {
+ fdisk_info(cxt, "# %s:", cxt->dev_path);
+
+ if ((unsigned) d->d_type < BSD_DKMAXTYPES)
+ fdisk_info(cxt, _("type: %s"), xbsd_dktypenames[d->d_type]);
+ else
+ fdisk_info(cxt, _("type: %d"), d->d_type);
+
+ fdisk_info(cxt, _("disk: %.*s"), (int) sizeof(d->d_typename), d->d_typename);
+ fdisk_info(cxt, _("label: %.*s"), (int) sizeof(d->d_packname), d->d_packname);
+
+ fdisk_info(cxt, _("flags: %s"),
+ d->d_flags & BSD_D_REMOVABLE ? _(" removable") :
+ d->d_flags & BSD_D_ECC ? _(" ecc") :
+ d->d_flags & BSD_D_BADSECT ? _(" badsect") : "");
+
+ /* On various machines the fields of *lp are short/int/long */
+ /* In order to avoid problems, we cast them all to long. */
+ fdisk_info(cxt, _("bytes/sector: %ld"), (long) d->d_secsize);
+ fdisk_info(cxt, _("sectors/track: %ld"), (long) d->d_nsectors);
+ fdisk_info(cxt, _("tracks/cylinder: %ld"), (long) d->d_ntracks);
+ fdisk_info(cxt, _("sectors/cylinder: %ld"), (long) d->d_secpercyl);
+ fdisk_info(cxt, _("cylinders: %ld"), (long) d->d_ncylinders);
+ fdisk_info(cxt, _("rpm: %d"), d->d_rpm);
+ fdisk_info(cxt, _("interleave: %d"), d->d_interleave);
+ fdisk_info(cxt, _("trackskew: %d"), d->d_trackskew);
+ fdisk_info(cxt, _("cylinderskew: %d"), d->d_cylskew);
+ fdisk_info(cxt, _("headswitch: %ld (milliseconds)"), (long) d->d_headswitch);
+ fdisk_info(cxt, _("track-to-track seek: %ld (milliseconds)"), (long) d->d_trkseek);
+ /*
+ fdisk_info(cxt, _("drivedata: "));
+ for (i = ARRAY_SIZE(d->d_drivedata)- 1; i >= 0; i--)
+ if (d->d_drivedata[i])
+ break;
+ if (i < 0)
+ i = 0;
+ for (j = 0; j <= i; j++)
+ fdisk_info(cxt, "%ld ", (long) d->d_drivedata[j]);
+ */
+ }
+
+ fdisk_info(cxt, _("partitions: %d"), d->d_npartitions);
+
+ tb = tt_new_table(TT_FL_FREEDATA);
+ if (!tb)
+ return -ENOMEM;
+
+ /* don't trunc anything in expert mode */
+ if (fdisk_context_display_details(cxt))
+ trunc = 0;
+
+ tt_define_column(tb, _("#"), 1, 0);
+ tt_define_column(tb, _("Start"), 9, TT_FL_RIGHT);
+ tt_define_column(tb, _("End"), 9, TT_FL_RIGHT);
+ tt_define_column(tb, _("Size"), 9, TT_FL_RIGHT);
+ tt_define_column(tb, _("Type"), 8, 0);
+ tt_define_column(tb, _("fsize"), 5, trunc);
+ tt_define_column(tb, _("bsize"), 5, trunc);
+ tt_define_column(tb, _("cpg"), 5, trunc);
+
+ for (i = 0, p = d->d_partitions; i < d->d_npartitions; i++, p++) {
+ char *s;
+ struct tt_line *ln;
+
+ if (!p->p_size)
+ continue;
+ ln = tt_add_line(tb, NULL);
+ if (!ln)
+ continue;
+
+ if (asprintf(&s, "%c", i + 'a') > 0)
+ tt_line_set_data(ln, 0, s);
+
+ if (fdisk_context_use_cylinders(cxt) && d->d_secpercyl) {
+ if (asprintf(&s, "%u%c",
+ p->p_offset / d->d_secpercyl + 1,
+ p->p_offset % d->d_secpercyl ? '*' : ' ') > 0)
+ tt_line_set_data(ln, 1, s);
+ if (asprintf(&s, "%u%c",
+ (p->p_offset + p->p_size + d->d_secpercyl - 1) / d->d_secpercyl,
+ (p->p_offset + p->p_size) % d->d_secpercyl ? '*' : ' ') > 0)
+ tt_line_set_data(ln, 2, s);
+ if (asprintf(&s, "%u%c",
+ p->p_size / d->d_secpercyl,
+ p->p_size % d->d_secpercyl ? '*' : ' ') > 0)
+ tt_line_set_data(ln, 3, s);
+ } else {
+ if (asprintf(&s, "%u", p->p_offset) > 0)
+ tt_line_set_data(ln, 1, s);
+ if (asprintf(&s, "%u", p->p_offset + p->p_size - 1) > 0)
+ tt_line_set_data(ln, 2, s);
+ if (asprintf(&s, "%u", p->p_size) > 0)
+ tt_line_set_data(ln, 3, s);
+ }
+
+ if ((unsigned) p->p_fstype < BSD_FSMAXTYPES)
+ rc = asprintf(&s, "%s", xbsd_fstypes[p->p_fstype].name);
+ else
+ rc = asprintf(&s, "%x", p->p_fstype);
+ if (rc > 0)
+ tt_line_set_data(ln, 4, s);
+
+ if (p->p_fstype == BSD_FS_UNUSED
+ || p->p_fstype == BSD_FS_BSDFFS) {
+ if (asprintf(&s, "%u", p->p_fsize) > 0)
+ tt_line_set_data(ln, 5, s);
+ if (asprintf(&s, "%u", p->p_fsize * p->p_frag) > 0)
+ tt_line_set_data(ln, 6, s);
+ }
+ if (p->p_fstype == BSD_FS_BSDFFS
+ && asprintf(&s, "%u", p->p_cpg) > 0)
+ tt_line_set_data(ln, 7, s);
+ }
+
+ rc = fdisk_print_table(cxt, tb);
+ tt_free_table(tb);
+
+ return rc;
}
+
static uint32_t ask_uint32(struct fdisk_context *cxt,
uint32_t dflt, char *mesg)
{
@@ -923,6 +966,7 @@ static int bsd_get_partition_status(
static const struct fdisk_label_operations bsd_operations =
{
.probe = bsd_probe_label,
+ .list = bsd_list_disklabel,
.write = xbsd_write_disklabel,
.create = xbsd_create_disklabel,
.part_add = xbsd_add_part,
diff --git a/fdisks/fdiskbsdlabel.h b/fdisks/fdiskbsdlabel.h
index b7274fdba..e06e5e938 100644
--- a/fdisks/fdiskbsdlabel.h
+++ b/fdisks/fdiskbsdlabel.h
@@ -38,7 +38,6 @@
#include "pt-bsd.h"
extern int btrydev(struct fdisk_context *cxt);
-extern void xbsd_print_disklabel(struct fdisk_context *cxt, int);
/* public bsd specific functions */
extern int fdisk_bsd_edit_disklabel(struct fdisk_context *cxt);