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 boot [OPTIONS] DRIVE\n\n" 16 "Edit the PMBR sector for legacy BIOSes\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 " -i NUM Set bootable partition\n" 22 " -b FILE Install bootloader code in the PMBR\n" 23 " -p Create legacy PMBR partition table\n" 24 "\n" 25 "With no options, it will just print the PMBR boot guid\n" 26 "\n", progname); 27 } 28 29 30 int cmd_boot(int argc, char *argv[]) { 31 CgptBootParams params; 32 memset(¶ms, 0, sizeof(params)); 33 34 35 int c; 36 int errorcnt = 0; 37 char *e = 0; 38 39 opterr = 0; // quiet, you 40 while ((c=getopt(argc, argv, ":hi:b:pD:")) != -1) 41 { 42 switch (c) 43 { 44 case 'D': 45 params.drive_size = strtoull(optarg, &e, 0); 46 if (!*optarg || (e && *e)) 47 { 48 Error("invalid argument to -%c: \"%s\"\n", c, optarg); 49 errorcnt++; 50 } 51 break; 52 case 'i': 53 params.partition = (uint32_t)strtoul(optarg, &e, 0); 54 if (!*optarg || (e && *e)) 55 { 56 Error("invalid argument to -%c: \"%s\"\n", c, optarg); 57 errorcnt++; 58 } 59 break; 60 case 'b': 61 params.bootfile = optarg; 62 break; 63 case 'p': 64 params.create_pmbr = 1; 65 break; 66 67 case 'h': 68 Usage(); 69 return CGPT_OK; 70 case '?': 71 Error("unrecognized option: -%c\n", optopt); 72 errorcnt++; 73 break; 74 case ':': 75 Error("missing argument to -%c\n", optopt); 76 errorcnt++; 77 break; 78 default: 79 errorcnt++; 80 break; 81 } 82 } 83 if (errorcnt) 84 { 85 Usage(); 86 return CGPT_FAILED; 87 } 88 89 if (optind >= argc) { 90 Error("missing drive argument\n"); 91 return CGPT_FAILED; 92 } 93 94 params.drive_name = argv[optind]; 95 96 return CgptBoot(¶ms); 97 } 98