1a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson// Use of this source code is governed by a BSD-style license that can be 3f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson// found in the LICENSE file. 4f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 5f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson#include <getopt.h> 6f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson#include <string.h> 7f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 80c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include "cgpt.h" 90c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include "vboot_host.h" 10f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 114cb5497984642b8cbd592c14cb1912a787b2d4d7Bill Richardsonextern const char* progname; 124cb5497984642b8cbd592c14cb1912a787b2d4d7Bill Richardson 13f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardsonstatic void Usage(void) 14f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson{ 15f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson printf("\nUsage: %s create [OPTIONS] DRIVE\n\n" 16f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "Create or reset an empty GPT.\n\n" 17f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "Options:\n" 18ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen " -D NUM Size (in bytes) of the disk where partitions reside\n" 19ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen " default 0, meaning partitions and GPT structs are\n" 20ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen " both on DRIVE\n" 21f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -z Zero the sectors of the GPT table and entries\n" 22ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen " -p NUM Size (in blocks) of the disk to pad between the\n" 23ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen " primary GPT header and its entries, default 0\n" 24f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "\n", progname); 25f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson} 26f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 27f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardsonint cmd_create(int argc, char *argv[]) { 28a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan CgptCreateParams params; 29a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan memset(¶ms, 0, sizeof(params)); 30c4e92af85ac2bfd90ab82c0b13bb0041595a0affBill Richardson 31f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson int c; 32f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson int errorcnt = 0; 33494646dbadedae88776d6fced396e3ee8af38e54Albert Chaulk char *e = 0; 34f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 35f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson opterr = 0; // quiet, you 368577b5360ca4c9514d9091ed9aded2bb3193f1f0Nam T. Nguyen while ((c=getopt(argc, argv, ":hzp:D:")) != -1) 37f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 38f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson switch (c) 39f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 40ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen case 'D': 41ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen params.drive_size = strtoull(optarg, &e, 0); 42ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen if (!*optarg || (e && *e)) 43ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen { 44ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen Error("invalid argument to -%c: \"%s\"\n", c, optarg); 45ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen errorcnt++; 46ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen } 47ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen break; 48f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'z': 49a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.zap = 1; 50f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 51a2d72f70c18905aba25eb0971f6f601dd1fa5a60Nam T. Nguyen case 'p': 52a2d72f70c18905aba25eb0971f6f601dd1fa5a60Nam T. Nguyen params.padding = strtoull(optarg, &e, 0); 53ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen if (!*optarg || (e && *e)) 54ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen { 55ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen Error("invalid argument to -%c: \"%s\"\n", c, optarg); 56ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen errorcnt++; 57ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen } 58a2d72f70c18905aba25eb0971f6f601dd1fa5a60Nam T. Nguyen break; 59f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'h': 60f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Usage(); 61f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_OK; 62f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case '?': 63f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("unrecognized option: -%c\n", optopt); 64f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 65f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 66f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case ':': 67f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("missing argument to -%c\n", optopt); 68f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 69f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 70f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson default: 71f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 72f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 73f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 74f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 75f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (errorcnt) 76f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 77f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Usage(); 78f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_FAILED; 79f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 80f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 81f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (optind >= argc) { 82f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Usage(); 83f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_FAILED; 84f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 85f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 86250549d3e742cddaf72b4f53d5739e54faf5db96Jay Srinivasan params.drive_name = argv[optind]; 87f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 883f806a2abf07d7b801852a4a6f3a9080a4b5c427Bill Richardson return CgptCreate(¶ms); 89f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson} 90