readufs.h revision 1.4
11.4Sitohy/* $NetBSD: readufs.h,v 1.4 2003/04/09 12:57:14 itohy Exp $ */ 21.4Sitohy/* from Id: readufs.h,v 1.8 2003/04/08 09:19:32 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.4Sitohy#if !(defined(USE_UFS1) && defined(USE_UFS2)) 341.4Sitohy# ifdef USE_UFS1 351.4Sitohy# define di_thisver di1 361.4Sitohy# endif 371.4Sitohy# ifdef USE_UFS2 381.4Sitohy# define di_thisver di2 391.4Sitohy# endif 401.4Sitohy#endif 411.4Sitohy 421.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 431.4Sitohy# define DI_SIZE(di) ((di)->di1.di_size) 441.4Sitohy#else 451.4Sitohy# define DI_SIZE(di) ((di)->di_thisver.di_size) 461.4Sitohy#endif 471.4Sitohy 481.4Sitohy/* 491.1Sminoura * filesystem information 501.1Sminoura */ 511.1Sminourastruct ufs_info { 521.1Sminoura enum ufs_fstype { 531.1Sminoura UFSTYPE_UNKNOWN 541.1Sminoura#ifdef USE_FFS 551.1Sminoura , UFSTYPE_FFS 561.1Sminoura#endif 571.1Sminoura#ifdef USE_LFS 581.1Sminoura , UFSTYPE_LFS 591.1Sminoura#endif 601.1Sminoura } fstype; 611.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 621.4Sitohy enum ufs_ufstype { 631.4Sitohy UFSTYPE_UFS1, UFSTYPE_UFS2 641.4Sitohy } ufstype; 651.4Sitohy#endif 661.4Sitohy int (*get_inode) __P((ino_t ino, union ufs_dinode *dibuf)); 671.1Sminoura 681.1Sminoura /* superblock information */ 691.1Sminoura u_int32_t bsize; /* fs block size */ 701.1Sminoura u_int32_t nindir; /* # indirect per block */ 711.1Sminoura u_int32_t fsbtodb; /* block -> sector shift count */ 721.1Sminoura union { 731.1Sminoura#ifdef USE_FFS 741.1Sminoura struct { 751.4Sitohy daddr_t iblkno; /* inode-block offset */ 761.4Sitohy int32_t old_cgoffset; /* cylinder group offset */ 771.4Sitohy int32_t old_cgmask; /* cylinder group mask */ 781.1Sminoura int32_t fragshift; /* block to fragmentation */ 791.1Sminoura int32_t inopb; /* # inodes per block */ 801.1Sminoura int32_t ipg; /* # inodes per group */ 811.1Sminoura int32_t fpg; /* # inodes per group * frag */ 821.4Sitohy int32_t magic; /* FS_UFSx_MAGIC */ 831.1Sminoura } u_ffs; 841.1Sminoura#endif 851.1Sminoura#ifdef USE_LFS 861.1Sminoura struct { 871.2Sminoura u_int32_t version; /* LFS version # */ 881.4Sitohy daddr_t idaddr; /* ifile inode disk address */ 891.2Sminoura u_int32_t inopb; /* inodes per block (v1) */ 901.2Sminoura /* inodes per frag (v2) */ 911.1Sminoura u_int32_t ifpb; /* inode addrs / ifile block */ 921.2Sminoura u_int32_t ioffset; /* start of inode in ifile */ 931.2Sminoura /* (in sector) */ 941.2Sminoura u_int32_t ibsize; /* size of inode block */ 951.1Sminoura } u_lfs; 961.1Sminoura#endif 971.1Sminoura } fs_u; 981.1Sminoura}; 991.1Sminoura 1001.1Sminouraextern struct ufs_info ufs_info; 1011.1Sminoura#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 1021.1Sminoura 1031.3Sfvdlvoid RAW_READ __P((void *buf, daddr_t blkpos, size_t bytelen)); 1041.1Sminoura 1051.4Sitohysize_t ufs_read __P((union ufs_dinode *di, void *buf, unsigned off, 1061.4Sitohy size_t count)); 1071.1Sminouraino_t ufs_lookup __P((ino_t dirino, const char *fn)); 1081.1Sminouraino_t ufs_lookup_path __P((const char *path)); 1091.1Sminourasize_t ufs_load_file __P((void *buf, ino_t dirino, const char *fn)); 1101.1Sminouraint ufs_init __P((void)); 1111.1Sminoura 1121.1Sminoura#ifdef USE_FFS 1131.1Sminouraint try_ffs __P((void)); 1141.1Sminoura#endif 1151.1Sminoura 1161.1Sminoura#ifdef USE_LFS 1171.1Sminouraint try_lfs __P((void)); 1181.1Sminoura#endif 1191.1Sminoura 1201.1Sminoura#ifdef DEBUG_WITH_STDIO 1211.1Sminoura#include <fcntl.h> 1221.1Sminoura#include <err.h> 1231.1Sminoura#include <stdio.h> 1241.1Sminoura#include <unistd.h> 1251.1Sminoura#include <stdlib.h> 1261.4Sitohy#endif 1271.4Sitohy 1281.4Sitohy#ifdef __GNUC__ 1291.4Sitohy# ifndef alloca 1301.4Sitohy# define alloca(n) __builtin_alloca(n) 1311.4Sitohy# endif 1321.4Sitohy# ifndef strcmp 1331.4Sitohy# define strcmp(p, q) __builtin_strcmp(p, q) 1341.4Sitohy# endif 1351.1Sminoura#endif 136