[kpartx] Add support for mac partition table
[multipath-tools/.git] / kpartx / mac.c
1 #include "kpartx.h"
2 #include "byteorder.h"
3 #include <stdio.h>
4 #include <string.h>
5 #include "mac.h"
6
7 int
8 read_mac_pt(int fd, struct slice all, struct slice *sp, int ns) {
9         struct mac_driver_desc *md;
10         struct mac_partition *part;
11         unsigned secsize;
12         char *data;
13         int blk, blocks_in_map;
14         int n = 0;
15
16         md = (struct mac_driver_desc *) getblock(fd, 0);
17         if (md == NULL)
18                 return -1;
19
20         if (be16_to_cpu(md->signature) != MAC_DRIVER_MAGIC)
21                 return -1;
22
23         secsize = be16_to_cpu(md->block_size);
24         data = getblock(fd, secsize/512);
25         if (!data)
26                 return -1;
27         part = (struct mac_partition *) (data + secsize%512);
28
29         if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC)
30                 return -1;
31
32         blocks_in_map = be32_to_cpu(part->map_count);
33         for (blk = 1; blk <= blocks_in_map && blk <= ns; ++blk, ++n) {
34                 int pos = blk * secsize;
35                 data = getblock(fd, pos/512);
36                 if (!data)
37                         return -1;
38
39                 part = (struct mac_partition *) (data + pos%512);
40                 if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC)
41                         break;
42
43                 sp[n].start = be32_to_cpu(part->start_block) * (secsize/512);
44                 sp[n].size = be32_to_cpu(part->block_count) * (secsize/512);
45         }
46         return n;
47 }