xref: /aosp_15_r20/external/vboot_reference/cgpt/cgpt.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1 /* Copyright 2010 The ChromiumOS Authors
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   {"edit", cmd_edit, "Edit a drive entry"},
38   {"prioritize", cmd_prioritize,
39    "Reorder the priority of all kernel partitions"},
40   {"legacy", cmd_legacy, "Switch between GPT and Legacy GPT"},
41 };
42 
Usage(void)43 static void Usage(void) {
44   int i;
45 
46   printf("\nUsage: %s COMMAND [OPTIONS] DRIVE\n\n"
47          "Supported COMMANDs:\n\n",
48          progname);
49 
50   for (i = 0; i < sizeof(cmds)/sizeof(cmds[0]); ++i) {
51     printf("    %-15s  %s\n", cmds[i].name, cmds[i].comment);
52   }
53   printf("\nFor more detailed usage, use %s COMMAND -h\n\n", progname);
54 }
55 
main(int argc,char * argv[])56 int main(int argc, char *argv[]) {
57   int i;
58   int match_count = 0;
59   int match_index = 0;
60   char* command;
61 
62   progname = strrchr(argv[0], '/');
63   if (progname)
64     progname++;
65   else
66     progname = argv[0];
67 
68   if (argc < 2) {
69     Usage();
70     return CGPT_FAILED;
71   }
72 
73   // increment optind now, so that getopt skips argv[0] in command function
74   command = argv[optind++];
75 
76   // Find the command to invoke.
77   for (i = 0; command && i < sizeof(cmds)/sizeof(cmds[0]); ++i) {
78     // exact match?
79     if (0 == strcmp(cmds[i].name, command)) {
80       match_index = i;
81       match_count = 1;
82       break;
83     }
84     // unique match?
85     else if (0 == strncmp(cmds[i].name, command, strlen(command))) {
86       match_index = i;
87       match_count++;
88     }
89   }
90 
91   if (match_count == 1)
92     return cmds[match_index].fp(argc, argv);
93 
94   // Couldn't find a single matching command.
95   Usage();
96 
97   return CGPT_FAILED;
98 }
99