cmd_add.c revision 4cb5497984642b8cbd592c14cb1912a787b2d4d7
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 add [OPTIONS] DRIVE\n\n" 16f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "Add, edit, or remove a partition entry.\n\n" 17f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "Options:\n" 18f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -i NUM Specify partition (default is next available)\n" 19f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -b NUM Beginning sector\n" 20f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -s NUM Size in sectors\n" 21f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -t GUID Partition Type GUID\n" 22f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -u GUID Partition Unique ID\n" 23f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -l LABEL Label\n" 24f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -S NUM set Successful flag (0|1)\n" 25f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -T NUM set Tries flag (0-15)\n" 26f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -P NUM set Priority flag (0-15)\n" 27f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson " -A NUM set raw 64-bit attribute value\n" 28f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "\n" 29f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "Use the -i option to modify an existing partition.\n" 30f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "The -b, -s, and -t options must be given for new partitions.\n" 31f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson "\n", progname); 32f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson PrintTypes(); 33f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson} 34f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 35f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardsonint cmd_add(int argc, char *argv[]) { 36a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan 37a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan CgptAddParams params; 38a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan memset(¶ms, 0, sizeof(params)); 39f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 40f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson int c; 41f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson int errorcnt = 0; 42f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson char *e = 0; 43f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 44f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson opterr = 0; // quiet, you 45f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson while ((c=getopt(argc, argv, ":hi:b:s:t:u:l:S:T:P:A:")) != -1) 46f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 47f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson switch (c) 48f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 49f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'i': 50a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.partition = (uint32_t)strtoul(optarg, &e, 0); 51f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 52f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 53f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 54f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 55f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 56f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 57f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'b': 58a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_begin = 1; 59a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.begin = strtoull(optarg, &e, 0); 60f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 61f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 62f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 63f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 64f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 65f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 66f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 's': 67a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_size = 1; 68a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.size = strtoull(optarg, &e, 0); 69f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 70f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 71f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 72f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 73f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 74f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 75f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 't': 76a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_type = 1; 77a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan if (CGPT_OK != SupportedType(optarg, ¶ms.type_guid) && 78a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan CGPT_OK != StrToGuid(optarg, ¶ms.type_guid)) { 79f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: %s\n", c, optarg); 80f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 81f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 82f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 83f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'u': 84a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_unique = 1; 85a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan if (CGPT_OK != StrToGuid(optarg, ¶ms.unique_guid)) { 86f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: %s\n", c, optarg); 87f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 88f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 89f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 90f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'l': 91a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.label = optarg; 92f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 93f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'S': 94a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_successful = 1; 95a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.successful = (uint32_t)strtoul(optarg, &e, 0); 96f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 97f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 98f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 99f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 100f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 101a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan if (params.successful < 0 || params.successful > 1) { 102f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("value for -%c must be between 0 and 1", c); 103f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 104f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 105f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 106f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'T': 107a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_tries = 1; 108a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.tries = (uint32_t)strtoul(optarg, &e, 0); 109f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 110f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 111f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n", 112f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson progname, c, optarg); 113f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 114f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 115a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan if (params.tries < 0 || params.tries > 15) { 116f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("value for -%c must be between 0 and 15", c); 117f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 118f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 119f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 120f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'P': 121a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_priority = 1; 122a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.priority = (uint32_t)strtoul(optarg, &e, 0); 123f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 124f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 125f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 126f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 127f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 128a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan if (params.priority < 0 || params.priority > 15) { 129f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("value for -%c must be between 0 and 15", c); 130f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 131f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 132f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 133f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'A': 134a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.set_raw = 1; 135a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan params.raw_value = strtoull(optarg, &e, 0); 136f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (!*optarg || (e && *e)) 137f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 138f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("invalid argument to -%c: \"%s\"\n", c, optarg); 139f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 140f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 141f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 142f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 143f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case 'h': 144f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Usage(); 145f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_OK; 146f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case '?': 147f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("unrecognized option: -%c\n", optopt); 148f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 149f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 150f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson case ':': 151f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("missing argument to -%c\n", optopt); 152f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 153f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 154f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson default: 155f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson errorcnt++; 156f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson break; 157f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 158f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 159f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson if (errorcnt) 160f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson { 161f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Usage(); 162f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_FAILED; 163f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 164f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 165250549d3e742cddaf72b4f53d5739e54faf5db96Jay Srinivasan if (optind >= argc) 166a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan { 167f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson Error("missing drive argument\n"); 168f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson return CGPT_FAILED; 169f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson } 170f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 171250549d3e742cddaf72b4f53d5739e54faf5db96Jay Srinivasan params.drive_name = argv[optind]; 172f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson 1733f806a2abf07d7b801852a4a6f3a9080a4b5c427Bill Richardson return CgptAdd(¶ms); 174f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson} 175