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(&params, 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, &params.type_guid) &&
78a05814398202c4147a5e3f28474830ec0a9a0a90Jay Srinivasan          CGPT_OK != StrToGuid(optarg, &params.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, &params.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(&params);
174f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson}
175