probe.h revision c4c740ff488dae232dd3a64fccd26ec7265165a4
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 111struct cramfs_super_block { 112 __u8 magic[4]; 113 __u32 size; 114 __u32 flags; 115 __u32 future; 116 __u8 signature[16]; 117 struct cramfs_info { 118 __u32 crc; 119 __u32 edition; 120 __u32 blocks; 121 __u32 files; 122 } info; 123 __u8 name[16]; 124}; 125 126struct swap_id_block { 127/* unsigned char sws_boot[1024]; */ 128 __u32 sws_version; 129 __u32 sws_lastpage; 130 __u32 sws_nrbad; 131 unsigned char sws_uuid[16]; 132 char sws_volume[16]; 133 unsigned char sws_pad[117]; 134 __u32 sws_badpg; 135}; 136 137/* Yucky misaligned values */ 138struct vfat_super_block { 139/* 00*/ unsigned char vs_ignored[3]; 140/* 03*/ unsigned char vs_sysid[8]; 141/* 0b*/ unsigned char vs_sector_size[2]; 142/* 0d*/ __u8 vs_cluster_size; 143/* 0e*/ __u16 vs_reserved; 144/* 10*/ __u8 vs_fats; 145/* 11*/ unsigned char vs_dir_entries[2]; 146/* 13*/ unsigned char vs_sectors[2]; 147/* 15*/ unsigned char vs_media; 148/* 16*/ __u16 vs_fat_length; 149/* 18*/ __u16 vs_secs_track; 150/* 1a*/ __u16 vs_heads; 151/* 1c*/ __u32 vs_hidden; 152/* 20*/ __u32 vs_total_sect; 153/* 24*/ __u32 vs_fat32_length; 154/* 28*/ __u16 vs_flags; 155/* 2a*/ __u8 vs_version[2]; 156/* 2c*/ __u32 vs_root_cluster; 157/* 30*/ __u16 vs_insfo_sector; 158/* 32*/ __u16 vs_backup_boot; 159/* 34*/ __u16 vs_reserved2[6]; 160/* 40*/ unsigned char vs_unknown[3]; 161/* 43*/ unsigned char vs_serno[4]; 162/* 47*/ char vs_label[11]; 163/* 52*/ unsigned char vs_magic[8]; 164/* 5a*/ unsigned char vs_dummy2[164]; 165/*1fe*/ unsigned char vs_pmagic[2]; 166}; 167 168/* Yucky misaligned values */ 169struct msdos_super_block { 170/* 00*/ unsigned char ms_ignored[3]; 171/* 03*/ unsigned char ms_sysid[8]; 172/* 0b*/ unsigned char ms_sector_size[2]; 173/* 0d*/ __u8 ms_cluster_size; 174/* 0e*/ __u16 ms_reserved; 175/* 10*/ __u8 ms_fats; 176/* 11*/ unsigned char ms_dir_entries[2]; 177/* 13*/ unsigned char ms_sectors[2]; 178/* 15*/ unsigned char ms_media; 179/* 16*/ __u16 ms_fat_length; 180/* 18*/ __u16 ms_secs_track; 181/* 1a*/ __u16 ms_heads; 182/* 1c*/ __u32 ms_hidden; 183/* 20*/ __u32 ms_total_sect; 184/* 24*/ unsigned char ms_unknown[3]; 185/* 27*/ unsigned char ms_serno[4]; 186/* 2b*/ char ms_label[11]; 187/* 36*/ unsigned char ms_magic[8]; 188/* 3d*/ unsigned char ms_dummy2[192]; 189/*1fe*/ unsigned char ms_pmagic[2]; 190}; 191 192struct vfat_dir_entry { 193 __u8 name[11]; 194 __u8 attr; 195 __u16 time_creat; 196 __u16 date_creat; 197 __u16 time_acc; 198 __u16 date_acc; 199 __u16 cluster_high; 200 __u16 time_write; 201 __u16 date_write; 202 __u16 cluster_low; 203 __u32 size; 204}; 205 206/* maximum number of clusters */ 207#define FAT12_MAX 0xFF4 208#define FAT16_MAX 0xFFF4 209#define FAT32_MAX 0x0FFFFFF6 210 211struct minix_super_block { 212 __u16 ms_ninodes; 213 __u16 ms_nzones; 214 __u16 ms_imap_blocks; 215 __u16 ms_zmap_blocks; 216 __u16 ms_firstdatazone; 217 __u16 ms_log_zone_size; 218 __u32 ms_max_size; 219 unsigned char ms_magic[2]; 220 __u16 ms_state; 221 __u32 ms_zones; 222}; 223 224struct mdp_superblock_s { 225 __u32 md_magic; 226 __u32 major_version; 227 __u32 minor_version; 228 __u32 patch_version; 229 __u32 gvalid_words; 230 __u32 set_uuid0; 231 __u32 ctime; 232 __u32 level; 233 __u32 size; 234 __u32 nr_disks; 235 __u32 raid_disks; 236 __u32 md_minor; 237 __u32 not_persistent; 238 __u32 set_uuid1; 239 __u32 set_uuid2; 240 __u32 set_uuid3; 241}; 242 243struct hfs_super_block { 244 char h_magic[2]; 245 char h_dummy[18]; 246 __u32 h_blksize; 247}; 248 249struct ocfs_volume_header { 250 unsigned char minor_version[4]; 251 unsigned char major_version[4]; 252 unsigned char signature[128]; 253 char mount[128]; 254 unsigned char mount_len[2]; 255}; 256 257struct ocfs_volume_label { 258 unsigned char disk_lock[48]; 259 char label[64]; 260 unsigned char label_len[2]; 261 unsigned char vol_id[16]; 262 unsigned char vol_id_len[2]; 263}; 264 265#define ocfsmajor(o) ((__u32)o.major_version[0] \ 266 + (((__u32) o.major_version[1]) << 8) \ 267 + (((__u32) o.major_version[2]) << 16) \ 268 + (((__u32) o.major_version[3]) << 24)) 269#define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8)) 270#define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8)) 271 272#define OCFS_MAGIC "OracleCFS" 273 274struct ocfs2_super_block { 275 unsigned char signature[8]; 276 unsigned char s_dummy1[184]; 277 unsigned char s_dummy2[80]; 278 char s_label[64]; 279 unsigned char s_uuid[16]; 280}; 281 282#define OCFS2_MIN_BLOCKSIZE 512 283#define OCFS2_MAX_BLOCKSIZE 4096 284 285#define OCFS2_SUPER_BLOCK_BLKNO 2 286 287#define OCFS2_SUPER_BLOCK_SIGNATURE "OCFSV2" 288 289struct oracle_asm_disk_label { 290 char dummy[32]; 291 char dl_tag[8]; 292 char dl_id[24]; 293}; 294 295#define ORACLE_ASM_DISK_LABEL_MARKED "ORCLDISK" 296#define ORACLE_ASM_DISK_LABEL_OFFSET 32 297 298#define ISODCL(from, to) (to - from + 1) 299struct iso_volume_descriptor { 300 char type[ISODCL(1,1)]; /* 711 */ 301 char id[ISODCL(2,6)]; 302 char version[ISODCL(7,7)]; 303 char data[ISODCL(8,2048)]; 304}; 305 306/* 307 * Byte swap functions 308 */ 309#ifdef __GNUC__ 310#define _INLINE_ static __inline__ 311#else /* For Watcom C */ 312#define _INLINE_ static inline 313#endif 314 315static __u16 blkid_swab16(__u16 val); 316static __u32 blkid_swab32(__u32 val); 317static __u64 blkid_swab64(__u64 val); 318 319#if ((defined __GNUC__) && \ 320 (defined(__i386__) || defined(__i486__) || defined(__i586__))) 321 322#define _BLKID_HAVE_ASM_BITOPS_ 323 324_INLINE_ __u32 blkid_swab32(__u32 val) 325{ 326#ifdef EXT2FS_REQUIRE_486 327 __asm__("bswap %0" : "=r" (val) : "0" (val)); 328#else 329 __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ 330 "rorl $16,%0\n\t" /* swap words */ 331 "xchgb %b0,%h0" /* swap higher bytes */ 332 :"=q" (val) 333 : "0" (val)); 334#endif 335 return val; 336} 337 338_INLINE_ __u16 blkid_swab16(__u16 val) 339{ 340 __asm__("xchgb %b0,%h0" /* swap bytes */ \ 341 : "=q" (val) \ 342 : "0" (val)); \ 343 return val; 344} 345 346_INLINE_ __u64 blkid_swab64(__u64 val) 347{ 348 return (blkid_swab32(val >> 32) | 349 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32)); 350} 351#endif 352 353#if !defined(_BLKID_HAVE_ASM_BITOPS_) 354 355_INLINE_ __u16 blkid_swab16(__u16 val) 356{ 357 return (val >> 8) | (val << 8); 358} 359 360_INLINE_ __u32 blkid_swab32(__u32 val) 361{ 362 return ((val>>24) | ((val>>8)&0xFF00) | 363 ((val<<8)&0xFF0000) | (val<<24)); 364} 365 366_INLINE_ __u64 blkid_swab64(__u64 val) 367{ 368 return (blkid_swab32(val >> 32) | 369 (((__u64) blkid_swab32(val & 0xFFFFFFFFUL)) << 32)); 370} 371#endif 372 373 374 375#if __BYTE_ORDER == __BIG_ENDIAN 376#define blkid_le16(x) blkid_swab16(x) 377#define blkid_le32(x) blkid_swab32(x) 378#define blkid_le64(x) blkid_swab64(x) 379#define blkid_be16(x) (x) 380#define blkid_be32(x) (x) 381#define blkid_be64(x) (x) 382#else 383#define blkid_le16(x) (x) 384#define blkid_le32(x) (x) 385#define blkid_le64(x) (x) 386#define blkid_be16(x) blkid_swab16(x) 387#define blkid_be32(x) blkid_swab32(x) 388#define blkid_be64(x) blkid_swab64(x) 389#endif 390 391#undef _INLINE_ 392 393#endif /* _BLKID_PROBE_H */ 394