fdisk: sanitize partition name printing; drop "Code" column; get rid of one static var
function old new delta list_table 2335 2373 +38 fill_bounds 131 128 -3 part_array_len 4 - -4 get_boot 1584 1574 -10 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 1/2 up/down: 38/-17) Total: 21 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
351ab8278e
commit
29516ac0e4
@ -121,6 +121,7 @@
|
|||||||
# define BLKGETSIZE64 _IOR(0x12,114,size_t)
|
# define BLKGETSIZE64 _IOR(0x12,114,size_t)
|
||||||
#endif
|
#endif
|
||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
|
#include "unicode.h"
|
||||||
|
|
||||||
#if BB_LITTLE_ENDIAN
|
#if BB_LITTLE_ENDIAN
|
||||||
# define inline_if_little_endian ALWAYS_INLINE
|
# define inline_if_little_endian ALWAYS_INLINE
|
||||||
|
@ -36,14 +36,13 @@ typedef struct {
|
|||||||
uint64_t lba_start;
|
uint64_t lba_start;
|
||||||
uint64_t lba_end;
|
uint64_t lba_end;
|
||||||
uint64_t flags;
|
uint64_t flags;
|
||||||
uint16_t name[36];
|
uint16_t name36[36];
|
||||||
} gpt_partition;
|
} gpt_partition;
|
||||||
|
|
||||||
static gpt_header *gpt_hdr;
|
static gpt_header *gpt_hdr;
|
||||||
|
|
||||||
static char *part_array;
|
static char *part_array;
|
||||||
static unsigned int n_parts;
|
static unsigned int n_parts;
|
||||||
static unsigned int part_array_len;
|
|
||||||
static unsigned int part_entry_len;
|
static unsigned int part_entry_len;
|
||||||
|
|
||||||
static inline gpt_partition *
|
static inline gpt_partition *
|
||||||
@ -73,18 +72,34 @@ gpt_print_guid(uint8_t *buf)
|
|||||||
buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]);
|
buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: real unicode support */
|
|
||||||
static void
|
static void
|
||||||
gpt_print_wide(uint16_t *s, int max_len)
|
gpt_print_wide36(uint16_t *s)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_UNICODE_SUPPORT
|
||||||
|
char buf[37 * 4];
|
||||||
|
wchar_t wc[37];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
while (i < ARRAY_SIZE(wc)-1) {
|
||||||
while (i < max_len) {
|
if (s[i] == 0)
|
||||||
if (*s == 0)
|
break;
|
||||||
return;
|
wc[i] = s[i];
|
||||||
fputc(*s, stdout);
|
i++;
|
||||||
s++;
|
|
||||||
}
|
}
|
||||||
|
wc[i] = 0;
|
||||||
|
if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1)
|
||||||
|
fputs(printable_string(NULL, buf), stdout);
|
||||||
|
#else
|
||||||
|
char buf[37];
|
||||||
|
int i = 0;
|
||||||
|
while (i < ARRAY_SIZE(buf)-1) {
|
||||||
|
if (s[i] == 0)
|
||||||
|
break;
|
||||||
|
buf[i] = (s[i] < 0x7f) ? s[i] : '?';
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
buf[i] = '\0';
|
||||||
|
fputs(printable_string(NULL, buf), stdout);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -106,19 +121,28 @@ gpt_list_table(int xtra UNUSED_PARAM)
|
|||||||
(unsigned long long)SWAP_LE64(gpt_hdr->first_usable_lba),
|
(unsigned long long)SWAP_LE64(gpt_hdr->first_usable_lba),
|
||||||
(unsigned long long)SWAP_LE64(gpt_hdr->last_usable_lba));
|
(unsigned long long)SWAP_LE64(gpt_hdr->last_usable_lba));
|
||||||
|
|
||||||
puts("Number Start (sector) End (sector) Size Code Name");
|
/* "GPT fdisk" has a concept of 16-bit extension of the original MBR 8-bit type codes,
|
||||||
|
* which it displays here: its output columns are ... Size Code Name
|
||||||
|
* They are their own invention and are not stored on disk.
|
||||||
|
* Looks like they use them to support "hybrid" GPT: for example, they have
|
||||||
|
* AddType(0x8307, "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3", "Linux ARM32 root (/)");
|
||||||
|
* and then (code>>8) matches what you need to put into MBR's type field for such a partition.
|
||||||
|
* To print those codes, we'd need a GUID lookup table. Lets just drop the "Code" column instead:
|
||||||
|
*/
|
||||||
|
puts("Number Start (sector) End (sector) Size Name");
|
||||||
|
// 123456 123456789012345 123456789012345 12345 abc
|
||||||
for (i = 0; i < n_parts; i++) {
|
for (i = 0; i < n_parts; i++) {
|
||||||
gpt_partition *p = gpt_part(i);
|
gpt_partition *p = gpt_part(i);
|
||||||
if (p->lba_start) {
|
if (p->lba_start) {
|
||||||
smart_ulltoa5((1 + SWAP_LE64(p->lba_end) - SWAP_LE64(p->lba_start)) * sector_size,
|
smart_ulltoa5((1 + SWAP_LE64(p->lba_end) - SWAP_LE64(p->lba_start)) * sector_size,
|
||||||
numstr6, " KMGTPEZY")[0] = '\0';
|
numstr6, " KMGTPEZY")[0] = '\0';
|
||||||
printf("%4u %15llu %15llu %11s %04x ",
|
printf("%6u %15llu %15llu %s ",
|
||||||
i + 1,
|
i + 1,
|
||||||
(unsigned long long)SWAP_LE64(p->lba_start),
|
(unsigned long long)SWAP_LE64(p->lba_start),
|
||||||
(unsigned long long)SWAP_LE64(p->lba_end),
|
(unsigned long long)SWAP_LE64(p->lba_end),
|
||||||
numstr6,
|
numstr6
|
||||||
0x0700 /* FIXME */);
|
);
|
||||||
gpt_print_wide(p->name, 18);
|
gpt_print_wide36(p->name36);
|
||||||
bb_putchar('\n');
|
bb_putchar('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,6 +151,7 @@ gpt_list_table(int xtra UNUSED_PARAM)
|
|||||||
static int
|
static int
|
||||||
check_gpt_label(void)
|
check_gpt_label(void)
|
||||||
{
|
{
|
||||||
|
unsigned part_array_len;
|
||||||
struct partition *first = pt_offset(MBRbuffer, 0);
|
struct partition *first = pt_offset(MBRbuffer, 0);
|
||||||
struct pte pe;
|
struct pte pe;
|
||||||
uint32_t crc;
|
uint32_t crc;
|
||||||
@ -150,6 +175,7 @@ check_gpt_label(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init_unicode();
|
||||||
if (!global_crc32_table) {
|
if (!global_crc32_table) {
|
||||||
global_crc32_table = crc32_filltable(NULL, 0);
|
global_crc32_table = crc32_filltable(NULL, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user