cmd_create.c revision 8577b5360ca4c9514d9091ed9aded2bb3193f1f0
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(&params, 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(&params);
89f1372d9109d638fbb1a177a89ebaf64e7ee0637eBill Richardson}
90