chiark / gitweb /
vol_id: clarify error message
[elogind.git] / extras / volume_id / lib / highpoint.c
1 /*
2  * volume_id - reads filesystem label and uuid
3  *
4  * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _GNU_SOURCE
21 #define _GNU_SOURCE 1
22 #endif
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <errno.h>
29 #include <ctype.h>
30
31 #include "libvolume_id.h"
32 #include "libvolume_id-private.h"
33
34 struct hpt37x_meta {
35         uint8_t         filler1[32];
36         uint32_t        magic;
37 } PACKED;
38
39 struct hpt45x_meta {
40         uint32_t        magic;
41 } PACKED;
42
43 #define HPT37X_CONFIG_OFF               0x1200
44 #define HPT37X_MAGIC_OK                 0x5a7816f0
45 #define HPT37X_MAGIC_BAD                0x5a7816fd
46
47 #define HPT45X_MAGIC_OK                 0x5a7816f3
48 #define HPT45X_MAGIC_BAD                0x5a7816fd
49
50
51 int volume_id_probe_highpoint_37x_raid(struct volume_id *id, uint64_t off, uint64_t size)
52 {
53         const uint8_t *buf;
54         struct hpt37x_meta *hpt;
55         uint32_t magic;
56
57         info("probing at offset 0x%" PRIx64 "\n", off);
58
59         buf = volume_id_get_buffer(id, off + HPT37X_CONFIG_OFF, 0x200);
60         if (buf == NULL)
61                 return -1;
62
63         hpt = (struct hpt37x_meta *) buf;
64         magic = le32_to_cpu(hpt->magic);
65         if (magic != HPT37X_MAGIC_OK && magic != HPT37X_MAGIC_BAD)
66                 return -1;
67
68         volume_id_set_usage(id, VOLUME_ID_RAID);
69         id->type = "highpoint_raid_member";
70
71         return 0;
72 }
73
74 int volume_id_probe_highpoint_45x_raid(struct volume_id *id, uint64_t off, uint64_t size)
75 {
76         const uint8_t *buf;
77         struct hpt45x_meta *hpt;
78         uint64_t meta_off;
79         uint32_t magic;
80
81         dbg("probing at offset 0x%" PRIx64 ", size 0x%" PRIx64 "\n", off, size);
82
83         if (size < 0x10000)
84                 return -1;
85
86         meta_off = ((size / 0x200)-11) * 0x200;
87         buf = volume_id_get_buffer(id, off + meta_off, 0x200);
88         if (buf == NULL)
89                 return -1;
90
91         hpt = (struct hpt45x_meta *) buf;
92         magic = le32_to_cpu(hpt->magic);
93         if (magic != HPT45X_MAGIC_OK && magic != HPT45X_MAGIC_BAD)
94                 return -1;
95
96         volume_id_set_usage(id, VOLUME_ID_RAID);
97         id->type = "highpoint_raid_member";
98
99         return 0;
100 }