Home | History | Annotate | Download | only in cgpt
      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