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
17const char* progname;
18
19int GenerateGuid(Guid *newguid)
20{
21  /* From libuuid */
22  uuid_generate(newguid->u.raw);
23  return CGPT_OK;
24}
25
26struct {
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
42void 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
55int 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