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 create [OPTIONS] DRIVE\n\n" 16 "Create or reset an empty GPT.\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 " -z Zero the sectors of the GPT table and entries\n" 22 " -p NUM Size (in blocks) of the disk to pad between the\n" 23 " primary GPT header and its entries, default 0\n" 24 "\n", progname); 25 } 26 27 int cmd_create(int argc, char *argv[]) { 28 CgptCreateParams params; 29 memset(¶ms, 0, sizeof(params)); 30 31 int c; 32 int errorcnt = 0; 33 char *e = 0; 34 35 opterr = 0; // quiet, you 36 while ((c=getopt(argc, argv, ":hzp:D:")) != -1) 37 { 38 switch (c) 39 { 40 case 'D': 41 params.drive_size = strtoull(optarg, &e, 0); 42 if (!*optarg || (e && *e)) 43 { 44 Error("invalid argument to -%c: \"%s\"\n", c, optarg); 45 errorcnt++; 46 } 47 break; 48 case 'z': 49 params.zap = 1; 50 break; 51 case 'p': 52 params.padding = strtoull(optarg, &e, 0); 53 if (!*optarg || (e && *e)) 54 { 55 Error("invalid argument to -%c: \"%s\"\n", c, optarg); 56 errorcnt++; 57 } 58 break; 59 case 'h': 60 Usage(); 61 return CGPT_OK; 62 case '?': 63 Error("unrecognized option: -%c\n", optopt); 64 errorcnt++; 65 break; 66 case ':': 67 Error("missing argument to -%c\n", optopt); 68 errorcnt++; 69 break; 70 default: 71 errorcnt++; 72 break; 73 } 74 } 75 if (errorcnt) 76 { 77 Usage(); 78 return CGPT_FAILED; 79 } 80 81 if (optind >= argc) { 82 Usage(); 83 return CGPT_FAILED; 84 } 85 86 params.drive_name = argv[optind]; 87 88 return CgptCreate(¶ms); 89 } 90