1 // Copyright (c) 2012 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 #include <getopt.h> 6 #include <string.h> 7 8 #include "cgpt.h" 9 #include "vboot_host.h" 10 11 extern const char* progname; 12 13 static void Usage(void) 14 { 15 printf("\nUsage: %s repair [OPTIONS] DRIVE\n\n" 16 "Repair damaged GPT headers and tables.\n\n" 17 "Options:\n" 18 " -D NUM Size (in bytes) of the disk where partitions reside\n" 19 " default 0, meaning partitions and GPT structs are\n" 20 " both on DRIVE\n" 21 " -v Verbose\n" 22 "\n", progname); 23 } 24 25 int cmd_repair(int argc, char *argv[]) { 26 CgptRepairParams params; 27 memset(¶ms, 0, sizeof(params)); 28 29 int c; 30 char* e = 0; 31 int errorcnt = 0; 32 33 opterr = 0; // quiet, you 34 while ((c=getopt(argc, argv, ":hvD:")) != -1) 35 { 36 switch (c) 37 { 38 case 'D': 39 params.drive_size = strtoull(optarg, &e, 0); 40 if (!*optarg || (e && *e)) 41 { 42 Error("invalid argument to -%c: \"%s\"\n", c, optarg); 43 errorcnt++; 44 } 45 break; 46 case 'v': 47 params.verbose++; 48 break; 49 50 case 'h': 51 Usage(); 52 return CGPT_OK; 53 case '?': 54 Error("unrecognized option: -%c\n", optopt); 55 errorcnt++; 56 break; 57 case ':': 58 Error("missing argument to -%c\n", optopt); 59 errorcnt++; 60 break; 61 default: 62 errorcnt++; 63 break; 64 } 65 } 66 if (errorcnt) 67 { 68 Usage(); 69 return CGPT_FAILED; 70 } 71 72 params.drive_name = argv[optind]; 73 74 return CgptRepair(¶ms); 75 } 76