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