1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include "volume_id_internal.h"
24
25
26
27
28
29
30#define ENABLE_FEATURE_VOLUMEID_MAC 0
31
32
33
34
35#define ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID 0
36#define ENABLE_FEATURE_VOLUMEID_ISWRAID 0
37#define ENABLE_FEATURE_VOLUMEID_LSIRAID 0
38#define ENABLE_FEATURE_VOLUMEID_LVM 0
39#define ENABLE_FEATURE_VOLUMEID_NVIDIARAID 0
40#define ENABLE_FEATURE_VOLUMEID_PROMISERAID 0
41#define ENABLE_FEATURE_VOLUMEID_SILICONRAID 0
42#define ENABLE_FEATURE_VOLUMEID_VIARAID 0
43
44
45#define ENABLE_FEATURE_VOLUMEID_HPFS 0
46#define ENABLE_FEATURE_VOLUMEID_UFS 0
47
48
49typedef int FAST_FUNC (*raid_probe_fptr)(struct volume_id *id, uint64_t size);
50typedef int FAST_FUNC (*probe_fptr)(struct volume_id *id );
51
52static const raid_probe_fptr raid1[] = {
53#if ENABLE_FEATURE_VOLUMEID_LINUXRAID
54 volume_id_probe_linux_raid,
55#endif
56#if ENABLE_FEATURE_VOLUMEID_ISWRAID
57 volume_id_probe_intel_software_raid,
58#endif
59#if ENABLE_FEATURE_VOLUMEID_LSIRAID
60 volume_id_probe_lsi_mega_raid,
61#endif
62#if ENABLE_FEATURE_VOLUMEID_VIARAID
63 volume_id_probe_via_raid,
64#endif
65#if ENABLE_FEATURE_VOLUMEID_SILICONRAID
66 volume_id_probe_silicon_medley_raid,
67#endif
68#if ENABLE_FEATURE_VOLUMEID_NVIDIARAID
69 volume_id_probe_nvidia_raid,
70#endif
71#if ENABLE_FEATURE_VOLUMEID_PROMISERAID
72 volume_id_probe_promise_fasttrack_raid,
73#endif
74#if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
75 volume_id_probe_highpoint_45x_raid,
76#endif
77};
78
79static const probe_fptr raid2[] = {
80#if ENABLE_FEATURE_VOLUMEID_LVM
81 volume_id_probe_lvm1,
82 volume_id_probe_lvm2,
83#endif
84#if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
85 volume_id_probe_highpoint_37x_raid,
86#endif
87#if ENABLE_FEATURE_VOLUMEID_LUKS
88 volume_id_probe_luks,
89#endif
90};
91
92
93static const probe_fptr fs1[] = {
94#if ENABLE_FEATURE_VOLUMEID_FAT
95 volume_id_probe_vfat,
96#endif
97#if ENABLE_FEATURE_VOLUMEID_EXFAT
98 volume_id_probe_exfat,
99#endif
100#if ENABLE_FEATURE_VOLUMEID_LFS
101 volume_id_probe_lfs,
102#endif
103#if ENABLE_FEATURE_VOLUMEID_MAC
104 volume_id_probe_mac_partition_map,
105#endif
106#if ENABLE_FEATURE_VOLUMEID_SQUASHFS
107 volume_id_probe_squashfs,
108#endif
109#if ENABLE_FEATURE_VOLUMEID_XFS
110 volume_id_probe_xfs,
111#endif
112#if ENABLE_FEATURE_VOLUMEID_BCACHE
113 volume_id_probe_bcache,
114#endif
115};
116
117
118static const probe_fptr fs2[] = {
119#if ENABLE_FEATURE_VOLUMEID_LINUXSWAP
120 volume_id_probe_linux_swap,
121#endif
122#if ENABLE_FEATURE_VOLUMEID_EXT
123 volume_id_probe_ext,
124#endif
125#if ENABLE_FEATURE_VOLUMEID_BTRFS
126 volume_id_probe_btrfs,
127#endif
128#if ENABLE_FEATURE_VOLUMEID_REISERFS
129 volume_id_probe_reiserfs,
130#endif
131#if ENABLE_FEATURE_VOLUMEID_JFS
132 volume_id_probe_jfs,
133#endif
134#if ENABLE_FEATURE_VOLUMEID_UDF
135 volume_id_probe_udf,
136#endif
137#if ENABLE_FEATURE_VOLUMEID_ISO9660
138 volume_id_probe_iso9660,
139#endif
140#if ENABLE_FEATURE_VOLUMEID_HFS
141 volume_id_probe_hfs_hfsplus,
142#endif
143#if ENABLE_FEATURE_VOLUMEID_UFS
144 volume_id_probe_ufs,
145#endif
146#if ENABLE_FEATURE_VOLUMEID_F2FS
147 volume_id_probe_f2fs,
148#endif
149#if ENABLE_FEATURE_VOLUMEID_NILFS
150 volume_id_probe_nilfs,
151#endif
152#if ENABLE_FEATURE_VOLUMEID_NTFS
153 volume_id_probe_ntfs,
154#endif
155#if ENABLE_FEATURE_VOLUMEID_CRAMFS
156 volume_id_probe_cramfs,
157#endif
158#if ENABLE_FEATURE_VOLUMEID_ROMFS
159 volume_id_probe_romfs,
160#endif
161#if ENABLE_FEATURE_VOLUMEID_HPFS
162 volume_id_probe_hpfs,
163#endif
164#if ENABLE_FEATURE_VOLUMEID_SYSV
165 volume_id_probe_sysv,
166#endif
167#if ENABLE_FEATURE_VOLUMEID_MINIX
168 volume_id_probe_minix,
169#endif
170#if ENABLE_FEATURE_VOLUMEID_OCFS2
171 volume_id_probe_ocfs2,
172#endif
173#if ENABLE_FEATURE_VOLUMEID_UBIFS
174 volume_id_probe_ubifs,
175#endif
176};
177
178int FAST_FUNC volume_id_probe_all(struct volume_id *id, uint64_t size)
179{
180 unsigned i;
181
182
183 if (size) {
184 for (i = 0; i < ARRAY_SIZE(raid1); i++) {
185 if (raid1[i](id, size) == 0)
186 goto ret;
187 if (id->error)
188 goto ret;
189 }
190 }
191
192 for (i = 0; i < ARRAY_SIZE(raid2); i++) {
193 if (raid2[i](id ) == 0)
194 goto ret;
195 if (id->error)
196 goto ret;
197 }
198
199
200 for (i = 0; i < ARRAY_SIZE(fs1); i++) {
201 if (fs1[i](id ) == 0)
202 goto ret;
203 if (id->error)
204 goto ret;
205 }
206
207
208 volume_id_get_buffer(id, 0, SB_BUFFER_SIZE);
209
210 for (i = 0; i < ARRAY_SIZE(fs2); i++) {
211 if (fs2[i](id ) == 0)
212 goto ret;
213 if (id->error)
214 goto ret;
215 }
216
217 ret:
218 volume_id_free_buffer(id);
219 return (- id->error);
220}
221
222
223struct volume_id* FAST_FUNC volume_id_open_node(int fd)
224{
225 struct volume_id *id;
226
227 id = xzalloc(sizeof(struct volume_id));
228 id->fd = fd;
229
230
231 return id;
232}
233
234#ifdef UNUSED
235
236struct volume_id* FAST_FUNC volume_id_open_dev_t(dev_t devt)
237{
238 struct volume_id *id;
239 char *tmp_node[VOLUME_ID_PATH_MAX];
240
241 tmp_node = xasprintf("/dev/.volume_id-%u-%u-%u",
242 (unsigned)getpid(), (unsigned)major(devt), (unsigned)minor(devt));
243
244
245 unlink(tmp_node);
246 if (mknod(tmp_node, (S_IFBLK | 0600), devt) != 0)
247 bb_perror_msg_and_die("can't mknod(%s)", tmp_node);
248
249 id = volume_id_open_node(tmp_node);
250 unlink(tmp_node);
251 free(tmp_node);
252 return id;
253}
254#endif
255
256void FAST_FUNC free_volume_id(struct volume_id *id)
257{
258 if (id == NULL)
259 return;
260
261
262 close(id->fd);
263 volume_id_free_buffer(id);
264#ifdef UNUSED_PARTITION_CODE
265 free(id->partitions);
266#endif
267 free(id);
268}
269