Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/util-linux/volume_id/volume_id.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 984 - (hide annotations) (download)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 6324 byte(s)
-updated to busybox-1.16.1 and enabled blkid/uuid support in default config
1 niro 816 /*
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     #include "volume_id_internal.h"
22    
23    
24     /* Some detection routines do not set label or uuid anyway,
25     * so they are disabled. */
26    
27     /* Looks for partitions, we don't use it: */
28     #define ENABLE_FEATURE_VOLUMEID_MAC 0
29     /* #define ENABLE_FEATURE_VOLUMEID_MSDOS 0 - NB: this one
30     * was not properly added to probe table anyway - ??! */
31    
32     /* None of RAIDs have label or uuid, except LinuxRAID: */
33     #define ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID 0
34     #define ENABLE_FEATURE_VOLUMEID_ISWRAID 0
35     #define ENABLE_FEATURE_VOLUMEID_LSIRAID 0
36     #define ENABLE_FEATURE_VOLUMEID_LVM 0
37     #define ENABLE_FEATURE_VOLUMEID_NVIDIARAID 0
38     #define ENABLE_FEATURE_VOLUMEID_PROMISERAID 0
39     #define ENABLE_FEATURE_VOLUMEID_SILICONRAID 0
40     #define ENABLE_FEATURE_VOLUMEID_VIARAID 0
41    
42     /* These filesystems also have no label or uuid: */
43     #define ENABLE_FEATURE_VOLUMEID_MINIX 0
44     #define ENABLE_FEATURE_VOLUMEID_HPFS 0
45     #define ENABLE_FEATURE_VOLUMEID_UFS 0
46    
47    
48 niro 984 typedef int FAST_FUNC (*raid_probe_fptr)(struct volume_id *id, /*uint64_t off,*/ uint64_t size);
49     typedef int FAST_FUNC (*probe_fptr)(struct volume_id *id /*, uint64_t off*/);
50 niro 816
51     static const raid_probe_fptr raid1[] = {
52     #if ENABLE_FEATURE_VOLUMEID_LINUXRAID
53     volume_id_probe_linux_raid,
54     #endif
55     #if ENABLE_FEATURE_VOLUMEID_ISWRAID
56     volume_id_probe_intel_software_raid,
57     #endif
58     #if ENABLE_FEATURE_VOLUMEID_LSIRAID
59     volume_id_probe_lsi_mega_raid,
60     #endif
61     #if ENABLE_FEATURE_VOLUMEID_VIARAID
62     volume_id_probe_via_raid,
63     #endif
64     #if ENABLE_FEATURE_VOLUMEID_SILICONRAID
65     volume_id_probe_silicon_medley_raid,
66     #endif
67     #if ENABLE_FEATURE_VOLUMEID_NVIDIARAID
68     volume_id_probe_nvidia_raid,
69     #endif
70     #if ENABLE_FEATURE_VOLUMEID_PROMISERAID
71     volume_id_probe_promise_fasttrack_raid,
72     #endif
73     #if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
74     volume_id_probe_highpoint_45x_raid,
75     #endif
76     };
77    
78     static const probe_fptr raid2[] = {
79     #if ENABLE_FEATURE_VOLUMEID_LVM
80     volume_id_probe_lvm1,
81     volume_id_probe_lvm2,
82     #endif
83     #if ENABLE_FEATURE_VOLUMEID_HIGHPOINTRAID
84     volume_id_probe_highpoint_37x_raid,
85     #endif
86     #if ENABLE_FEATURE_VOLUMEID_LUKS
87     volume_id_probe_luks,
88     #endif
89     };
90    
91     /* signature in the first block, only small buffer needed */
92     static const probe_fptr fs1[] = {
93     #if ENABLE_FEATURE_VOLUMEID_FAT
94     volume_id_probe_vfat,
95     #endif
96     #if ENABLE_FEATURE_VOLUMEID_MAC
97     volume_id_probe_mac_partition_map,
98     #endif
99     #if ENABLE_FEATURE_VOLUMEID_XFS
100     volume_id_probe_xfs,
101     #endif
102     };
103    
104     /* fill buffer with maximum */
105     static const probe_fptr fs2[] = {
106     #if ENABLE_FEATURE_VOLUMEID_LINUXSWAP
107     volume_id_probe_linux_swap,
108     #endif
109     #if ENABLE_FEATURE_VOLUMEID_EXT
110     volume_id_probe_ext,
111     #endif
112 niro 984 #if ENABLE_FEATURE_VOLUMEID_BTRFS
113     volume_id_probe_btrfs,
114     #endif
115 niro 816 #if ENABLE_FEATURE_VOLUMEID_REISERFS
116     volume_id_probe_reiserfs,
117     #endif
118     #if ENABLE_FEATURE_VOLUMEID_JFS
119     volume_id_probe_jfs,
120     #endif
121     #if ENABLE_FEATURE_VOLUMEID_UDF
122     volume_id_probe_udf,
123     #endif
124     #if ENABLE_FEATURE_VOLUMEID_ISO9660
125     volume_id_probe_iso9660,
126     #endif
127     #if ENABLE_FEATURE_VOLUMEID_HFS
128     volume_id_probe_hfs_hfsplus,
129     #endif
130     #if ENABLE_FEATURE_VOLUMEID_UFS
131     volume_id_probe_ufs,
132     #endif
133     #if ENABLE_FEATURE_VOLUMEID_NTFS
134     volume_id_probe_ntfs,
135     #endif
136     #if ENABLE_FEATURE_VOLUMEID_CRAMFS
137     volume_id_probe_cramfs,
138     #endif
139     #if ENABLE_FEATURE_VOLUMEID_ROMFS
140     volume_id_probe_romfs,
141     #endif
142     #if ENABLE_FEATURE_VOLUMEID_HPFS
143     volume_id_probe_hpfs,
144     #endif
145     #if ENABLE_FEATURE_VOLUMEID_SYSV
146     volume_id_probe_sysv,
147     #endif
148     #if ENABLE_FEATURE_VOLUMEID_MINIX
149     volume_id_probe_minix,
150     #endif
151     #if ENABLE_FEATURE_VOLUMEID_OCFS2
152     volume_id_probe_ocfs2,
153     #endif
154     };
155    
156 niro 984 int FAST_FUNC volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size)
157 niro 816 {
158     unsigned i;
159    
160     /* probe for raid first, cause fs probes may be successful on raid members */
161     if (size) {
162 niro 984 for (i = 0; i < ARRAY_SIZE(raid1); i++) {
163     if (raid1[i](id, /*off,*/ size) == 0)
164 niro 816 goto ret;
165 niro 984 if (id->error)
166     goto ret;
167     }
168 niro 816 }
169    
170 niro 984 for (i = 0; i < ARRAY_SIZE(raid2); i++) {
171     if (raid2[i](id /*,off*/) == 0)
172 niro 816 goto ret;
173 niro 984 if (id->error)
174     goto ret;
175     }
176 niro 816
177     /* signature in the first block, only small buffer needed */
178 niro 984 for (i = 0; i < ARRAY_SIZE(fs1); i++) {
179     if (fs1[i](id /*,off*/) == 0)
180 niro 816 goto ret;
181 niro 984 if (id->error)
182     goto ret;
183     }
184 niro 816
185     /* fill buffer with maximum */
186     volume_id_get_buffer(id, 0, SB_BUFFER_SIZE);
187    
188 niro 984 for (i = 0; i < ARRAY_SIZE(fs2); i++) {
189     if (fs2[i](id /*,off*/) == 0)
190 niro 816 goto ret;
191 niro 984 if (id->error)
192     goto ret;
193     }
194 niro 816
195     ret:
196     volume_id_free_buffer(id);
197 niro 984 return (- id->error); /* 0 or -1 */
198 niro 816
199     }
200    
201     /* open volume by device node */
202 niro 984 struct volume_id* FAST_FUNC volume_id_open_node(int fd)
203 niro 816 {
204     struct volume_id *id;
205    
206     id = xzalloc(sizeof(struct volume_id));
207     id->fd = fd;
208     ///* close fd on device close */
209     //id->fd_close = 1;
210     return id;
211     }
212    
213     #ifdef UNUSED
214     /* open volume by major/minor */
215 niro 984 struct volume_id* FAST_FUNC volume_id_open_dev_t(dev_t devt)
216 niro 816 {
217     struct volume_id *id;
218     char *tmp_node[VOLUME_ID_PATH_MAX];
219    
220     tmp_node = xasprintf("/dev/.volume_id-%u-%u-%u",
221     (unsigned)getpid(), (unsigned)major(devt), (unsigned)minor(devt));
222    
223     /* create temporary node to open block device */
224     unlink(tmp_node);
225     if (mknod(tmp_node, (S_IFBLK | 0600), devt) != 0)
226 niro 984 bb_perror_msg_and_die("can't mknod(%s)", tmp_node);
227 niro 816
228     id = volume_id_open_node(tmp_node);
229     unlink(tmp_node);
230     free(tmp_node);
231     return id;
232     }
233     #endif
234    
235 niro 984 void FAST_FUNC free_volume_id(struct volume_id *id)
236 niro 816 {
237     if (id == NULL)
238     return;
239    
240     //if (id->fd_close != 0) - always true
241     close(id->fd);
242     volume_id_free_buffer(id);
243     #ifdef UNUSED_PARTITION_CODE
244     free(id->partitions);
245     #endif
246     free(id);
247     }