Upload Tizen:Base source
[framework/base/util-linux-ng.git] / shlibs / blkid / src / probers / ddf_raid.c
1 /*
2  * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
3  *
4  * Inspired by libvolume_id by
5  *     Kay Sievers <kay.sievers@vrfy.org>
6  *
7  * This file may be redistributed under the terms of the
8  * GNU Lesser General Public License.
9  */
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include <string.h>
14 #include <stdint.h>
15
16 #include "blkidP.h"
17
18 /* http://www.snia.org/standards/home */
19 #define DDF_GUID_LENGTH                 24
20 #define DDF_REV_LENGTH                  8
21
22 struct ddf_header {
23         uint8_t         signature[4];
24         uint32_t        crc;
25         uint8_t         guid[DDF_GUID_LENGTH];
26         uint8_t         ddf_rev[DDF_REV_LENGTH];
27 } __attribute__((packed));
28
29 static int probe_ddf(blkid_probe pr, const struct blkid_idmag *mag)
30 {
31         int hdrs[] = { 1, 257 };
32         int i;
33         struct ddf_header *ddf = NULL;
34         char version[DDF_REV_LENGTH + 1];
35
36         if (pr->size < 0x30000)
37                 return -1;
38
39         for (i = 0; i < ARRAY_SIZE(hdrs); i++) {
40                 uint64_t off = ((pr->size / 0x200) - hdrs[i]) * 0x200;
41
42                 ddf = (struct ddf_header *) blkid_probe_get_buffer(pr,
43                                         off,
44                                         sizeof(struct ddf_header));
45                 if (!ddf)
46                         return -1;
47
48                 if (memcmp(ddf->signature, "\x11\xde\x11\xde", 4) == 0 ||
49                     memcmp(ddf->signature, "\xde\x11\xde\x11", 4) == 0)
50                         break;
51                 ddf = NULL;
52         }
53
54         if (!ddf)
55                 return -1;
56
57         blkid_probe_strncpy_uuid(pr, ddf->guid, sizeof(ddf->guid));
58
59         memcpy(version, ddf->ddf_rev, sizeof(ddf->ddf_rev));
60         *(version + sizeof(ddf->ddf_rev)) = '\0';
61
62         if (blkid_probe_set_version(pr, version) != 0)
63                 return -1;
64         return 0;
65 }
66
67 const struct blkid_idinfo ddfraid_idinfo = {
68         .name           = "ddf_raid_member",
69         .usage          = BLKID_USAGE_RAID,
70         .probefunc      = probe_ddf,
71         .magics         = BLKID_NONE_MAGIC
72 };
73
74