tls: reorder a few more cipher ids
[oweals/busybox.git] / util-linux / fdisk_gpt.c
index 5786d5f7d753d6e1e414e84a58cca306dcf5b5aa..dbe889f7c32681ef5efa7de0cf342df637661d17 100644 (file)
@@ -36,14 +36,13 @@ typedef struct {
        uint64_t lba_start;
        uint64_t lba_end;
        uint64_t flags;
-       uint16_t name[36];
+       uint16_t name36[36];
 } gpt_partition;
 
 static gpt_header *gpt_hdr;
 
 static char *part_array;
 static unsigned int n_parts;
-static unsigned int part_array_len;
 static unsigned int part_entry_len;
 
 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]);
 }
 
-/* TODO: real unicode support */
 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;
-
-       while (i < max_len) {
-               if (*s == 0)
-                       return;
-               fputc(*s, stdout);
-               s++;
+       while (i < ARRAY_SIZE(wc)-1) {
+               if (s[i] == 0)
+                       break;
+               wc[i] = s[i];
+               i++;
+       }
+       wc[i] = 0;
+       if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1)
+               fputs(printable_string(buf), stdout);
+#else
+       char buf[37];
+       int i = 0;
+       while (i < ARRAY_SIZE(buf)-1) {
+               if (s[i] == 0)
+                       break;
+               buf[i] = (0x20 <= s[i] && s[i] < 0x7f) ? s[i] : '?';
+               i++;
        }
+       buf[i] = '\0';
+       fputs(buf, stdout);
+#endif
 }
 
 static void
@@ -106,20 +121,29 @@ gpt_list_table(int xtra UNUSED_PARAM)
                (unsigned long long)SWAP_LE64(gpt_hdr->first_usable_lba),
                (unsigned long long)SWAP_LE64(gpt_hdr->last_usable_lba));
 
-       printf("Number  Start (sector)    End (sector)  Size       Code  Name\n");
+/* "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++) {
                gpt_partition *p = gpt_part(i);
                if (p->lba_start) {
                        smart_ulltoa5((1 + SWAP_LE64(p->lba_end) - SWAP_LE64(p->lba_start)) * sector_size,
                                numstr6, " KMGTPEZY")[0] = '\0';
-                       printf("%4u %15llu %15llu %11s   %04x  ",
+                       printf("%6u %15llu %15llu %s ",
                                i + 1,
                                (unsigned long long)SWAP_LE64(p->lba_start),
                                (unsigned long long)SWAP_LE64(p->lba_end),
-                               numstr6,
-                               0x0700 /* FIXME */);
-                       gpt_print_wide(p->name, 18);
-                       printf("\n");
+                               numstr6
+                       );
+                       gpt_print_wide36(p->name36);
+                       bb_putchar('\n');
                }
        }
 }
@@ -127,6 +151,7 @@ gpt_list_table(int xtra UNUSED_PARAM)
 static int
 check_gpt_label(void)
 {
+       unsigned part_array_len;
        struct partition *first = pt_offset(MBRbuffer, 0);
        struct pte pe;
        uint32_t crc;
@@ -150,8 +175,9 @@ check_gpt_label(void)
                return 0;
        }
 
+       init_unicode();
        if (!global_crc32_table) {
-               global_crc32_table = crc32_filltable(NULL, 0);
+               global_crc32_new_table_le();
        }
 
        crc = SWAP_LE32(gpt_hdr->hdr_crc32);