2fe868deab7f59530d144a46dafd3269d0bf0fe8
[multipath-tools/.git] / kpartx / ps3.c
1 #include "kpartx.h"
2 #include "byteorder.h"
3 #include <sys/types.h>
4 #include <string.h>
5
6 #define SECTOR_SIZE             512
7 #define MAX_ACL_ENTRIES         8
8 #define MAX_PARTITIONS          8
9
10 #define MAGIC1                  0x0FACE0FFULL
11 #define MAGIC2                  0xDEADFACEULL
12
13 struct p_acl_entry {
14         u_int64_t laid;
15         u_int64_t rights;
16 };
17
18 struct d_partition {
19         u_int64_t p_start;
20         u_int64_t p_size;
21         struct p_acl_entry p_acl[MAX_ACL_ENTRIES];
22 };
23
24 struct disklabel {
25         u_int8_t d_res1[16];
26         u_int64_t d_magic1;
27         u_int64_t d_magic2;
28         u_int64_t d_res2;
29         u_int64_t d_res3;
30         struct d_partition d_partitions[MAX_PARTITIONS];
31         u_int8_t d_pad[0x600 - MAX_PARTITIONS * sizeof(struct d_partition)- 0x30];
32 };
33
34 static int
35 read_disklabel(int fd, struct disklabel *label) {
36         unsigned char *data;
37         int i;
38
39         for (i = 0; i < sizeof(struct disklabel) / SECTOR_SIZE; i++) {
40                 data = (unsigned char *) getblock(fd, i);
41                 if (!data)
42                         return 0;
43
44                 memcpy((unsigned char *) label + i * SECTOR_SIZE, data, SECTOR_SIZE);
45         }
46
47         return 1;
48 }
49
50 int
51 read_ps3_pt(int fd, struct slice all, struct slice *sp, int ns) {
52         struct disklabel label;
53         int n = 0;
54         int i;
55
56         if (!read_disklabel(fd, &label))
57                 return -1;
58
59         if ((be64_to_cpu(label.d_magic1) != MAGIC1) ||
60             (be64_to_cpu(label.d_magic2) != MAGIC2))
61                 return -1;
62
63         for (i = 0; i < MAX_PARTITIONS; i++) {
64                 if (label.d_partitions[i].p_start && label.d_partitions[i].p_size) {
65                         sp[n].start =  be64_to_cpu(label.d_partitions[i].p_start);
66                         sp[n].size =  be64_to_cpu(label.d_partitions[i].p_size);
67                         n++;
68                 }
69         }
70
71         return n;
72 }