probe.h revision bdc3514af41b5fbfea16c5192d5aade1da641cf4
1/*
2 * probe.h - constants and on-disk structures for extracting device data
3 *
4 * Copyright (C) 1999 by Andries Brouwer
5 * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
6 * Copyright (C) 2001 by Andreas Dilger
7 *
8 * %Begin-Header%
9 * This file may be redistributed under the terms of the
10 * GNU Lesser General Public License.
11 * %End-Header%
12 */
13
14#ifndef _BLKID_PROBE_H
15#define _BLKID_PROBE_H
16
17#include <blkid/blkid_types.h>
18
19struct blkid_magic;
20
21#define SB_BUFFER_SIZE		0x11000
22
23struct blkid_probe {
24	int			fd;
25	blkid_cache		cache;
26	blkid_dev		dev;
27	unsigned char		*sbbuf;
28	size_t			sb_valid;
29	unsigned char		*buf;
30	size_t			buf_max;
31};
32
33typedef int (*blkid_probe_t)(struct blkid_probe *probe,
34			     struct blkid_magic *id, unsigned char *buf);
35
36struct blkid_magic {
37	const char	*bim_type;	/* type name for this magic */
38	long		bim_kboff;	/* kilobyte offset of superblock */
39	unsigned	bim_sboff;	/* byte offset within superblock */
40	unsigned	bim_len;	/* length of magic */
41	const char	*bim_magic;	/* magic string */
42	blkid_probe_t	bim_probe;	/* probe function */
43};
44
45/*
46 * Structures for each of the content types we want to extract information
47 * from.  We do not necessarily need the magic field here, because we have
48 * already identified the content type before we get this far.  It may still
49 * be useful if there are probe functions which handle multiple content types.
50 */
51struct ext2_super_block {
52	__u32		s_inodes_count;
53	__u32		s_blocks_count;
54	__u32		s_r_blocks_count;
55	__u32		s_free_blocks_count;
56	__u32		s_free_inodes_count;
57	__u32		s_first_data_block;
58	__u32		s_log_block_size;
59	__u32		s_dummy3[7];
60	unsigned char	s_magic[2];
61	__u16		s_state;
62	__u32		s_dummy5[8];
63	__u32		s_feature_compat;
64	__u32		s_feature_incompat;
65	__u32		s_feature_ro_compat;
66	unsigned char   s_uuid[16];
67	char	   s_volume_name[16];
68	char	s_last_mounted[64];
69	__u32	s_algorithm_usage_bitmap;
70	__u8	s_prealloc_blocks;
71	__u8	s_prealloc_dir_blocks;
72	__u16	s_reserved_gdt_blocks;
73	__u8	s_journal_uuid[16];
74	__u32	s_journal_inum;
75	__u32	s_journal_dev;
76	__u32	s_last_orphan;
77	__u32	s_hash_seed[4];
78	__u8	s_def_hash_version;
79	__u8	s_jnl_backup_type;
80	__u16	s_reserved_word_pad;
81	__u32	s_default_mount_opts;
82	__u32	s_first_meta_bg;
83	__u32	s_mkfs_time;
84	__u32	s_jnl_blocks[17];
85	__u32	s_reserved[172];
86};
87#define EXT3_FEATURE_COMPAT_HAS_JOURNAL		0x00000004
88#define EXT3_FEATURE_INCOMPAT_RECOVER		0x00000004
89#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV	0x00000008
90
91struct xfs_super_block {
92	unsigned char	xs_magic[4];
93	__u32		xs_blocksize;
94	__u64		xs_dblocks;
95	__u64		xs_rblocks;
96	__u32		xs_dummy1[2];
97	unsigned char	xs_uuid[16];
98	__u32		xs_dummy2[15];
99	char		xs_fname[12];
100	__u32		xs_dummy3[2];
101	__u64		xs_icount;
102	__u64		xs_ifree;
103	__u64		xs_fdblocks;
104};
105
106struct reiserfs_super_block {
107	__u32		rs_blocks_count;
108	__u32		rs_free_blocks;
109	__u32		rs_root_block;
110	__u32		rs_journal_block;
111	__u32		rs_journal_dev;
112	__u32		rs_orig_journal_size;
113	__u32		rs_dummy2[5];
114	__u16		rs_blocksize;
115	__u16		rs_dummy3[3];
116	unsigned char	rs_magic[12];
117	__u32		rs_dummy4[5];
118	unsigned char	rs_uuid[16];
119	char		rs_label[16];
120};
121
122struct reiser4_super_block {
123	unsigned char	rs4_magic[16];
124	__u16		rs4_dummy[2];
125	unsigned char	rs4_uuid[16];
126	unsigned char	rs4_label[16];
127	__u64		rs4_dummy2;
128};
129
130struct jfs_super_block {
131	unsigned char	js_magic[4];
132	__u32		js_version;
133	__u64		js_size;
134	__u32		js_bsize;
135	__u32		js_dummy1;
136	__u32		js_pbsize;
137	__u32		js_dummy2[27];
138	unsigned char	js_uuid[16];
139	unsigned char	js_label[16];
140	unsigned char	js_loguuid[16];
141};
142
143struct romfs_super_block {
144	unsigned char	ros_magic[8];
145	__u32		ros_dummy1[2];
146	unsigned char	ros_volume[16];
147};
148
149struct cramfs_super_block {
150	__u8		magic[4];
151	__u32		size;
152	__u32		flags;
153	__u32		future;
154	__u8		signature[16];
155	struct cramfs_info {
156		__u32		crc;
157		__u32		edition;
158		__u32		blocks;
159		__u32		files;
160	} info;
161	__u8		name[16];
162};
163
164struct swap_id_block {
165/*	unsigned char	sws_boot[1024]; */
166	__u32		sws_version;
167	__u32		sws_lastpage;
168	__u32		sws_nrbad;
169	unsigned char	sws_uuid[16];
170	char		sws_volume[16];
171	unsigned char	sws_pad[117];
172	__u32		sws_badpg;
173};
174
175/* Yucky misaligned values */
176struct vfat_super_block {
177/* 00*/	unsigned char	vs_ignored[3];
178/* 03*/	unsigned char	vs_sysid[8];
179/* 0b*/	unsigned char	vs_sector_size[2];
180/* 0d*/	__u8		vs_cluster_size;
181/* 0e*/	__u16		vs_reserved;
182/* 10*/	__u8		vs_fats;
183/* 11*/	unsigned char	vs_dir_entries[2];
184/* 13*/	unsigned char	vs_sectors[2];
185/* 15*/	unsigned char	vs_media;
186/* 16*/	__u16		vs_fat_length;
187/* 18*/	__u16		vs_secs_track;
188/* 1a*/	__u16		vs_heads;
189/* 1c*/	__u32		vs_hidden;
190/* 20*/	__u32		vs_total_sect;
191/* 24*/	__u32		vs_fat32_length;
192/* 28*/	__u16		vs_flags;
193/* 2a*/	__u8		vs_version[2];
194/* 2c*/	__u32		vs_root_cluster;
195/* 30*/	__u16		vs_insfo_sector;
196/* 32*/	__u16		vs_backup_boot;
197/* 34*/	__u16		vs_reserved2[6];
198/* 40*/	unsigned char	vs_unknown[3];
199/* 43*/	unsigned char	vs_serno[4];
200/* 47*/	unsigned char	vs_label[11];
201/* 52*/	unsigned char   vs_magic[8];
202/* 5a*/	unsigned char	vs_dummy2[164];
203/*1fe*/	unsigned char	vs_pmagic[2];
204};
205
206/* Yucky misaligned values */
207struct msdos_super_block {
208/* 00*/	unsigned char	ms_ignored[3];
209/* 03*/	unsigned char	ms_sysid[8];
210/* 0b*/	unsigned char	ms_sector_size[2];
211/* 0d*/	__u8		ms_cluster_size;
212/* 0e*/	__u16		ms_reserved;
213/* 10*/	__u8		ms_fats;
214/* 11*/	unsigned char	ms_dir_entries[2];
215/* 13*/	unsigned char	ms_sectors[2];
216/* 15*/	unsigned char	ms_media;
217/* 16*/	__u16		ms_fat_length;
218/* 18*/	__u16		ms_secs_track;
219/* 1a*/	__u16		ms_heads;
220/* 1c*/	__u32		ms_hidden;
221/* 20*/	__u32		ms_total_sect;
222/* 24*/	unsigned char	ms_unknown[3];
223/* 27*/	unsigned char	ms_serno[4];
224/* 2b*/	unsigned char	ms_label[11];
225/* 36*/	unsigned char   ms_magic[8];
226/* 3d*/	unsigned char	ms_dummy2[192];
227/*1fe*/	unsigned char	ms_pmagic[2];
228};
229
230struct vfat_dir_entry {
231	__u8	name[11];
232	__u8	attr;
233	__u16	time_creat;
234	__u16	date_creat;
235	__u16	time_acc;
236	__u16	date_acc;
237	__u16	cluster_high;
238	__u16	time_write;
239	__u16	date_write;
240	__u16	cluster_low;
241	__u32	size;
242};
243
244/* maximum number of clusters */
245#define FAT12_MAX 0xFF4
246#define FAT16_MAX 0xFFF4
247#define FAT32_MAX 0x0FFFFFF6
248
249struct minix_super_block {
250	__u16		ms_ninodes;
251	__u16		ms_nzones;
252	__u16		ms_imap_blocks;
253	__u16		ms_zmap_blocks;
254	__u16		ms_firstdatazone;
255	__u16		ms_log_zone_size;
256	__u32		ms_max_size;
257	unsigned char	ms_magic[2];
258	__u16		ms_state;
259	__u32		ms_zones;
260};
261
262struct mdp_superblock_s {
263	__u32 md_magic;
264	__u32 major_version;
265	__u32 minor_version;
266	__u32 patch_version;
267	__u32 gvalid_words;
268	__u32 set_uuid0;
269	__u32 ctime;
270	__u32 level;
271	__u32 size;
272	__u32 nr_disks;
273	__u32 raid_disks;
274	__u32 md_minor;
275	__u32 not_persistent;
276	__u32 set_uuid1;
277	__u32 set_uuid2;
278	__u32 set_uuid3;
279};
280
281struct hfs_super_block {
282	char	h_magic[2];
283	char	h_dummy[18];
284	__u32	h_blksize;
285};
286
287struct ocfs_volume_header {
288	unsigned char	minor_version[4];
289	unsigned char	major_version[4];
290	unsigned char	signature[128];
291	char		mount[128];
292	unsigned char   mount_len[2];
293};
294
295struct ocfs_volume_label {
296	unsigned char	disk_lock[48];
297	char		label[64];
298	unsigned char	label_len[2];
299	unsigned char  vol_id[16];
300	unsigned char  vol_id_len[2];
301};
302
303#define ocfsmajor(o) ((__u32)o.major_version[0] \
304                   + (((__u32) o.major_version[1]) << 8) \
305                   + (((__u32) o.major_version[2]) << 16) \
306                   + (((__u32) o.major_version[3]) << 24))
307#define ocfslabellen(o)	((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8))
308#define ocfsmountlen(o)	((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8))
309
310#define OCFS_MAGIC "OracleCFS"
311
312struct ocfs2_super_block {
313	unsigned char  signature[8];
314	unsigned char  s_dummy1[184];
315	unsigned char  s_dummy2[80];
316	char	       s_label[64];
317	unsigned char  s_uuid[16];
318};
319
320#define OCFS2_MIN_BLOCKSIZE             512
321#define OCFS2_MAX_BLOCKSIZE             4096
322
323#define OCFS2_SUPER_BLOCK_BLKNO         2
324
325#define OCFS2_SUPER_BLOCK_SIGNATURE     "OCFSV2"
326
327struct oracle_asm_disk_label {
328	char dummy[32];
329	char dl_tag[8];
330	char dl_id[24];
331};
332
333#define ORACLE_ASM_DISK_LABEL_MARKED    "ORCLDISK"
334#define ORACLE_ASM_DISK_LABEL_OFFSET    32
335
336struct iso_volume_descriptor {
337	unsigned char	vd_type;
338	unsigned char	vd_id[5];
339	unsigned char	vd_version;
340	unsigned char	flags;
341	unsigned char	system_id[32];
342	unsigned char	volume_id[32];
343	unsigned char	unused[8];
344	unsigned char	space_size[8];
345	unsigned char	escape_sequences[8];
346};
347
348/*
349 * Byte swap functions
350 */
351#ifdef __GNUC__
352#define _INLINE_ static __inline__
353#else				/* For Watcom C */
354#define _INLINE_ static inline
355#endif
356
357static __u16 blkid_swab16(__u16 val);
358static __u32 blkid_swab32(__u32 val);
359static __u64 blkid_swab64(__u64 val);
360
361#if ((defined __GNUC__) && \
362     (defined(__i386__) || defined(__i486__) || defined(__i586__)))
363
364#define _BLKID_HAVE_ASM_BITOPS_
365
366_INLINE_ __u32 blkid_swab32(__u32 val)
367{
368#ifdef EXT2FS_REQUIRE_486
369	__asm__("bswap %0" : "=r" (val) : "0" (val));
370#else
371	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/
372		"rorl $16,%0\n\t"	/* swap words		*/
373		"xchgb %b0,%h0"		/* swap higher bytes	*/
374		:"=q" (val)
375		: "0" (val));
376#endif
377	return val;
378}
379
380_INLINE_ __u16 blkid_swab16(__u16 val)
381{
382	__asm__("xchgb %b0,%h0"		/* swap bytes		*/ \
383		: "=q" (val) \
384		:  "0" (val)); \
385		return val;
386}
387
388_INLINE_ __u64 blkid_swab64(__u64 val)
389{
390	return (blkid_swab32(val >> 32) |
391		(((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
392}
393#endif
394
395#if !defined(_BLKID_HAVE_ASM_BITOPS_)
396
397_INLINE_  __u16 blkid_swab16(__u16 val)
398{
399	return (val >> 8) | (val << 8);
400}
401
402_INLINE_ __u32 blkid_swab32(__u32 val)
403{
404	return ((val>>24) | ((val>>8)&0xFF00) |
405		((val<<8)&0xFF0000) | (val<<24));
406}
407
408_INLINE_ __u64 blkid_swab64(__u64 val)
409{
410	return (blkid_swab32(val >> 32) |
411		(((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32));
412}
413#endif
414
415
416
417#ifdef WORDS_BIGENDIAN
418#define blkid_le16(x) blkid_swab16(x)
419#define blkid_le32(x) blkid_swab32(x)
420#define blkid_le64(x) blkid_swab64(x)
421#define blkid_be16(x) (x)
422#define blkid_be32(x) (x)
423#define blkid_be64(x) (x)
424#else
425#define blkid_le16(x) (x)
426#define blkid_le32(x) (x)
427#define blkid_le64(x) (x)
428#define blkid_be16(x) blkid_swab16(x)
429#define blkid_be32(x) blkid_swab32(x)
430#define blkid_be64(x) blkid_swab64(x)
431#endif
432
433#undef _INLINE_
434
435#endif /* _BLKID_PROBE_H */
436