From 607f2b404e992174d7c5956d11e8f35f78d2701f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 23 Aug 2016 16:13:33 +0200 Subject: [PATCH] fdisk: print much less cryptic partition table Before: Device Boot Start End Blocks Id System /dev/sdb1 * 1 998 255471+ 6 FAT16 What are "blocks"? What is that "+"? How big is this partition? Is start/end shown came from LBA fields or CHS fields? Why are we torturing the user?? After: Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/sdb1 * 0,1,1 996,15,32 32 510974 510943 249M 6 FAT16 Signed-off-by: Denys Vlasenko --- util-linux/fdisk.c | 190 ++++++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 87 deletions(-) diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c index 6391f9bd9..6b5e3880f 100644 --- a/util-linux/fdisk.c +++ b/util-linux/fdisk.c @@ -363,7 +363,6 @@ struct globals { jmp_buf listingbuf; char line_buffer[80]; - char partname_buffer[80]; /* Raw disk label. For DOS-type partition tables the MBR, * with descriptions of the primary partitions. */ char MBRbuffer[MAX_SECTOR_SIZE]; @@ -399,7 +398,6 @@ struct globals { #define total_number_of_sectors (G.total_number_of_sectors) #define listingbuf (G.listingbuf ) #define line_buffer (G.line_buffer ) -#define partname_buffer (G.partname_buffer) #define MBRbuffer (G.MBRbuffer ) #define ptes (G.ptes ) #define INIT_G() do { \ @@ -468,9 +466,6 @@ static sector_t bb_BLKGETSIZE_sectors(int fd) #define cylinder(s, c) ((c) | (((s) & 0xc0) << 2)) -#define hsc2sector(h,s,c) \ - (sector(s) - 1 + sectors * ((h) + heads * cylinder(s,c))) - static void close_dev_fd(void) { @@ -478,44 +473,6 @@ close_dev_fd(void) xmove_fd(xopen(bb_dev_null, O_RDONLY), dev_fd); } -/* - * Return partition name - uses static storage - */ -static const char * -partname(const char *dev, int pno, int lth) -{ - const char *p; - int w, wp; - int bufsiz; - char *bufp; - - bufp = partname_buffer; - bufsiz = sizeof(partname_buffer); - - w = strlen(dev); - p = ""; - - if (isdigit(dev[w-1])) - p = "p"; - - /* devfs kludge - note: fdisk partition names are not supposed - to equal kernel names, so there is no reason to do this */ - if (strcmp(dev + w - 4, "disc") == 0) { - w -= 4; - p = "part"; - } - - wp = strlen(p); - - if (lth) { - snprintf(bufp, bufsiz, "%*.*s%s%-2u", - lth-wp-2, w, dev, p, pno); - } else { - snprintf(bufp, bufsiz, "%.*s%s%-2u", w, dev, p, pno); - } - return bufp; -} - static ALWAYS_INLINE struct partition * get_part_table(int i) { @@ -1898,14 +1855,14 @@ check_consistency(const struct partition *p, int partition) return; /* do not check extended partitions */ /* physical beginning c, h, s */ - pbc = (p->cyl & 0xff) | ((p->sector << 2) & 0x300); + pbc = cylinder(p->sector, p->cyl); pbh = p->head; - pbs = p->sector & 0x3f; + pbs = sector(p->sector); /* physical ending c, h, s */ - pec = (p->end_cyl & 0xff) | ((p->end_sector << 2) & 0x300); + pec = cylinder(p->end_sector, p->end_cyl); peh = p->end_head; - pes = p->end_sector & 0x3f; + pes = sector(p->end_sector); /* compute logical beginning (c, h, s) */ linear2chs(get_start_sect(p), &lbc, &lbh, &lbs); @@ -1916,17 +1873,17 @@ check_consistency(const struct partition *p, int partition) /* Same physical / logical beginning? */ if (g_cylinders <= 1024 && (pbc != lbc || pbh != lbh || pbs != lbs)) { printf("Partition %u has different physical/logical " - "beginnings (non-Linux?):\n", partition + 1); - printf(" phys=(%u, %u, %u) ", pbc, pbh, pbs); - printf("logical=(%u, %u, %u)\n", lbc, lbh, lbs); + "start (non-Linux?):\n", partition + 1); + printf(" phys=(%u,%u,%u) ", pbc, pbh, pbs); + printf("logical=(%u,%u,%u)\n", lbc, lbh, lbs); } /* Same physical / logical ending? */ if (g_cylinders <= 1024 && (pec != lec || peh != leh || pes != les)) { printf("Partition %u has different physical/logical " - "endings:\n", partition + 1); - printf(" phys=(%u, %u, %u) ", pec, peh, pes); - printf("logical=(%u, %u, %u)\n", lec, leh, les); + "end:\n", partition + 1); + printf(" phys=(%u,%u,%u) ", pec, peh, pes); + printf("logical=(%u,%u,%u)\n", lec, leh, les); } /* Ending on cylinder boundary? */ @@ -2099,10 +2056,53 @@ fix_partition_table_order(void) } #endif +/* Return partition name */ +static const char * +partname(const char *dev, int pno, int lth) +{ + const char *p; + int w, wp; + int bufsiz; + char *bufp; + + bufp = auto_string(xzalloc(80)); + bufsiz = 80; + + w = strlen(dev); + p = ""; + + if (isdigit(dev[w-1])) + p = "p"; + + /* devfs kludge - note: fdisk partition names are not supposed + to equal kernel names, so there is no reason to do this */ + if (strcmp(dev + w - 4, "disc") == 0) { + w -= 4; + p = "part"; + } + + wp = strlen(p); + + if (lth) { + snprintf(bufp, bufsiz, "%*.*s%s%-2u", + lth-wp-2, w, dev, p, pno); + } else { + snprintf(bufp, bufsiz, "%.*s%s%-2u", w, dev, p, pno); + } + return bufp; +} + +static const char * +chs_string11(unsigned cyl, unsigned head, unsigned sect) +{ + char *buf = auto_string(xzalloc(sizeof(int)*3 * 3)); + sprintf(buf, "%u,%u,%u", cylinder(sect,cyl), head, sector(sect)); + return buf; +} + static void list_table(int xtra) { - const struct partition *p; int i, w; if (LABEL_IS_SUN) { @@ -2126,50 +2126,62 @@ list_table(int xtra) } /* Heuristic: we list partition 3 of /dev/foo as /dev/foo3, - but if the device name ends in a digit, say /dev/foo1, - then the partition is called /dev/foo1p3. */ + * but if the device name ends in a digit, say /dev/foo1, + * then the partition is called /dev/foo1p3. + */ w = strlen(disk_device); if (w && isdigit(disk_device[w-1])) w++; - if (w < 5) - w = 5; + if (w < 7) + w = 7; - // 1 12345678901 12345678901 12345678901 12 - printf("%*s Boot Start End Blocks Id System\n", - w+1, "Device"); + printf("%-*s Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type\n", + w-1, "Device"); for (i = 0; i < g_partitions; i++) { + const struct partition *p; const struct pte *pe = &ptes[i]; - sector_t psects; - sector_t pblocks; - unsigned podd; + char boot4[4]; + char numstr6[6]; + sector_t start_sect; + sector_t end_sect; + sector_t nr_sects; p = pe->part_table; if (!p || is_cleared_partition(p)) continue; - psects = get_nr_sects(p); - pblocks = psects; - podd = 0; - - if (sector_size < 1024) { - pblocks /= (1024 / sector_size); - podd = psects % (1024 / sector_size); + sprintf(boot4, "%02x", p->boot_ind); + if ((p->boot_ind & 0x7f) == 0) { + /* 0x80 shown as '*', 0x00 is ' ' */ + boot4[0] = p->boot_ind ? '*' : ' '; + boot4[1] = ' '; } - if (sector_size > 1024) - pblocks *= (sector_size / 1024); - printf("%s %c %11"SECT_FMT"u %11"SECT_FMT"u %11"SECT_FMT"u%c %2x %s\n", - partname(disk_device, i+1, w+2), - !p->boot_ind ? ' ' : p->boot_ind == ACTIVE_FLAG /* boot flag */ - ? '*' : '?', - cround(get_partition_start_from_dev_start(pe)), /* start */ - cround(get_partition_start_from_dev_start(pe) + psects /* end */ - - (psects ? 1 : 0)), - pblocks, podd ? '+' : ' ', /* odd flag on end */ - p->sys_ind, /* type id */ - partition_type(p->sys_ind)); /* type name */ + start_sect = get_partition_start_from_dev_start(pe); + end_sect = start_sect; + nr_sects = get_nr_sects(p); + if (nr_sects != 0) + end_sect += nr_sects - 1; + smart_ulltoa5((ullong)nr_sects * sector_size, + numstr6, " KMGTPEZY")[0] = '\0'; + +#define SFMT SECT_FMT + // Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type + printf("%s%s %-11s"/**/" %-11s"/**/" %10"SFMT"u %10"SFMT"u %10"SFMT"u %s %2x %s\n", + partname(disk_device, i+1, w+2), + boot4, + chs_string11(p->cyl, p->head, p->sector), + chs_string11(p->end_cyl, p->end_head, p->end_sector), + start_sect, + end_sect, + nr_sects, + numstr6, + p->sys_ind, + partition_type(p->sys_ind) + ); +#undef SFMT check_consistency(p, i); } @@ -2198,13 +2210,17 @@ x_list_table(int extend) p = (extend ? pe->ext_pointer : pe->part_table); if (p != NULL) { printf("%2u %02x%4u%4u%5u%4u%4u%5u%11"SECT_FMT"u%11"SECT_FMT"u %02x\n", - i + 1, p->boot_ind, p->head, + i + 1, p->boot_ind, + p->head, sector(p->sector), - cylinder(p->sector, p->cyl), p->end_head, + cylinder(p->sector, p->cyl), + p->end_head, sector(p->end_sector), cylinder(p->end_sector, p->end_cyl), - get_start_sect(p), get_nr_sects(p), - p->sys_ind); + get_start_sect(p), + get_nr_sects(p), + p->sys_ind + ); if (p->sys_ind) check_consistency(p, i); } -- 2.25.1