readufs.h revision 1.5
11.5Sitohy/* $NetBSD: readufs.h,v 1.5 2003/10/22 14:18:27 itohy Exp $ */ 21.5Sitohy/* from Id: readufs.h,v 1.9 2003/10/15 14:16:58 itohy Exp */ 31.1Sminoura 41.1Sminoura/* 51.4Sitohy * Written in 1999, 2002, 2003 by ITOH Yasufumi (itohy@netbsd.org). 61.1Sminoura * Public domain. 71.1Sminoura */ 81.1Sminoura 91.4Sitohy#include <sys/types.h> 101.4Sitohy#include <sys/param.h> 111.4Sitohy#include <ufs/ufs/dinode.h> 121.1Sminoura#include <ufs/ufs/dir.h> 131.1Sminoura 141.1Sminoura/* 151.4Sitohy * UFS1 / UFS2 161.4Sitohy */ 171.4Sitohyunion ufs_dinode { 181.4Sitohy#ifdef USE_UFS1 191.4Sitohy struct ufs1_dinode di1; 201.4Sitohy#endif 211.4Sitohy#ifdef USE_UFS2 221.4Sitohy struct ufs2_dinode di2; 231.4Sitohy#endif 241.4Sitohy}; 251.4Sitohy 261.4Sitohy/* short-cut for common fields (di_mode, di_nlink) */ 271.4Sitohy#ifdef USE_UFS1 281.4Sitohy# define di_common di1 291.4Sitohy#elif defined USE_UFS2 301.4Sitohy# define di_common di2 311.4Sitohy#endif 321.4Sitohy 331.5Sitohy/* for fields of same names and different locations */ 341.4Sitohy#if !(defined(USE_UFS1) && defined(USE_UFS2)) 351.4Sitohy# ifdef USE_UFS1 361.4Sitohy# define di_thisver di1 371.4Sitohy# endif 381.4Sitohy# ifdef USE_UFS2 391.4Sitohy# define di_thisver di2 401.4Sitohy# endif 411.4Sitohy#endif 421.4Sitohy 431.5Sitohy/* this is a size hack */ 441.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 451.4Sitohy# define DI_SIZE(di) ((di)->di1.di_size) 461.4Sitohy#else 471.4Sitohy# define DI_SIZE(di) ((di)->di_thisver.di_size) 481.4Sitohy#endif 491.5Sitohy/* and may break following fields on UFS2 */ 501.5Sitohy#define di_gid di_gid__is_not_available 511.5Sitohy#define di_blksize di_blksize__is_not_available 521.4Sitohy 531.4Sitohy/* 541.1Sminoura * filesystem information 551.1Sminoura */ 561.1Sminourastruct ufs_info { 571.1Sminoura enum ufs_fstype { 581.1Sminoura UFSTYPE_UNKNOWN 591.1Sminoura#ifdef USE_FFS 601.1Sminoura , UFSTYPE_FFS 611.1Sminoura#endif 621.1Sminoura#ifdef USE_LFS 631.1Sminoura , UFSTYPE_LFS 641.1Sminoura#endif 651.1Sminoura } fstype; 661.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 671.4Sitohy enum ufs_ufstype { 681.4Sitohy UFSTYPE_UFS1, UFSTYPE_UFS2 691.4Sitohy } ufstype; 701.4Sitohy#endif 711.4Sitohy int (*get_inode) __P((ino_t ino, union ufs_dinode *dibuf)); 721.1Sminoura 731.1Sminoura /* superblock information */ 741.1Sminoura u_int32_t bsize; /* fs block size */ 751.1Sminoura u_int32_t nindir; /* # indirect per block */ 761.1Sminoura u_int32_t fsbtodb; /* block -> sector shift count */ 771.1Sminoura union { 781.1Sminoura#ifdef USE_FFS 791.1Sminoura struct { 801.4Sitohy daddr_t iblkno; /* inode-block offset */ 811.4Sitohy int32_t old_cgoffset; /* cylinder group offset */ 821.4Sitohy int32_t old_cgmask; /* cylinder group mask */ 831.1Sminoura int32_t fragshift; /* block to fragmentation */ 841.1Sminoura int32_t inopb; /* # inodes per block */ 851.1Sminoura int32_t ipg; /* # inodes per group */ 861.1Sminoura int32_t fpg; /* # inodes per group * frag */ 871.4Sitohy int32_t magic; /* FS_UFSx_MAGIC */ 881.1Sminoura } u_ffs; 891.1Sminoura#endif 901.1Sminoura#ifdef USE_LFS 911.1Sminoura struct { 921.2Sminoura u_int32_t version; /* LFS version # */ 931.4Sitohy daddr_t idaddr; /* ifile inode disk address */ 941.2Sminoura u_int32_t inopb; /* inodes per block (v1) */ 951.2Sminoura /* inodes per frag (v2) */ 961.1Sminoura u_int32_t ifpb; /* inode addrs / ifile block */ 971.2Sminoura u_int32_t ioffset; /* start of inode in ifile */ 981.2Sminoura /* (in sector) */ 991.2Sminoura u_int32_t ibsize; /* size of inode block */ 1001.1Sminoura } u_lfs; 1011.1Sminoura#endif 1021.1Sminoura } fs_u; 1031.1Sminoura}; 1041.1Sminoura 1051.1Sminouraextern struct ufs_info ufs_info; 1061.1Sminoura#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 1071.1Sminoura 1081.3Sfvdlvoid RAW_READ __P((void *buf, daddr_t blkpos, size_t bytelen)); 1091.1Sminoura 1101.4Sitohysize_t ufs_read __P((union ufs_dinode *di, void *buf, unsigned off, 1111.4Sitohy size_t count)); 1121.1Sminouraino_t ufs_lookup __P((ino_t dirino, const char *fn)); 1131.1Sminouraino_t ufs_lookup_path __P((const char *path)); 1141.1Sminourasize_t ufs_load_file __P((void *buf, ino_t dirino, const char *fn)); 1151.1Sminouraint ufs_init __P((void)); 1161.1Sminoura 1171.1Sminoura#ifdef USE_FFS 1181.1Sminouraint try_ffs __P((void)); 1191.1Sminoura#endif 1201.1Sminoura 1211.1Sminoura#ifdef USE_LFS 1221.1Sminouraint try_lfs __P((void)); 1231.1Sminoura#endif 1241.1Sminoura 1251.1Sminoura#ifdef DEBUG_WITH_STDIO 1261.1Sminoura#include <fcntl.h> 1271.1Sminoura#include <err.h> 1281.1Sminoura#include <stdio.h> 1291.1Sminoura#include <unistd.h> 1301.1Sminoura#include <stdlib.h> 1311.4Sitohy#endif 1321.4Sitohy 1331.4Sitohy#ifdef __GNUC__ 1341.4Sitohy# ifndef alloca 1351.5Sitohy# define alloca(n) __builtin_alloca(n) 1361.4Sitohy# endif 1371.4Sitohy# ifndef strcmp 1381.5Sitohy# define strcmp(p, q) __builtin_strcmp(p, q) 1391.4Sitohy# endif 1401.1Sminoura#endif 141