diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-11-27 06:13:43 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-11-27 06:13:43 +0100 |
commit | 29516ac0e41fc41dd15b7d0c67bd160f03d21bbb (patch) | |
tree | 5c5df00c64e1ed9361243540657e3391c69004c2 | |
parent | 351ab8278e9719cfdc2abb348017b4e5909bcee8 (diff) | |
download | busybox-w32-29516ac0e41fc41dd15b7d0c67bd160f03d21bbb.tar.gz busybox-w32-29516ac0e41fc41dd15b7d0c67bd160f03d21bbb.tar.bz2 busybox-w32-29516ac0e41fc41dd15b7d0c67bd160f03d21bbb.zip |
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>
-rw-r--r-- | util-linux/fdisk.c | 1 | ||||
-rw-r--r-- | util-linux/fdisk_gpt.c | 56 |
2 files changed, 42 insertions, 15 deletions
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c index af8073532..b988e65a9 100644 --- a/util-linux/fdisk.c +++ b/util-linux/fdisk.c | |||
@@ -121,6 +121,7 @@ | |||
121 | # define BLKGETSIZE64 _IOR(0x12,114,size_t) | 121 | # define BLKGETSIZE64 _IOR(0x12,114,size_t) |
122 | #endif | 122 | #endif |
123 | #include "libbb.h" | 123 | #include "libbb.h" |
124 | #include "unicode.h" | ||
124 | 125 | ||
125 | #if BB_LITTLE_ENDIAN | 126 | #if BB_LITTLE_ENDIAN |
126 | # define inline_if_little_endian ALWAYS_INLINE | 127 | # define inline_if_little_endian ALWAYS_INLINE |
diff --git a/util-linux/fdisk_gpt.c b/util-linux/fdisk_gpt.c index 715e227ca..9b17b4a57 100644 --- a/util-linux/fdisk_gpt.c +++ b/util-linux/fdisk_gpt.c | |||
@@ -36,14 +36,13 @@ typedef struct { | |||
36 | uint64_t lba_start; | 36 | uint64_t lba_start; |
37 | uint64_t lba_end; | 37 | uint64_t lba_end; |
38 | uint64_t flags; | 38 | uint64_t flags; |
39 | uint16_t name[36]; | 39 | uint16_t name36[36]; |
40 | } gpt_partition; | 40 | } gpt_partition; |
41 | 41 | ||
42 | static gpt_header *gpt_hdr; | 42 | static gpt_header *gpt_hdr; |
43 | 43 | ||
44 | static char *part_array; | 44 | static char *part_array; |
45 | static unsigned int n_parts; | 45 | static unsigned int n_parts; |
46 | static unsigned int part_array_len; | ||
47 | static unsigned int part_entry_len; | 46 | static unsigned int part_entry_len; |
48 | 47 | ||
49 | static inline gpt_partition * | 48 | static inline gpt_partition * |
@@ -73,18 +72,34 @@ gpt_print_guid(uint8_t *buf) | |||
73 | buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); | 72 | buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); |
74 | } | 73 | } |
75 | 74 | ||
76 | /* TODO: real unicode support */ | ||
77 | static void | 75 | static void |
78 | gpt_print_wide(uint16_t *s, int max_len) | 76 | gpt_print_wide36(uint16_t *s) |
79 | { | 77 | { |
78 | #if ENABLE_UNICODE_SUPPORT | ||
79 | char buf[37 * 4]; | ||
80 | wchar_t wc[37]; | ||
80 | int i = 0; | 81 | int i = 0; |
81 | 82 | while (i < ARRAY_SIZE(wc)-1) { | |
82 | while (i < max_len) { | 83 | if (s[i] == 0) |
83 | if (*s == 0) | 84 | break; |
84 | return; | 85 | wc[i] = s[i]; |
85 | fputc(*s, stdout); | 86 | i++; |
86 | s++; | 87 | } |
88 | wc[i] = 0; | ||
89 | if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1) | ||
90 | fputs(printable_string(NULL, buf), stdout); | ||
91 | #else | ||
92 | char buf[37]; | ||
93 | int i = 0; | ||
94 | while (i < ARRAY_SIZE(buf)-1) { | ||
95 | if (s[i] == 0) | ||
96 | break; | ||
97 | buf[i] = (s[i] < 0x7f) ? s[i] : '?'; | ||
98 | i++; | ||
87 | } | 99 | } |
100 | buf[i] = '\0'; | ||
101 | fputs(printable_string(NULL, buf), stdout); | ||
102 | #endif | ||
88 | } | 103 | } |
89 | 104 | ||
90 | static void | 105 | static void |
@@ -106,19 +121,28 @@ gpt_list_table(int xtra UNUSED_PARAM) | |||
106 | (unsigned long long)SWAP_LE64(gpt_hdr->first_usable_lba), | 121 | (unsigned long long)SWAP_LE64(gpt_hdr->first_usable_lba), |
107 | (unsigned long long)SWAP_LE64(gpt_hdr->last_usable_lba)); | 122 | (unsigned long long)SWAP_LE64(gpt_hdr->last_usable_lba)); |
108 | 123 | ||
109 | puts("Number Start (sector) End (sector) Size Code Name"); | 124 | /* "GPT fdisk" has a concept of 16-bit extension of the original MBR 8-bit type codes, |
125 | * which it displays here: its output columns are ... Size Code Name | ||
126 | * They are their own invention and are not stored on disk. | ||
127 | * Looks like they use them to support "hybrid" GPT: for example, they have | ||
128 | * AddType(0x8307, "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3", "Linux ARM32 root (/)"); | ||
129 | * and then (code>>8) matches what you need to put into MBR's type field for such a partition. | ||
130 | * To print those codes, we'd need a GUID lookup table. Lets just drop the "Code" column instead: | ||
131 | */ | ||
132 | puts("Number Start (sector) End (sector) Size Name"); | ||
133 | // 123456 123456789012345 123456789012345 12345 abc | ||
110 | for (i = 0; i < n_parts; i++) { | 134 | for (i = 0; i < n_parts; i++) { |
111 | gpt_partition *p = gpt_part(i); | 135 | gpt_partition *p = gpt_part(i); |
112 | if (p->lba_start) { | 136 | if (p->lba_start) { |
113 | smart_ulltoa5((1 + SWAP_LE64(p->lba_end) - SWAP_LE64(p->lba_start)) * sector_size, | 137 | smart_ulltoa5((1 + SWAP_LE64(p->lba_end) - SWAP_LE64(p->lba_start)) * sector_size, |
114 | numstr6, " KMGTPEZY")[0] = '\0'; | 138 | numstr6, " KMGTPEZY")[0] = '\0'; |
115 | printf("%4u %15llu %15llu %11s %04x ", | 139 | printf("%6u %15llu %15llu %s ", |
116 | i + 1, | 140 | i + 1, |
117 | (unsigned long long)SWAP_LE64(p->lba_start), | 141 | (unsigned long long)SWAP_LE64(p->lba_start), |
118 | (unsigned long long)SWAP_LE64(p->lba_end), | 142 | (unsigned long long)SWAP_LE64(p->lba_end), |
119 | numstr6, | 143 | numstr6 |
120 | 0x0700 /* FIXME */); | 144 | ); |
121 | gpt_print_wide(p->name, 18); | 145 | gpt_print_wide36(p->name36); |
122 | bb_putchar('\n'); | 146 | bb_putchar('\n'); |
123 | } | 147 | } |
124 | } | 148 | } |
@@ -127,6 +151,7 @@ gpt_list_table(int xtra UNUSED_PARAM) | |||
127 | static int | 151 | static int |
128 | check_gpt_label(void) | 152 | check_gpt_label(void) |
129 | { | 153 | { |
154 | unsigned part_array_len; | ||
130 | struct partition *first = pt_offset(MBRbuffer, 0); | 155 | struct partition *first = pt_offset(MBRbuffer, 0); |
131 | struct pte pe; | 156 | struct pte pe; |
132 | uint32_t crc; | 157 | uint32_t crc; |
@@ -150,6 +175,7 @@ check_gpt_label(void) | |||
150 | return 0; | 175 | return 0; |
151 | } | 176 | } |
152 | 177 | ||
178 | init_unicode(); | ||
153 | if (!global_crc32_table) { | 179 | if (!global_crc32_table) { |
154 | global_crc32_table = crc32_filltable(NULL, 0); | 180 | global_crc32_table = crc32_filltable(NULL, 0); |
155 | } | 181 | } |