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
GenerateGuid(Guid * newguid)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
Usage(void)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
main(int argc,char * argv[])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