probe.h revision 414846b126d4d751bd6b36df0a39dcb030e0feb3
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 21typedef int (*blkid_probe_t)(int fd, blkid_cache cache, blkid_dev dev, 22 struct blkid_magic *id, unsigned char *buf); 23 24struct blkid_magic { 25 const char *bim_type; /* type name for this magic */ 26 long bim_kboff; /* kilobyte offset of superblock */ 27 unsigned bim_sboff; /* byte offset within superblock */ 28 unsigned bim_len; /* length of magic */ 29 const char *bim_magic; /* magic string */ 30 blkid_probe_t bim_probe; /* probe function */ 31}; 32 33/* 34 * Structures for each of the content types we want to extract information 35 * from. We do not necessarily need the magic field here, because we have 36 * already identified the content type before we get this far. It may still 37 * be useful if there are probe functions which handle multiple content types. 38 */ 39struct ext2_super_block { 40 __u32 s_inodes_count; 41 __u32 s_blocks_count; 42 __u32 s_r_blocks_count; 43 __u32 s_free_blocks_count; 44 __u32 s_free_inodes_count; 45 __u32 s_first_data_block; 46 __u32 s_log_block_size; 47 __u32 s_dummy3[7]; 48 unsigned char s_magic[2]; 49 __u16 s_state; 50 __u32 s_dummy5[8]; 51 __u32 s_feature_compat; 52 __u32 s_feature_incompat; 53 __u32 s_feature_ro_compat; 54 unsigned char s_uuid[16]; 55 char s_volume_name[16]; 56}; 57#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x00000004 58#define EXT3_FEATURE_INCOMPAT_RECOVER 0x00000004 59#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x00000008 60 61struct xfs_super_block { 62 unsigned char xs_magic[4]; 63 __u32 xs_blocksize; 64 __u64 xs_dblocks; 65 __u64 xs_rblocks; 66 __u32 xs_dummy1[2]; 67 unsigned char xs_uuid[16]; 68 __u32 xs_dummy2[15]; 69 char xs_fname[12]; 70 __u32 xs_dummy3[2]; 71 __u64 xs_icount; 72 __u64 xs_ifree; 73 __u64 xs_fdblocks; 74}; 75 76struct reiserfs_super_block { 77 __u32 rs_blocks_count; 78 __u32 rs_free_blocks; 79 __u32 rs_root_block; 80 __u32 rs_journal_block; 81 __u32 rs_journal_dev; 82 __u32 rs_orig_journal_size; 83 __u32 rs_dummy2[5]; 84 __u16 rs_blocksize; 85 __u16 rs_dummy3[3]; 86 unsigned char rs_magic[12]; 87 __u32 rs_dummy4[5]; 88 unsigned char rs_uuid[16]; 89 char rs_label[16]; 90}; 91 92struct jfs_super_block { 93 unsigned char js_magic[4]; 94 __u32 js_version; 95 __u64 js_size; 96 __u32 js_bsize; 97 __u32 js_dummy1; 98 __u32 js_pbsize; 99 __u32 js_dummy2[27]; 100 unsigned char js_uuid[16]; 101 unsigned char js_label[16]; 102 unsigned char js_loguuid[16]; 103}; 104 105struct romfs_super_block { 106 unsigned char ros_magic[8]; 107 __u32 ros_dummy1[2]; 108 unsigned char ros_volume[16]; 109}; 110 111/* Yucky misaligned values */ 112struct vfat_super_block { 113/* 00*/ unsigned char vs_ignored[3]; 114/* 03*/ unsigned char vs_sysid[8]; 115/* 0b*/ unsigned char vs_sector_size[2]; 116/* 0d*/ __u8 vs_cluster_size; 117/* 0e*/ __u16 vs_reserved; 118/* 10*/ __u8 vs_fats; 119/* 11*/ unsigned char vs_dir_entries[2]; 120/* 13*/ unsigned char vs_sectors[2]; 121/* 15*/ unsigned char vs_media; 122/* 16*/ __u16 vs_fat_length; 123/* 18*/ __u16 vs_secs_track; 124/* 1a*/ __u16 vs_heads; 125/* 1c*/ __u32 vs_hidden; 126/* 20*/ __u32 vs_total_sect; 127/* 24*/ __u32 vs_fat32_length; 128/* 28*/ __u16 vs_flags; 129/* 2a*/ __u8 vs_version[2]; 130/* 2c*/ __u32 vs_root_cluster; 131/* 30*/ __u16 vs_insfo_sector; 132/* 32*/ __u16 vs_backup_boot; 133/* 34*/ __u16 vs_reserved2[6]; 134/* 40*/ unsigned char vs_unknown[3]; 135/* 43*/ unsigned char vs_serno[4]; 136/* 47*/ char vs_label[11]; 137/* 52*/ unsigned char vs_magic[8]; 138/* 5a*/ unsigned char vs_dummy2[164]; 139/*1fe*/ unsigned char vs_pmagic[2]; 140}; 141 142/* Yucky misaligned values */ 143struct msdos_super_block { 144/* 00*/ unsigned char ms_ignored[3]; 145/* 03*/ unsigned char ms_sysid[8]; 146/* 0b*/ unsigned char ms_sector_size[2]; 147/* 0d*/ __u8 ms_cluster_size; 148/* 0e*/ __u16 ms_reserved; 149/* 10*/ __u8 ms_fats; 150/* 11*/ unsigned char ms_dir_entries[2]; 151/* 13*/ unsigned char ms_sectors[2]; 152/* 15*/ unsigned char ms_media; 153/* 16*/ __u16 ms_fat_length; 154/* 18*/ __u16 ms_secs_track; 155/* 1a*/ __u16 ms_heads; 156/* 1c*/ __u32 ms_hidden; 157/* 20*/ __u32 ms_total_sect; 158/* 24*/ unsigned char ms_unknown[3]; 159/* 27*/ unsigned char ms_serno[4]; 160/* 2b*/ char ms_label[11]; 161/* 36*/ unsigned char ms_magic[8]; 162/* 3d*/ unsigned char ms_dummy2[192]; 163/*1fe*/ unsigned char ms_pmagic[2]; 164}; 165 166struct minix_super_block { 167 __u16 ms_ninodes; 168 __u16 ms_nzones; 169 __u16 ms_imap_blocks; 170 __u16 ms_zmap_blocks; 171 __u16 ms_firstdatazone; 172 __u16 ms_log_zone_size; 173 __u32 ms_max_size; 174 unsigned char ms_magic[2]; 175 __u16 ms_state; 176 __u32 ms_zones; 177}; 178 179struct swap_header { 180 char sh_bootbits[1024]; 181 unsigned int sh_version; 182 unsigned int sh_last_page; 183 unsigned int sh_nr_badpages; 184 char sh_label[16]; 185}; 186 187struct mdp_superblock_s { 188 __u32 md_magic; 189 __u32 major_version; 190 __u32 minor_version; 191 __u32 patch_version; 192 __u32 gvalid_words; 193 __u32 set_uuid0; 194 __u32 ctime; 195 __u32 level; 196 __u32 size; 197 __u32 nr_disks; 198 __u32 raid_disks; 199 __u32 md_minor; 200 __u32 not_persistent; 201 __u32 set_uuid1; 202 __u32 set_uuid2; 203 __u32 set_uuid3; 204}; 205 206struct hfs_super_block { 207 char h_magic[2]; 208 char h_dummy[18]; 209 __u32 h_blksize; 210}; 211 212struct ocfs_volume_header { 213 u_char minor_version[4]; 214 u_char major_version[4]; 215 u_char signature[128]; 216 u_char mount[128]; 217 u_char mount_len[2]; 218}; 219 220struct ocfs_volume_label { 221 u_char disk_lock[48]; 222 u_char label[64]; 223 u_char label_len[2]; 224 u_char vol_id[16]; 225 u_char vol_id_len[2]; 226}; 227 228#define ocfsmajor(o) ((uint)o.major_version[0] \ 229 + (((uint) o.major_version[1]) << 8) \ 230 + (((uint) o.major_version[2]) << 16) \ 231 + (((uint) o.major_version[3]) << 24)) 232#define ocfslabellen(o) ((uint)o.label_len[0] + (((uint) o.label_len[1]) << 8)) 233#define ocfsmountlen(o) ((uint)o.mount_len[0] + (((uint) o.mount_len[1])<<8)) 234 235#define OCFS_MAGIC "OracleCFS" 236 237struct ocfs2_super_block { 238 u_char signature[8]; 239 u_char s_dummy1[184]; 240 u_char s_dummy2[80]; 241 u_char s_label[64]; 242 u_char s_uuid[16]; 243}; 244 245#define OCFS2_MIN_BLOCKSIZE 512 246#define OCFS2_MAX_BLOCKSIZE 4096 247 248#define OCFS2_SUPER_BLOCK_BLKNO 2 249 250#define OCFS2_SUPER_BLOCK_SIGNATURE "OCFSV2" 251 252#define ISODCL(from, to) (to - from + 1) 253struct iso_volume_descriptor { 254 char type[ISODCL(1,1)]; /* 711 */ 255 char id[ISODCL(2,6)]; 256 char version[ISODCL(7,7)]; 257 char data[ISODCL(8,2048)]; 258}; 259 260/* 261 * Byte swap functions 262 */ 263#ifdef __GNUC__ 264#define _INLINE_ static __inline__ 265#else /* For Watcom C */ 266#define _INLINE_ static inline 267#endif 268 269static __u16 blkid_swab16(__u16 val); 270static __u32 blkid_swab32(__u32 val); 271static __u64 blkid_swab64(__u64 val); 272 273#if ((defined __GNUC__) && \ 274 (defined(__i386__) || defined(__i486__) || defined(__i586__))) 275 276#define _BLKID_HAVE_ASM_BITOPS_ 277 278_INLINE_ __u32 blkid_swab32(__u32 val) 279{ 280#ifdef EXT2FS_REQUIRE_486 281 __asm__("bswap %0" : "=r" (val) : "0" (val)); 282#else 283 __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ 284 "rorl $16,%0\n\t" /* swap words */ 285 "xchgb %b0,%h0" /* swap higher bytes */ 286 :"=q" (val) 287 : "0" (val)); 288#endif 289 return val; 290} 291 292_INLINE_ __u16 blkid_swab16(__u16 val) 293{ 294 __asm__("xchgb %b0,%h0" /* swap bytes */ \ 295 : "=q" (val) \ 296 : "0" (val)); \ 297 return val; 298} 299 300_INLINE_ __u64 blkid_swab64(__u64 val) 301{ 302 return (blkid_swab32(val >> 32) | 303 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32)); 304} 305#endif 306 307#if !defined(_BLKID_HAVE_ASM_BITOPS_) 308 309_INLINE_ __u16 blkid_swab16(__u16 val) 310{ 311 return (val >> 8) | (val << 8); 312} 313 314_INLINE_ __u32 blkid_swab32(__u32 val) 315{ 316 return ((val>>24) | ((val>>8)&0xFF00) | 317 ((val<<8)&0xFF0000) | (val<<24)); 318} 319 320_INLINE_ __u64 blkid_swab64(__u64 val) 321{ 322 return (blkid_swab32(val >> 32) | 323 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32)); 324} 325#endif 326 327 328 329#if __BYTE_ORDER == __BIG_ENDIAN 330#define blkid_le16(x) blkid_swab16(x) 331#define blkid_le32(x) blkid_swab32(x) 332#define blkid_le64(x) blkid_swab64(x) 333#define blkid_be16(x) (x) 334#define blkid_be32(x) (x) 335#define blkid_be64(x) (x) 336#else 337#define blkid_le16(x) (x) 338#define blkid_le32(x) (x) 339#define blkid_le64(x) (x) 340#define blkid_be16(x) blkid_swab16(x) 341#define blkid_be32(x) blkid_swab32(x) 342#define blkid_be64(x) blkid_swab64(x) 343#endif 344 345#undef _INLINE_ 346 347#endif /* _BLKID_PROBE_H */ 348