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
11extern const char* progname;
12
13static void Usage(void)
14{
15  printf("\nUsage: %s legacy [OPTIONS] DRIVE\n\n"
16         "Switch GPT header signature to \"CHROMEOS\".\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         "  -e           Switch GPT header signature back to \"EFI PART\"\n"
22         "\n", progname);
23}
24
25int cmd_legacy(int argc, char *argv[]) {
26  CgptLegacyParams params;
27  memset(&params, 0, sizeof(params));
28
29  int c;
30  char* e = 0;
31  int errorcnt = 0;
32
33  opterr = 0;                     // quiet, you
34  while ((c=getopt(argc, argv, ":heD:")) != -1)
35  {
36    switch (c)
37    {
38    case 'D':
39      params.drive_size = strtoull(optarg, &e, 0);
40      if (!*optarg || (e && *e))
41      {
42        Error("invalid argument to -%c: \"%s\"\n", c, optarg);
43        errorcnt++;
44      }
45      break;
46    case 'e':
47      params.efipart = 1;
48      break;
49
50    case 'h':
51      Usage();
52      return CGPT_OK;
53    case '?':
54      Error("unrecognized option: -%c\n", optopt);
55      errorcnt++;
56      break;
57    case ':':
58      Error("missing argument to -%c\n", optopt);
59      errorcnt++;
60      break;
61    default:
62      errorcnt++;
63      break;
64    }
65  }
66  if (errorcnt)
67  {
68    Usage();
69    return CGPT_FAILED;
70  }
71
72  if (optind >= argc) {
73    Usage();
74    return CGPT_FAILED;
75  }
76
77  params.drive_name = argv[optind];
78
79  return CgptLegacy(&params);
80}
81