source: MondoRescue/branches/3.3/mindi-busybox/util-linux/volume_id/volume_id.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1/*
2 * volume_id - reads filesystem label and uuid
3 *
4 * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library 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 GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21//kbuild:lib-$(CONFIG_VOLUMEID) += volume_id.o util.o
22
23#include "volume_id_internal.h"
24
25
26/* Some detection routines do not set label or uuid anyway,
27 * so they are disabled. */
28
29/* Looks for partitions, we don't use it: */
30#define ENABLE_FEATURE_VOLUMEID_MAC 0
31/* #define ENABLE_FEATURE_VOLUMEID_MSDOS 0 - NB: this one
32 * was not properly added to probe table anyway - ??! */
33
34/* None of RAIDs have label or uuid, except LinuxRAID: */
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/* These filesystems also have no label or uuid: */
45#define ENABLE_FEATURE_VOLUMEID_MINIX 0
46#define ENABLE_FEATURE_VOLUMEID_HPFS 0
47#define ENABLE_FEATURE_VOLUMEID_UFS 0
48
49
50typedef int FAST_FUNC (*raid_probe_fptr)(struct volume_id *id, /*uint64_t off,*/ uint64_t size);
51typedef int FAST_FUNC (*probe_fptr)(struct volume_id *id /*, uint64_t off*/);
52
53static const raid_probe_fptr raid1[] = {
54#if ENABLE_FEATURE_VOLUMEID_LINUXRAID
55 volume_id_probe_linux_raid,
56#endif
57#if ENABLE_FEATURE_VOLUMEID_ISWRAID
58 volume_id_probe_intel_software_raid,
59#endif
60#if ENABLE_FEATURE_VOLUMEID_LSIRAID
61 volume_id_probe_lsi_mega_raid,
62#endif
63#if ENABLE_FEATURE_VOLUMEID_VIARAID
64 volume_id_probe_via_raid,
65#endif
66#if ENABLE_FEATURE_VOLUMEID_SILICONRAID
67 volume_id_probe_silicon_medley_raid,
68#endif
69#if ENABLE_FEATURE_VOLUMEID_NVIDIARAID
70 volume_id_probe_nvidia_raid,
71#endif
72#if ENABLE_FEATURE_VOLUMEID_PROMISERAID
73 volume_id_probe_promise_fasttrack_raid,
74#endif
75#if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
76 volume_id_probe_highpoint_45x_raid,
77#endif
78};
79
80static const probe_fptr raid2[] = {
81#if ENABLE_FEATURE_VOLUMEID_LVM
82 volume_id_probe_lvm1,
83 volume_id_probe_lvm2,
84#endif
85#if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
86 volume_id_probe_highpoint_37x_raid,
87#endif
88#if ENABLE_FEATURE_VOLUMEID_LUKS
89 volume_id_probe_luks,
90#endif
91};
92
93/* signature in the first block, only small buffer needed */
94static const probe_fptr fs1[] = {
95#if ENABLE_FEATURE_VOLUMEID_FAT
96 volume_id_probe_vfat,
97#endif
98#if ENABLE_FEATURE_VOLUMEID_EXFAT
99 volume_id_probe_exfat,
100#endif
101#if ENABLE_FEATURE_VOLUMEID_MAC
102 volume_id_probe_mac_partition_map,
103#endif
104#if ENABLE_FEATURE_VOLUMEID_SQUASHFS
105 volume_id_probe_squashfs,
106#endif
107#if ENABLE_FEATURE_VOLUMEID_XFS
108 volume_id_probe_xfs,
109#endif
110#if ENABLE_FEATURE_VOLUMEID_BCACHE
111 volume_id_probe_bcache,
112#endif
113};
114
115/* fill buffer with maximum */
116static const probe_fptr fs2[] = {
117#if ENABLE_FEATURE_VOLUMEID_LINUXSWAP
118 volume_id_probe_linux_swap,
119#endif
120#if ENABLE_FEATURE_VOLUMEID_EXT
121 volume_id_probe_ext,
122#endif
123#if ENABLE_FEATURE_VOLUMEID_BTRFS
124 volume_id_probe_btrfs,
125#endif
126#if ENABLE_FEATURE_VOLUMEID_REISERFS
127 volume_id_probe_reiserfs,
128#endif
129#if ENABLE_FEATURE_VOLUMEID_JFS
130 volume_id_probe_jfs,
131#endif
132#if ENABLE_FEATURE_VOLUMEID_UDF
133 volume_id_probe_udf,
134#endif
135#if ENABLE_FEATURE_VOLUMEID_ISO9660
136 volume_id_probe_iso9660,
137#endif
138#if ENABLE_FEATURE_VOLUMEID_HFS
139 volume_id_probe_hfs_hfsplus,
140#endif
141#if ENABLE_FEATURE_VOLUMEID_UFS
142 volume_id_probe_ufs,
143#endif
144#if ENABLE_FEATURE_VOLUMEID_F2FS
145 volume_id_probe_f2fs,
146#endif
147#if ENABLE_FEATURE_VOLUMEID_NILFS
148 volume_id_probe_nilfs,
149#endif
150#if ENABLE_FEATURE_VOLUMEID_NTFS
151 volume_id_probe_ntfs,
152#endif
153#if ENABLE_FEATURE_VOLUMEID_CRAMFS
154 volume_id_probe_cramfs,
155#endif
156#if ENABLE_FEATURE_VOLUMEID_ROMFS
157 volume_id_probe_romfs,
158#endif
159#if ENABLE_FEATURE_VOLUMEID_HPFS
160 volume_id_probe_hpfs,
161#endif
162#if ENABLE_FEATURE_VOLUMEID_SYSV
163 volume_id_probe_sysv,
164#endif
165#if ENABLE_FEATURE_VOLUMEID_MINIX
166 volume_id_probe_minix,
167#endif
168#if ENABLE_FEATURE_VOLUMEID_OCFS2
169 volume_id_probe_ocfs2,
170#endif
171};
172
173int FAST_FUNC volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size)
174{
175 unsigned i;
176
177 /* probe for raid first, cause fs probes may be successful on raid members */
178 if (size) {
179 for (i = 0; i < ARRAY_SIZE(raid1); i++) {
180 if (raid1[i](id, /*off,*/ size) == 0)
181 goto ret;
182 if (id->error)
183 goto ret;
184 }
185 }
186
187 for (i = 0; i < ARRAY_SIZE(raid2); i++) {
188 if (raid2[i](id /*,off*/) == 0)
189 goto ret;
190 if (id->error)
191 goto ret;
192 }
193
194 /* signature in the first block, only small buffer needed */
195 for (i = 0; i < ARRAY_SIZE(fs1); i++) {
196 if (fs1[i](id /*,off*/) == 0)
197 goto ret;
198 if (id->error)
199 goto ret;
200 }
201
202 /* fill buffer with maximum */
203 volume_id_get_buffer(id, 0, SB_BUFFER_SIZE);
204
205 for (i = 0; i < ARRAY_SIZE(fs2); i++) {
206 if (fs2[i](id /*,off*/) == 0)
207 goto ret;
208 if (id->error)
209 goto ret;
210 }
211
212 ret:
213 volume_id_free_buffer(id);
214 return (- id->error); /* 0 or -1 */
215}
216
217/* open volume by device node */
218struct volume_id* FAST_FUNC volume_id_open_node(int fd)
219{
220 struct volume_id *id;
221
222 id = xzalloc(sizeof(struct volume_id));
223 id->fd = fd;
224 ///* close fd on device close */
225 //id->fd_close = 1;
226 return id;
227}
228
229#ifdef UNUSED
230/* open volume by major/minor */
231struct volume_id* FAST_FUNC volume_id_open_dev_t(dev_t devt)
232{
233 struct volume_id *id;
234 char *tmp_node[VOLUME_ID_PATH_MAX];
235
236 tmp_node = xasprintf("/dev/.volume_id-%u-%u-%u",
237 (unsigned)getpid(), (unsigned)major(devt), (unsigned)minor(devt));
238
239 /* create temporary node to open block device */
240 unlink(tmp_node);
241 if (mknod(tmp_node, (S_IFBLK | 0600), devt) != 0)
242 bb_perror_msg_and_die("can't mknod(%s)", tmp_node);
243
244 id = volume_id_open_node(tmp_node);
245 unlink(tmp_node);
246 free(tmp_node);
247 return id;
248}
249#endif
250
251void FAST_FUNC free_volume_id(struct volume_id *id)
252{
253 if (id == NULL)
254 return;
255
256 //if (id->fd_close != 0) - always true
257 close(id->fd);
258 volume_id_free_buffer(id);
259#ifdef UNUSED_PARTITION_CODE
260 free(id->partitions);
261#endif
262 free(id);
263}
Note: See TracBrowser for help on using the repository browser.