/* 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. * * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c * files for more details. */ #include #include #include #include #include "cgpt.h" #include "vboot_host.h" const char* progname; int GenerateGuid(Guid *newguid) { /* From libuuid */ uuid_generate(newguid->u.raw); return CGPT_OK; } struct { const char *name; int (*fp)(int argc, char *argv[]); const char *comment; } cmds[] = { {"create", cmd_create, "Create or reset GPT headers and tables"}, {"add", cmd_add, "Add, edit or remove a partition entry"}, {"show", cmd_show, "Show partition table and entries"}, {"repair", cmd_repair, "Repair damaged GPT headers and tables"}, {"boot", cmd_boot, "Edit the PMBR sector for legacy BIOSes"}, {"find", cmd_find, "Locate a partition by its GUID"}, {"edit", cmd_edit, "Edit a drive entry"}, {"prioritize", cmd_prioritize, "Reorder the priority of all kernel partitions"}, {"legacy", cmd_legacy, "Switch between GPT and Legacy GPT"}, }; static void Usage(void) { int i; printf("\nUsage: %s COMMAND [OPTIONS] DRIVE\n\n" "Supported COMMANDs:\n\n", progname); for (i = 0; i < sizeof(cmds)/sizeof(cmds[0]); ++i) { printf(" %-15s %s\n", cmds[i].name, cmds[i].comment); } printf("\nFor more detailed usage, use %s COMMAND -h\n\n", progname); } int main(int argc, char *argv[]) { int i; int match_count = 0; int match_index = 0; char* command; progname = strrchr(argv[0], '/'); if (progname) progname++; else progname = argv[0]; if (argc < 2) { Usage(); return CGPT_FAILED; } // increment optind now, so that getopt skips argv[0] in command function command = argv[optind++]; // Find the command to invoke. for (i = 0; command && i < sizeof(cmds)/sizeof(cmds[0]); ++i) { // exact match? if (0 == strcmp(cmds[i].name, command)) { match_index = i; match_count = 1; break; } // unique match? else if (0 == strncmp(cmds[i].name, command, strlen(command))) { match_index = i; match_count++; } } if (match_count == 1) return cmds[match_index].fp(argc, argv); // Couldn't find a single matching command. Usage(); return CGPT_FAILED; }