1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 * 5 * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c 6 * files for more details. 7 */ 8 9 #include <stdio.h> 10 #include <string.h> 11 #include <unistd.h> 12 #include <uuid/uuid.h> 13 14 #include "cgpt.h" 15 #include "vboot_host.h" 16 17 const char* progname; 18 19 int GenerateGuid(Guid *newguid) 20 { 21 /* From libuuid */ 22 uuid_generate(newguid->u.raw); 23 return CGPT_OK; 24 } 25 26 struct { 27 const char *name; 28 int (*fp)(int argc, char *argv[]); 29 const char *comment; 30 } cmds[] = { 31 {"create", cmd_create, "Create or reset GPT headers and tables"}, 32 {"add", cmd_add, "Add, edit or remove a partition entry"}, 33 {"show", cmd_show, "Show partition table and entries"}, 34 {"repair", cmd_repair, "Repair damaged GPT headers and tables"}, 35 {"boot", cmd_boot, "Edit the PMBR sector for legacy BIOSes"}, 36 {"find", cmd_find, "Locate a partition by its GUID"}, 37 {"prioritize", cmd_prioritize, 38 "Reorder the priority of all kernel partitions"}, 39 {"legacy", cmd_legacy, "Switch between GPT and Legacy GPT"}, 40 }; 41 42 void Usage(void) { 43 int i; 44 45 printf("\nUsage: %s COMMAND [OPTIONS] DRIVE\n\n" 46 "Supported COMMANDs:\n\n", 47 progname); 48 49 for (i = 0; i < sizeof(cmds)/sizeof(cmds[0]); ++i) { 50 printf(" %-15s %s\n", cmds[i].name, cmds[i].comment); 51 } 52 printf("\nFor more detailed usage, use %s COMMAND -h\n\n", progname); 53 } 54 55 int main(int argc, char *argv[]) { 56 int i; 57 int match_count = 0; 58 int match_index = 0; 59 char* command; 60 61 progname = strrchr(argv[0], '/'); 62 if (progname) 63 progname++; 64 else 65 progname = argv[0]; 66 67 if (argc < 2) { 68 Usage(); 69 return CGPT_FAILED; 70 } 71 72 // increment optind now, so that getopt skips argv[0] in command function 73 command = argv[optind++]; 74 75 // Find the command to invoke. 76 for (i = 0; command && i < sizeof(cmds)/sizeof(cmds[0]); ++i) { 77 // exact match? 78 if (0 == strcmp(cmds[i].name, command)) { 79 match_index = i; 80 match_count = 1; 81 break; 82 } 83 // unique match? 84 else if (0 == strncmp(cmds[i].name, command, strlen(command))) { 85 match_index = i; 86 match_count++; 87 } 88 } 89 90 if (match_count == 1) 91 return cmds[match_index].fp(argc, argv); 92 93 // Couldn't find a single matching command. 94 Usage(); 95 96 return CGPT_FAILED; 97 } 98