root / part / part-util.c @ master
History | View | Annotate | Download (6.5 kB)
1 | abdb293f | Chrysostomos Nanakos | |
---|---|---|---|
2 | abdb293f | Chrysostomos Nanakos | #ifdef HAVE_CONFIG_H
|
3 | abdb293f | Chrysostomos Nanakos | #include "config.h" |
4 | abdb293f | Chrysostomos Nanakos | #endif
|
5 | abdb293f | Chrysostomos Nanakos | |
6 | abdb293f | Chrysostomos Nanakos | #include <time.h> |
7 | abdb293f | Chrysostomos Nanakos | #include <stdio.h> |
8 | abdb293f | Chrysostomos Nanakos | #include <fcntl.h> |
9 | abdb293f | Chrysostomos Nanakos | #include <errno.h> |
10 | abdb293f | Chrysostomos Nanakos | #include <endian.h> |
11 | abdb293f | Chrysostomos Nanakos | #include <unistd.h> |
12 | abdb293f | Chrysostomos Nanakos | #include <stdlib.h> |
13 | abdb293f | Chrysostomos Nanakos | #include <string.h> |
14 | abdb293f | Chrysostomos Nanakos | #include <byteswap.h> |
15 | abdb293f | Chrysostomos Nanakos | #include <sys/ioctl.h> |
16 | abdb293f | Chrysostomos Nanakos | #include <linux/fs.h> |
17 | abdb293f | Chrysostomos Nanakos | #include <linux/hdreg.h> |
18 | abdb293f | Chrysostomos Nanakos | |
19 | abdb293f | Chrysostomos Nanakos | #include "partition.h" |
20 | abdb293f | Chrysostomos Nanakos | |
21 | abdb293f | Chrysostomos Nanakos | #if BYTE_ORDER == LITTLE_ENDIAN
|
22 | abdb293f | Chrysostomos Nanakos | #define cpu_to_le32(x) (x)
|
23 | abdb293f | Chrysostomos Nanakos | #define cpu_to_le64(x) (x)
|
24 | abdb293f | Chrysostomos Nanakos | #else
|
25 | abdb293f | Chrysostomos Nanakos | #define cpu_to_le32(x) bswap_32(x)
|
26 | abdb293f | Chrysostomos Nanakos | #define cpu_to_le64(x) bswap_64(x)
|
27 | abdb293f | Chrysostomos Nanakos | #endif
|
28 | abdb293f | Chrysostomos Nanakos | |
29 | abdb293f | Chrysostomos Nanakos | static void |
30 | abdb293f | Chrysostomos Nanakos | usage(const char *app) |
31 | abdb293f | Chrysostomos Nanakos | { |
32 | abdb293f | Chrysostomos Nanakos | printf("usage: %s <-i image> "
|
33 | abdb293f | Chrysostomos Nanakos | "[-d dump] [-c count] [-f format] "
|
34 | abdb293f | Chrysostomos Nanakos | "[-t type] [-s sig <part>]\n", app);
|
35 | abdb293f | Chrysostomos Nanakos | } |
36 | abdb293f | Chrysostomos Nanakos | |
37 | abdb293f | Chrysostomos Nanakos | static void |
38 | abdb293f | Chrysostomos Nanakos | chs_unpack(struct partition_chs *c,
|
39 | abdb293f | Chrysostomos Nanakos | uint8_t *head, uint8_t *sector, uint16_t *cylinder) |
40 | abdb293f | Chrysostomos Nanakos | { |
41 | abdb293f | Chrysostomos Nanakos | *head = c->chs[0];
|
42 | abdb293f | Chrysostomos Nanakos | *sector = c->chs[1] & 0x3f; |
43 | abdb293f | Chrysostomos Nanakos | *cylinder = (c->chs[1] & 0xc0) * 4 + c->chs[2]; |
44 | abdb293f | Chrysostomos Nanakos | } |
45 | abdb293f | Chrysostomos Nanakos | |
46 | abdb293f | Chrysostomos Nanakos | void
|
47 | abdb293f | Chrysostomos Nanakos | partition_table_dump(struct partition_table *pt)
|
48 | abdb293f | Chrysostomos Nanakos | { |
49 | abdb293f | Chrysostomos Nanakos | int i;
|
50 | abdb293f | Chrysostomos Nanakos | |
51 | abdb293f | Chrysostomos Nanakos | printf("disk signature 0x%08x\n", pt->disk_signature);
|
52 | abdb293f | Chrysostomos Nanakos | printf("mbr signature 0x%04x\n", pt->mbr_signature);
|
53 | abdb293f | Chrysostomos Nanakos | printf("\n");
|
54 | abdb293f | Chrysostomos Nanakos | |
55 | abdb293f | Chrysostomos Nanakos | for (i = 0; i < 4; i++) { |
56 | abdb293f | Chrysostomos Nanakos | struct primary_partition *p = pt->partitions + i;
|
57 | abdb293f | Chrysostomos Nanakos | uint8_t head, sector; |
58 | abdb293f | Chrysostomos Nanakos | uint16_t cylinder; |
59 | abdb293f | Chrysostomos Nanakos | |
60 | abdb293f | Chrysostomos Nanakos | printf(" %d status 0x%02x\n", i, p->status);
|
61 | abdb293f | Chrysostomos Nanakos | |
62 | abdb293f | Chrysostomos Nanakos | chs_unpack(&p->chs_first, &head, §or, &cylinder); |
63 | abdb293f | Chrysostomos Nanakos | printf(" %d s cylinder 0x%04x\n", i, cylinder);
|
64 | abdb293f | Chrysostomos Nanakos | printf(" %d s sector 0x%01x\n", i, sector);
|
65 | abdb293f | Chrysostomos Nanakos | printf(" %d s head 0x%01x\n", i, head);
|
66 | abdb293f | Chrysostomos Nanakos | |
67 | abdb293f | Chrysostomos Nanakos | printf(" %d type 0x%01x\n", i, p->type);
|
68 | abdb293f | Chrysostomos Nanakos | |
69 | abdb293f | Chrysostomos Nanakos | chs_unpack(&p->chs_last, &head, §or, &cylinder); |
70 | abdb293f | Chrysostomos Nanakos | printf(" %d e cylinder 0x%04x\n", i, cylinder);
|
71 | abdb293f | Chrysostomos Nanakos | printf(" %d e sector 0x%01x\n", i, sector);
|
72 | abdb293f | Chrysostomos Nanakos | printf(" %d e head 0x%01x\n", i, head);
|
73 | abdb293f | Chrysostomos Nanakos | |
74 | abdb293f | Chrysostomos Nanakos | printf(" %d lba 0x%08x\n", i, p->lba);
|
75 | abdb293f | Chrysostomos Nanakos | printf(" %d blocks 0x%08x\n", i, p->blocks);
|
76 | abdb293f | Chrysostomos Nanakos | |
77 | abdb293f | Chrysostomos Nanakos | printf("\n");
|
78 | abdb293f | Chrysostomos Nanakos | } |
79 | abdb293f | Chrysostomos Nanakos | } |
80 | abdb293f | Chrysostomos Nanakos | |
81 | abdb293f | Chrysostomos Nanakos | static int |
82 | abdb293f | Chrysostomos Nanakos | dump_partitions(const char *image) |
83 | abdb293f | Chrysostomos Nanakos | { |
84 | abdb293f | Chrysostomos Nanakos | int fd, ret;
|
85 | abdb293f | Chrysostomos Nanakos | struct partition_table pt;
|
86 | abdb293f | Chrysostomos Nanakos | |
87 | abdb293f | Chrysostomos Nanakos | ret = 1;
|
88 | abdb293f | Chrysostomos Nanakos | fd = -1;
|
89 | abdb293f | Chrysostomos Nanakos | |
90 | abdb293f | Chrysostomos Nanakos | fd = open(image, O_RDONLY); |
91 | abdb293f | Chrysostomos Nanakos | if (fd == -1) |
92 | abdb293f | Chrysostomos Nanakos | goto out;
|
93 | abdb293f | Chrysostomos Nanakos | |
94 | abdb293f | Chrysostomos Nanakos | if (read(fd, &pt, sizeof(pt)) != sizeof(pt)) { |
95 | abdb293f | Chrysostomos Nanakos | errno = errno ? : EIO; |
96 | abdb293f | Chrysostomos Nanakos | goto out;
|
97 | abdb293f | Chrysostomos Nanakos | } |
98 | abdb293f | Chrysostomos Nanakos | |
99 | abdb293f | Chrysostomos Nanakos | partition_table_in(&pt); |
100 | abdb293f | Chrysostomos Nanakos | if (partition_table_validate(&pt)) {
|
101 | abdb293f | Chrysostomos Nanakos | errno = EINVAL; |
102 | abdb293f | Chrysostomos Nanakos | printf("table invalid\n");
|
103 | abdb293f | Chrysostomos Nanakos | goto out;
|
104 | abdb293f | Chrysostomos Nanakos | } |
105 | abdb293f | Chrysostomos Nanakos | |
106 | abdb293f | Chrysostomos Nanakos | partition_table_dump(&pt); |
107 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
108 | abdb293f | Chrysostomos Nanakos | |
109 | abdb293f | Chrysostomos Nanakos | out:
|
110 | abdb293f | Chrysostomos Nanakos | close(fd); |
111 | abdb293f | Chrysostomos Nanakos | return ret;
|
112 | abdb293f | Chrysostomos Nanakos | } |
113 | abdb293f | Chrysostomos Nanakos | |
114 | abdb293f | Chrysostomos Nanakos | static void |
115 | abdb293f | Chrysostomos Nanakos | __dump_signature(struct partition_table *pt, int part) |
116 | abdb293f | Chrysostomos Nanakos | { |
117 | abdb293f | Chrysostomos Nanakos | if (part < 1 || part > 4) |
118 | abdb293f | Chrysostomos Nanakos | errno = EINVAL; |
119 | abdb293f | Chrysostomos Nanakos | else {
|
120 | abdb293f | Chrysostomos Nanakos | uint8_t *p, *s; |
121 | abdb293f | Chrysostomos Nanakos | uint32_t sig = pt->disk_signature; |
122 | abdb293f | Chrysostomos Nanakos | uint64_t off = (uint64_t)pt->partitions[part - 1].lba << 9; |
123 | abdb293f | Chrysostomos Nanakos | |
124 | abdb293f | Chrysostomos Nanakos | sig = cpu_to_le32(sig); |
125 | abdb293f | Chrysostomos Nanakos | off = cpu_to_le64(off); |
126 | abdb293f | Chrysostomos Nanakos | |
127 | abdb293f | Chrysostomos Nanakos | for (p = s = (uint8_t *)&sig; p - s < sizeof(sig); p++) |
128 | abdb293f | Chrysostomos Nanakos | printf("%02x", *p);
|
129 | abdb293f | Chrysostomos Nanakos | |
130 | abdb293f | Chrysostomos Nanakos | for (p = s = (uint8_t *)&off; p - s < sizeof(off); p++) |
131 | abdb293f | Chrysostomos Nanakos | printf("%02x", *p);
|
132 | abdb293f | Chrysostomos Nanakos | |
133 | abdb293f | Chrysostomos Nanakos | printf("\n");
|
134 | abdb293f | Chrysostomos Nanakos | } |
135 | abdb293f | Chrysostomos Nanakos | } |
136 | abdb293f | Chrysostomos Nanakos | |
137 | abdb293f | Chrysostomos Nanakos | static int |
138 | abdb293f | Chrysostomos Nanakos | dump_signature(const char *image, int part) |
139 | abdb293f | Chrysostomos Nanakos | { |
140 | abdb293f | Chrysostomos Nanakos | int fd, ret;
|
141 | abdb293f | Chrysostomos Nanakos | struct partition_table pt;
|
142 | abdb293f | Chrysostomos Nanakos | |
143 | abdb293f | Chrysostomos Nanakos | ret = 1;
|
144 | abdb293f | Chrysostomos Nanakos | fd = -1;
|
145 | abdb293f | Chrysostomos Nanakos | |
146 | abdb293f | Chrysostomos Nanakos | fd = open(image, O_RDONLY); |
147 | abdb293f | Chrysostomos Nanakos | if (fd == -1) |
148 | abdb293f | Chrysostomos Nanakos | goto out;
|
149 | abdb293f | Chrysostomos Nanakos | |
150 | abdb293f | Chrysostomos Nanakos | if (read(fd, &pt, sizeof(pt)) != sizeof(pt)) { |
151 | abdb293f | Chrysostomos Nanakos | errno = errno ? : EIO; |
152 | abdb293f | Chrysostomos Nanakos | goto out;
|
153 | abdb293f | Chrysostomos Nanakos | } |
154 | abdb293f | Chrysostomos Nanakos | |
155 | abdb293f | Chrysostomos Nanakos | partition_table_in(&pt); |
156 | abdb293f | Chrysostomos Nanakos | if (partition_table_validate(&pt)) {
|
157 | abdb293f | Chrysostomos Nanakos | errno = EINVAL; |
158 | abdb293f | Chrysostomos Nanakos | printf("table invalid\n");
|
159 | abdb293f | Chrysostomos Nanakos | goto out;
|
160 | abdb293f | Chrysostomos Nanakos | } |
161 | abdb293f | Chrysostomos Nanakos | |
162 | abdb293f | Chrysostomos Nanakos | __dump_signature(&pt, part); |
163 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
164 | abdb293f | Chrysostomos Nanakos | |
165 | abdb293f | Chrysostomos Nanakos | out:
|
166 | abdb293f | Chrysostomos Nanakos | close(fd); |
167 | abdb293f | Chrysostomos Nanakos | return ret;
|
168 | abdb293f | Chrysostomos Nanakos | } |
169 | abdb293f | Chrysostomos Nanakos | |
170 | abdb293f | Chrysostomos Nanakos | static int |
171 | abdb293f | Chrysostomos Nanakos | count_partitions(const char *image, int *count) |
172 | abdb293f | Chrysostomos Nanakos | { |
173 | abdb293f | Chrysostomos Nanakos | int i, fd, ret;
|
174 | abdb293f | Chrysostomos Nanakos | struct partition_table pt;
|
175 | abdb293f | Chrysostomos Nanakos | |
176 | abdb293f | Chrysostomos Nanakos | ret = 1;
|
177 | abdb293f | Chrysostomos Nanakos | fd = -1;
|
178 | abdb293f | Chrysostomos Nanakos | |
179 | abdb293f | Chrysostomos Nanakos | fd = open(image, O_RDONLY); |
180 | abdb293f | Chrysostomos Nanakos | if (fd == -1) |
181 | abdb293f | Chrysostomos Nanakos | goto out;
|
182 | abdb293f | Chrysostomos Nanakos | |
183 | abdb293f | Chrysostomos Nanakos | if (read(fd, &pt, sizeof(pt)) != sizeof(pt)) { |
184 | abdb293f | Chrysostomos Nanakos | errno = errno ? : EIO; |
185 | abdb293f | Chrysostomos Nanakos | goto out;
|
186 | abdb293f | Chrysostomos Nanakos | } |
187 | abdb293f | Chrysostomos Nanakos | |
188 | abdb293f | Chrysostomos Nanakos | partition_table_in(&pt); |
189 | abdb293f | Chrysostomos Nanakos | if (partition_table_validate(&pt)) {
|
190 | abdb293f | Chrysostomos Nanakos | *count = 0;
|
191 | abdb293f | Chrysostomos Nanakos | goto done;
|
192 | abdb293f | Chrysostomos Nanakos | } |
193 | abdb293f | Chrysostomos Nanakos | |
194 | abdb293f | Chrysostomos Nanakos | *count = 0;
|
195 | abdb293f | Chrysostomos Nanakos | for (i = 0; i < 4; i++) |
196 | abdb293f | Chrysostomos Nanakos | if (pt.partitions[i].type)
|
197 | abdb293f | Chrysostomos Nanakos | (*count)++; |
198 | abdb293f | Chrysostomos Nanakos | |
199 | abdb293f | Chrysostomos Nanakos | done:
|
200 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
201 | abdb293f | Chrysostomos Nanakos | out:
|
202 | abdb293f | Chrysostomos Nanakos | close(fd); |
203 | abdb293f | Chrysostomos Nanakos | return ret;
|
204 | abdb293f | Chrysostomos Nanakos | } |
205 | abdb293f | Chrysostomos Nanakos | |
206 | abdb293f | Chrysostomos Nanakos | static int |
207 | abdb293f | Chrysostomos Nanakos | format_partition(const char *image, int type, struct partition_table *pt) |
208 | abdb293f | Chrysostomos Nanakos | { |
209 | abdb293f | Chrysostomos Nanakos | uint64_t lend; |
210 | abdb293f | Chrysostomos Nanakos | uint32_t start, end; |
211 | abdb293f | Chrysostomos Nanakos | int ret, sec_size, fd;
|
212 | abdb293f | Chrysostomos Nanakos | unsigned int cylinders; |
213 | abdb293f | Chrysostomos Nanakos | struct hd_geometry geo;
|
214 | abdb293f | Chrysostomos Nanakos | struct primary_partition *pp;
|
215 | abdb293f | Chrysostomos Nanakos | struct partition_geometry pgeo;
|
216 | abdb293f | Chrysostomos Nanakos | unsigned long long bytes, llcyls; |
217 | abdb293f | Chrysostomos Nanakos | |
218 | abdb293f | Chrysostomos Nanakos | ret = 1;
|
219 | abdb293f | Chrysostomos Nanakos | fd = -1;
|
220 | abdb293f | Chrysostomos Nanakos | |
221 | abdb293f | Chrysostomos Nanakos | memset(pt, 0, sizeof(*pt)); |
222 | abdb293f | Chrysostomos Nanakos | pp = pt->partitions; |
223 | abdb293f | Chrysostomos Nanakos | |
224 | abdb293f | Chrysostomos Nanakos | srandom(time(NULL));
|
225 | abdb293f | Chrysostomos Nanakos | |
226 | abdb293f | Chrysostomos Nanakos | fd = open(image, O_RDWR); |
227 | abdb293f | Chrysostomos Nanakos | if (fd == -1) |
228 | abdb293f | Chrysostomos Nanakos | goto out;
|
229 | abdb293f | Chrysostomos Nanakos | |
230 | abdb293f | Chrysostomos Nanakos | if (ioctl(fd, HDIO_GETGEO, &geo))
|
231 | abdb293f | Chrysostomos Nanakos | goto out;
|
232 | abdb293f | Chrysostomos Nanakos | |
233 | abdb293f | Chrysostomos Nanakos | if (ioctl(fd, BLKGETSIZE64, &bytes))
|
234 | abdb293f | Chrysostomos Nanakos | goto out;
|
235 | abdb293f | Chrysostomos Nanakos | |
236 | abdb293f | Chrysostomos Nanakos | if (ioctl(fd, BLKSSZGET, &sec_size))
|
237 | abdb293f | Chrysostomos Nanakos | goto out;
|
238 | abdb293f | Chrysostomos Nanakos | |
239 | abdb293f | Chrysostomos Nanakos | llcyls = (bytes >> 9) / ((sec_size >> 9) * geo.heads * geo.sectors); |
240 | abdb293f | Chrysostomos Nanakos | cylinders = llcyls; |
241 | abdb293f | Chrysostomos Nanakos | if (cylinders != llcyls)
|
242 | abdb293f | Chrysostomos Nanakos | cylinders = ~0;
|
243 | abdb293f | Chrysostomos Nanakos | |
244 | abdb293f | Chrysostomos Nanakos | pgeo.heads = geo.heads; |
245 | abdb293f | Chrysostomos Nanakos | pgeo.sectors = geo.sectors; |
246 | abdb293f | Chrysostomos Nanakos | pgeo.cylinders = cylinders; |
247 | abdb293f | Chrysostomos Nanakos | |
248 | abdb293f | Chrysostomos Nanakos | start = pgeo.sectors; |
249 | abdb293f | Chrysostomos Nanakos | lend = geo.heads * geo.sectors * llcyls - 1;
|
250 | abdb293f | Chrysostomos Nanakos | |
251 | abdb293f | Chrysostomos Nanakos | end = lend; |
252 | abdb293f | Chrysostomos Nanakos | if (end != lend)
|
253 | abdb293f | Chrysostomos Nanakos | end = ~0;
|
254 | abdb293f | Chrysostomos Nanakos | |
255 | abdb293f | Chrysostomos Nanakos | pp->status = PARTITION_BOOTABLE; |
256 | abdb293f | Chrysostomos Nanakos | pp->type = type; |
257 | abdb293f | Chrysostomos Nanakos | pp->lba = start; |
258 | abdb293f | Chrysostomos Nanakos | pp->blocks = end - start + 1;
|
259 | abdb293f | Chrysostomos Nanakos | pp->chs_first = lba_to_chs(&pgeo, start); |
260 | abdb293f | Chrysostomos Nanakos | pp->chs_last = lba_to_chs(&pgeo, lend); |
261 | abdb293f | Chrysostomos Nanakos | |
262 | abdb293f | Chrysostomos Nanakos | pt->mbr_signature = MBR_SIGNATURE; |
263 | abdb293f | Chrysostomos Nanakos | pt->disk_signature = random(); |
264 | abdb293f | Chrysostomos Nanakos | |
265 | abdb293f | Chrysostomos Nanakos | partition_table_out(pt); |
266 | abdb293f | Chrysostomos Nanakos | if (write(fd, pt, sizeof(*pt)) != sizeof(*pt)) { |
267 | abdb293f | Chrysostomos Nanakos | errno = errno ? : EIO; |
268 | abdb293f | Chrysostomos Nanakos | goto out;
|
269 | abdb293f | Chrysostomos Nanakos | } |
270 | abdb293f | Chrysostomos Nanakos | |
271 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
272 | abdb293f | Chrysostomos Nanakos | |
273 | abdb293f | Chrysostomos Nanakos | out:
|
274 | abdb293f | Chrysostomos Nanakos | close(fd); |
275 | abdb293f | Chrysostomos Nanakos | return ret;
|
276 | abdb293f | Chrysostomos Nanakos | } |
277 | abdb293f | Chrysostomos Nanakos | |
278 | abdb293f | Chrysostomos Nanakos | int
|
279 | abdb293f | Chrysostomos Nanakos | main(int argc, char *argv[]) |
280 | abdb293f | Chrysostomos Nanakos | { |
281 | abdb293f | Chrysostomos Nanakos | char *image;
|
282 | abdb293f | Chrysostomos Nanakos | struct partition_table pt;
|
283 | abdb293f | Chrysostomos Nanakos | int ret, c, type, count, dump, format, signature;
|
284 | abdb293f | Chrysostomos Nanakos | |
285 | abdb293f | Chrysostomos Nanakos | ret = 1;
|
286 | abdb293f | Chrysostomos Nanakos | format = 0;
|
287 | abdb293f | Chrysostomos Nanakos | count = 0;
|
288 | abdb293f | Chrysostomos Nanakos | dump = 0;
|
289 | abdb293f | Chrysostomos Nanakos | type = 0;
|
290 | abdb293f | Chrysostomos Nanakos | signature = -1;
|
291 | abdb293f | Chrysostomos Nanakos | image = NULL;
|
292 | abdb293f | Chrysostomos Nanakos | |
293 | abdb293f | Chrysostomos Nanakos | while ((c = getopt(argc, argv, "i:fdt:cs:h")) != -1) { |
294 | abdb293f | Chrysostomos Nanakos | switch (c) {
|
295 | abdb293f | Chrysostomos Nanakos | case 'i': |
296 | abdb293f | Chrysostomos Nanakos | image = optarg; |
297 | abdb293f | Chrysostomos Nanakos | break;
|
298 | abdb293f | Chrysostomos Nanakos | case 'c': |
299 | abdb293f | Chrysostomos Nanakos | count = 1;
|
300 | abdb293f | Chrysostomos Nanakos | break;
|
301 | abdb293f | Chrysostomos Nanakos | case 's': |
302 | abdb293f | Chrysostomos Nanakos | signature = atoi(optarg); |
303 | abdb293f | Chrysostomos Nanakos | break;
|
304 | abdb293f | Chrysostomos Nanakos | case 'f': |
305 | abdb293f | Chrysostomos Nanakos | format = 1;
|
306 | abdb293f | Chrysostomos Nanakos | break;
|
307 | abdb293f | Chrysostomos Nanakos | case 't': { |
308 | abdb293f | Chrysostomos Nanakos | int base = (!strncasecmp(optarg, "0x", 2) ? 16 : 10); |
309 | abdb293f | Chrysostomos Nanakos | type = strtol(optarg, NULL, base);
|
310 | abdb293f | Chrysostomos Nanakos | break;
|
311 | abdb293f | Chrysostomos Nanakos | } |
312 | abdb293f | Chrysostomos Nanakos | case 'd': |
313 | abdb293f | Chrysostomos Nanakos | dump = 1;
|
314 | abdb293f | Chrysostomos Nanakos | break;
|
315 | abdb293f | Chrysostomos Nanakos | case 'h': |
316 | abdb293f | Chrysostomos Nanakos | usage(argv[0]);
|
317 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
318 | abdb293f | Chrysostomos Nanakos | goto out;
|
319 | abdb293f | Chrysostomos Nanakos | } |
320 | abdb293f | Chrysostomos Nanakos | } |
321 | abdb293f | Chrysostomos Nanakos | |
322 | abdb293f | Chrysostomos Nanakos | if (!image || (!format && !count && !signature && !dump)) {
|
323 | abdb293f | Chrysostomos Nanakos | errno = EINVAL; |
324 | abdb293f | Chrysostomos Nanakos | usage(argv[0]);
|
325 | abdb293f | Chrysostomos Nanakos | goto out;
|
326 | abdb293f | Chrysostomos Nanakos | } |
327 | abdb293f | Chrysostomos Nanakos | |
328 | abdb293f | Chrysostomos Nanakos | if (format) {
|
329 | abdb293f | Chrysostomos Nanakos | if (!type) {
|
330 | abdb293f | Chrysostomos Nanakos | errno = EINVAL; |
331 | abdb293f | Chrysostomos Nanakos | perror("type required");
|
332 | abdb293f | Chrysostomos Nanakos | goto out;
|
333 | abdb293f | Chrysostomos Nanakos | } |
334 | abdb293f | Chrysostomos Nanakos | |
335 | abdb293f | Chrysostomos Nanakos | if (format_partition(image, type, &pt)) {
|
336 | abdb293f | Chrysostomos Nanakos | perror("formatting partition");
|
337 | abdb293f | Chrysostomos Nanakos | goto out;
|
338 | abdb293f | Chrysostomos Nanakos | } |
339 | abdb293f | Chrysostomos Nanakos | |
340 | abdb293f | Chrysostomos Nanakos | __dump_signature(&pt, 1);
|
341 | abdb293f | Chrysostomos Nanakos | } |
342 | abdb293f | Chrysostomos Nanakos | |
343 | abdb293f | Chrysostomos Nanakos | if (count) {
|
344 | abdb293f | Chrysostomos Nanakos | if (count_partitions(image, &count)) {
|
345 | abdb293f | Chrysostomos Nanakos | perror("counting partitions");
|
346 | abdb293f | Chrysostomos Nanakos | goto out;
|
347 | abdb293f | Chrysostomos Nanakos | } |
348 | abdb293f | Chrysostomos Nanakos | printf("%d\n", count);
|
349 | abdb293f | Chrysostomos Nanakos | } |
350 | abdb293f | Chrysostomos Nanakos | |
351 | abdb293f | Chrysostomos Nanakos | if (signature != -1) { |
352 | abdb293f | Chrysostomos Nanakos | if (dump_signature(image, signature)) {
|
353 | abdb293f | Chrysostomos Nanakos | perror("dumping signature");
|
354 | abdb293f | Chrysostomos Nanakos | goto out;
|
355 | abdb293f | Chrysostomos Nanakos | } |
356 | abdb293f | Chrysostomos Nanakos | } |
357 | abdb293f | Chrysostomos Nanakos | |
358 | abdb293f | Chrysostomos Nanakos | if (dump) {
|
359 | abdb293f | Chrysostomos Nanakos | if (dump_partitions(image)) {
|
360 | abdb293f | Chrysostomos Nanakos | perror("dumping partitions");
|
361 | abdb293f | Chrysostomos Nanakos | goto out;
|
362 | abdb293f | Chrysostomos Nanakos | } |
363 | abdb293f | Chrysostomos Nanakos | } |
364 | abdb293f | Chrysostomos Nanakos | |
365 | abdb293f | Chrysostomos Nanakos | ret = 0;
|
366 | abdb293f | Chrysostomos Nanakos | |
367 | abdb293f | Chrysostomos Nanakos | out:
|
368 | abdb293f | Chrysostomos Nanakos | return ret;
|
369 | abdb293f | Chrysostomos Nanakos | } |