| Index: utility/cgpt/cgpt_show.c
|
| diff --git a/utility/cgpt/cgpt_show.c b/utility/cgpt/cgpt_show.c
|
| deleted file mode 100644
|
| index 2dfad40e665d84ce38104dc833cbdbecddd937e9..0000000000000000000000000000000000000000
|
| --- a/utility/cgpt/cgpt_show.c
|
| +++ /dev/null
|
| @@ -1,304 +0,0 @@
|
| -/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - *
|
| - * Show GPT details.
|
| - */
|
| -#include <getopt.h>
|
| -#include <stdio.h>
|
| -#include <stdlib.h>
|
| -#include "cgpt.h"
|
| -#include "cgptlib_internal.h"
|
| -#include "cgpt_tofix.h"
|
| -#include "utility.h"
|
| -
|
| -/* Integers to store parsed argument. */
|
| -static int help, number, verbose;
|
| -
|
| -/* The structure for getopt_long(). When you add/delete any line, please refine
|
| - * attribute_comments[] and third parameter of getopt_long() too. */
|
| -static struct option show_options[] = {
|
| - {.name = "help", .has_arg = no_argument, .flag = 0, .val = 'h'},
|
| - {.name = "number", .has_arg = no_argument, .flag = 0, .val = 'n'},
|
| - {.name = "verbose", .has_arg = no_argument, .flag = 0, .val = 'v'},
|
| - { /* last element, which should be zero. */ }
|
| -};
|
| -
|
| -/* Extra information than struct option, please update this structure if you
|
| - * add/remove any line in attribute_options[]. */
|
| -static struct option_details show_options_details[] = {
|
| - /* help */
|
| - { .comment = "print this help",
|
| - .validator = AssignTrue,
|
| - .valid_range = 0,
|
| - .parsed = &help},
|
| - /* number */
|
| - { .comment = "print raw numbers (don't interpret)",
|
| - .validator = AssignTrue,
|
| - .valid_range = 0,
|
| - .parsed = &number},
|
| - /* verbose */
|
| - { .comment = "verbose print",
|
| - .validator = AssignTrue,
|
| - .valid_range = 0,
|
| - .parsed = &verbose},
|
| - { /* last element, which should be zero. */ }
|
| -};
|
| -
|
| -void ShowHelp() {
|
| - printf("\nUsage: %s show [OPTIONS] device_name\n\n", progname);
|
| - ShowOptions(show_options, show_options_details, ARRAY_COUNT(show_options));
|
| - printf("\n");
|
| -}
|
| -
|
| -/* Generate output like:
|
| - *
|
| - * [AB-CD-EF-01] for group = 1
|
| - * [ABCD-EF01] for group = 3 (low byte first)
|
| - *
|
| - * Needs (size*3-1+3) bytes of space in 'buf' (included the tailing '\0').
|
| - */
|
| -#define BUFFER_SIZE(size) (size *3 - 1 + 3)
|
| -static short Uint8To2Chars(const uint8_t t) {
|
| - int h = t >> 4;
|
| - int l = t & 0xf;
|
| - h = (h >= 0xA) ? h - 0xA + 'A' : h + '0';
|
| - l = (l >= 0xA) ? l - 0xA + 'A' : l + '0';
|
| - return (h << 8) + l;
|
| -}
|
| -static void RawDump(const uint8_t *memory, const int size,
|
| - char *buf, int group) {
|
| - int i, outlen = 0;
|
| - buf[outlen++] = '[';
|
| - for (i = 0; i < size; ++i) {
|
| - short c2 = Uint8To2Chars(memory[i]);
|
| - buf[outlen++] = c2 >> 8;
|
| - buf[outlen++] = c2 & 0xff;
|
| - if (i != (size - 1) && ((i + 1) % group) == 0)
|
| - buf[outlen++] = '-';
|
| - }
|
| - buf[outlen++] = ']';
|
| - buf[outlen++] = '\0';
|
| -}
|
| -
|
| -/* Outpur formatters */
|
| -#define TITLE_FMT "%10s%10s%8s %s\n"
|
| -#define GPT_FMT "%10d%10d%8s %s\n"
|
| -#define GPT_MORE "%10s%10s%8s ", "", "", ""
|
| -#define PARTITION_FMT "%10d%10d%8d %s\n"
|
| -#define PARTITION_MORE "%10s%10s%8s %s%s\n", "", "", ""
|
| -
|
| -static void HeaderDetails(GptHeader *header, const char *indent, int raw) {
|
| - int i;
|
| -
|
| - printf("%sSig: ", indent);
|
| - if (raw == NOT_INITED) {
|
| - printf("[");
|
| - for (i = 0; i < sizeof(header->signature); ++i)
|
| - printf("%c", header->signature[i]);
|
| - printf("]");
|
| - } else {
|
| - char buf[BUFFER_SIZE(sizeof(header->signature))];
|
| - RawDump((uint8_t *)header->signature, sizeof(header->signature), buf, 1);
|
| - printf("%s", buf);
|
| - }
|
| - printf("\n");
|
| -
|
| - printf("%sRev: 0x%08x\n", indent, header->revision);
|
| - printf("%sSize: %d\n", indent, header->size);
|
| - printf("%sHeader CRC: 0x%08x\n", indent, header->header_crc32);
|
| - printf("%sMy LBA: %lld\n", indent, (long long)header->my_lba);
|
| - printf("%sFirst LBA: %lld\n", indent, (long long)header->first_usable_lba);
|
| - printf("%sLast LBA: %lld\n", indent, (long long)header->last_usable_lba);
|
| -
|
| - { /* For disk guid */
|
| - char buf[GUID_STRLEN];
|
| - GuidToStr(&header->disk_uuid, buf);
|
| - printf("%sDisk UUID: %s\n", indent, buf);
|
| - }
|
| -
|
| - printf("%sEntries LBA: %lld\n", indent, (long long)header->entries_lba);
|
| - printf("%sNumber of entries: %d\n", indent, header->number_of_entries);
|
| - printf("%sSize of entry: %d\n", indent, header->size_of_entry);
|
| - printf("%sEntries CRC: 0x%08x\n", indent, header->entries_crc32);
|
| -}
|
| -
|
| -void EntryDetails(GptEntry *entry, int index, int raw) {
|
| - char contents[256];
|
| -
|
| - if (raw == NOT_INITED) {
|
| - uint8_t label[sizeof(entry->name) * 3 / 2];
|
| - char type[GUID_STRLEN], unique[GUID_STRLEN];;
|
| -
|
| - UTF16ToUTF8(entry->name, label);
|
| - snprintf(contents, sizeof(contents), "Label: \"%s\"", label);
|
| - printf(PARTITION_FMT, (int)entry->starting_lba,
|
| - (int)(entry->ending_lba - entry->starting_lba + 1),
|
| - index+1, contents);
|
| - if (CGPT_OK == ResolveType(&entry->type, type)) {
|
| - printf(PARTITION_MORE, "Type: ", type);
|
| - } else {
|
| - GuidToStr(&entry->type, type);
|
| - printf(PARTITION_MORE, "Type: ", type);
|
| - }
|
| - GuidToStr(&entry->unique, unique);
|
| - printf(PARTITION_MORE, "UUID: ", unique);
|
| - if (!Memcmp(&guid_chromeos_kernel, &entry->type, sizeof(Guid))) {
|
| - int tries = (entry->attributes & CGPT_ATTRIBUTE_TRIES_MASK) >>
|
| - CGPT_ATTRIBUTE_TRIES_OFFSET;
|
| - int successful = (entry->attributes & CGPT_ATTRIBUTE_SUCCESSFUL_MASK) >>
|
| - CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET;
|
| - int priority = (entry->attributes & CGPT_ATTRIBUTE_PRIORITY_MASK) >>
|
| - CGPT_ATTRIBUTE_PRIORITY_OFFSET;
|
| - snprintf(contents, sizeof(contents),
|
| - "priority=%d tries=%d successful=%d",
|
| - priority, tries, successful);
|
| - printf(PARTITION_MORE, "Attr: ", contents);
|
| - }
|
| - } else {
|
| - char label[BUFFER_SIZE(sizeof(entry->name))];
|
| - char type[GUID_STRLEN], unique[GUID_STRLEN];
|
| -
|
| - RawDump((void*)entry->name, sizeof(entry->name), label, 2);
|
| - snprintf(contents, sizeof(contents), "Label: %s", label);
|
| - printf(PARTITION_FMT, (int)entry->starting_lba,
|
| - (int)(entry->ending_lba - entry->starting_lba + 1),
|
| - index+1, contents);
|
| - GuidToStr(&entry->type, type);
|
| - printf(PARTITION_MORE, "Type: ", type);
|
| - GuidToStr(&entry->unique, unique);
|
| - printf(PARTITION_MORE, "UUID: ", unique);
|
| - snprintf(contents, sizeof(contents), "[%016lx]", entry->attributes);
|
| - printf(PARTITION_MORE, "Attr: ", contents);
|
| - }
|
| -}
|
| -
|
| -void EntriesDetails(GptData *gpt, const int secondary, int raw) {
|
| - int i;
|
| -
|
| - for (i = 0; i < GetNumberOfEntries(gpt); ++i) {
|
| - GptEntry *entry;
|
| - entry = GetEntry(gpt, secondary, i);
|
| -
|
| - if (!Memcmp(&guid_unused, &entry->type, sizeof(Guid))) continue;
|
| -
|
| - EntryDetails(entry, i, raw);
|
| - }
|
| -}
|
| -
|
| -/* Parses all options (and validates them), then opens the drive.
|
| - * Show GPT information in following order:
|
| - *
|
| - * Primary header sector
|
| - * details (if -v applied)
|
| - *
|
| - * Primary table sectors
|
| - *
|
| - * 1st partition
|
| - * details (if -v applied)
|
| - * :
|
| - * last partition
|
| - * details (if -v applied)
|
| - *
|
| - * Secondary table sectors
|
| - *
|
| - * Secondary header sector
|
| - * details (if -v applied)
|
| - */
|
| -int CgptShow(int argc, char *argv[]) {
|
| - struct drive drive;
|
| -
|
| - /* I know this is NOT the perfect place to put code to make options[] and
|
| - * details[] are synced. But this is the best place we have right now since C
|
| - * preprocessor doesn't know sizeof() for #if directive. */
|
| - assert(ARRAY_COUNT(show_options) ==
|
| - ARRAY_COUNT(show_options_details));
|
| -
|
| - help = number = NOT_INITED;
|
| -
|
| - if (CGPT_OK != HandleOptions(argc, argv,
|
| - "hnv",
|
| - ARRAY_COUNT(show_options),
|
| - show_options,
|
| - show_options_details))
|
| - return CGPT_FAILED;
|
| - if (help != NOT_INITED) {
|
| - ShowHelp();
|
| - return CGPT_FAILED;
|
| - }
|
| -
|
| - if (CGPT_OK != OpenDriveInLastArgument(argc, argv, &drive))
|
| - return CGPT_FAILED;
|
| -
|
| - printf(TITLE_FMT, "start", "size", "part", "contents");
|
| - printf(GPT_FMT, 0, GPT_PMBR_SECTOR, "", "PMBR");
|
| -
|
| - if (drive.gpt.valid_headers & MASK_PRIMARY) {
|
| - printf(GPT_FMT, (int)GPT_PMBR_SECTOR,
|
| - (int)GPT_HEADER_SECTOR, "", "Pri GPT header");
|
| - if (verbose) {
|
| - GptHeader *header;
|
| - char indent[64];
|
| -
|
| - snprintf(indent, sizeof(indent), GPT_MORE);
|
| - header = (GptHeader*)drive.gpt.primary_header;
|
| - HeaderDetails(header, indent, number);
|
| - }
|
| - } else {
|
| - printf(GPT_FMT, (int)GPT_PMBR_SECTOR,
|
| - (int)GPT_HEADER_SECTOR, "INVALID", "Pri GPT header");
|
| - }
|
| -
|
| - printf(GPT_FMT, (int)(GPT_PMBR_SECTOR + GPT_HEADER_SECTOR),
|
| - (int)GPT_ENTRIES_SECTORS,
|
| - drive.gpt.valid_entries & MASK_PRIMARY ? "" : "INVALID",
|
| - "Pri GPT table");
|
| -
|
| - if (drive.gpt.valid_entries & MASK_PRIMARY)
|
| - EntriesDetails(&drive.gpt, PRIMARY, number);
|
| -
|
| - printf(GPT_FMT, (int)(drive.gpt.drive_sectors - GPT_HEADER_SECTOR -
|
| - GPT_ENTRIES_SECTORS),
|
| - (int)GPT_ENTRIES_SECTORS,
|
| - drive.gpt.valid_entries & MASK_SECONDARY ? "" : "INVALID",
|
| - "Sec GPT table");
|
| - /* We show secondary table details if any of following is true.
|
| - * 1. only secondary is valid.
|
| - * 2. secondary is not identical to promary.
|
| - */
|
| - if ((drive.gpt.valid_entries & MASK_SECONDARY) &&
|
| - (!(drive.gpt.valid_entries & MASK_PRIMARY) ||
|
| - Memcmp(drive.gpt.primary_entries, drive.gpt.secondary_entries,
|
| - TOTAL_ENTRIES_SIZE))) {
|
| - EntriesDetails(&drive.gpt, SECONDARY, number);
|
| - }
|
| -
|
| - if (drive.gpt.valid_headers & MASK_SECONDARY)
|
| - printf(GPT_FMT, (int)(drive.gpt.drive_sectors - GPT_HEADER_SECTOR),
|
| - (int)GPT_HEADER_SECTOR, "", "Sec GPT header");
|
| - else
|
| - printf(GPT_FMT, (int)GPT_PMBR_SECTOR,
|
| - (int)GPT_HEADER_SECTOR, "INVALID", "Sec GPT header");
|
| - /* We show secondary header if any of following is true:
|
| - * 1. only secondary is valid.
|
| - * 2. secondary is not synonymous to primary.
|
| - */
|
| - if ((drive.gpt.valid_headers & MASK_SECONDARY) &&
|
| - (!(drive.gpt.valid_headers & MASK_PRIMARY) ||
|
| - !IsSynonymous((GptHeader*)drive.gpt.primary_header,
|
| - (GptHeader*)drive.gpt.secondary_header))) {
|
| - if (verbose) {
|
| - GptHeader *header;
|
| - char indent[64];
|
| -
|
| - snprintf(indent, sizeof(indent), GPT_MORE);
|
| - header = (GptHeader*)drive.gpt.secondary_header;
|
| - HeaderDetails(header, indent, number);
|
| - }
|
| - }
|
| -
|
| - CheckValid(&drive);
|
| - DriveClose(&drive);
|
| -
|
| - return CGPT_OK;
|
| -}
|
|
|