Statistics
| Branch: | Revision:

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, &sector, &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, &sector, &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
}