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 #define __STDC_FORMAT_MACROS
6 #include <getopt.h>
7 #include <inttypes.h>
8 #include <string.h>
9
10 #include "cgpt.h"
11 #include "vboot_host.h"
12
13 extern const char* progname;
14
Usage(void)15 static void Usage(void)
16 {
17 printf("\nUsage: %s show [OPTIONS] DRIVE\n\n"
18 "Display the GPT table\n\n"
19 "Options:\n"
20 " -D NUM Size (in bytes) of the disk where partitions reside\n"
21 " default 0, meaning partitions and GPT structs are\n"
22 " both on DRIVE\n"
23 " -n Numeric output only\n"
24 " -v Verbose output\n"
25 " -q Quick output\n"
26 " -i NUM Show specified partition only - pick one of:\n"
27 " -b beginning sector\n"
28 " -s partition size\n"
29 " -t type guid\n"
30 " -u unique guid\n"
31 " -l label\n"
32 " -S Successful flag\n"
33 " -T Tries flag\n"
34 " -P Priority flag\n"
35 " -A raw 64-bit attribute value\n"
36 " -d Debug output (including invalid headers)\n"
37 "\n", progname);
38 }
39
cmd_show(int argc,char * argv[])40 int cmd_show(int argc, char *argv[]) {
41 CgptShowParams params;
42 memset(¶ms, 0, sizeof(params));
43
44 int c;
45 int errorcnt = 0;
46 char *e = 0;
47
48 opterr = 0; // quiet, you
49 while ((c=getopt(argc, argv, ":hnvqi:bstulSTPAdD:")) != -1)
50 {
51 switch (c)
52 {
53 case 'D':
54 params.drive_size = strtoull(optarg, &e, 0);
55 if (!*optarg || (e && *e))
56 {
57 Error("invalid argument to -%c: \"%s\"\n", c, optarg);
58 errorcnt++;
59 }
60 break;
61 case 'n':
62 params.numeric = 1;
63 break;
64 case 'v':
65 params.verbose = 1;
66 break;
67 case 'q':
68 params.quick = 1;
69 break;
70 case 'i':
71 params.partition = (uint32_t)strtoul(optarg, &e, 0);
72 if (!*optarg || (e && *e))
73 {
74 Error("invalid argument to -%c: \"%s\"\n", c, optarg);
75 errorcnt++;
76 }
77 break;
78 case 'b':
79 case 's':
80 case 't':
81 case 'u':
82 case 'l':
83 case 'S':
84 case 'T':
85 case 'P':
86 case 'A':
87 params.single_item = c;
88 break;
89
90 case 'd':
91 params.debug = 1;
92 break;
93
94 case 'h':
95 Usage();
96 return CGPT_OK;
97 case '?':
98 Error("unrecognized option: -%c\n", optopt);
99 errorcnt++;
100 break;
101 case ':':
102 Error("missing argument to -%c\n", optopt);
103 errorcnt++;
104 break;
105 default:
106 errorcnt++;
107 break;
108 }
109 }
110 if (errorcnt)
111 {
112 Usage();
113 return CGPT_FAILED;
114 }
115
116 if (optind >= argc) {
117 Error("missing drive argument\n");
118 Usage();
119 return CGPT_FAILED;
120 }
121
122 params.drive_name = argv[optind];
123
124 return CgptShow(¶ms);
125 }
126