readufs.h revision 1.5
1/* $NetBSD: readufs.h,v 1.5 2003/10/22 14:18:27 itohy Exp $ */ 2/* from Id: readufs.h,v 1.9 2003/10/15 14:16:58 itohy Exp */ 3 4/* 5 * Written in 1999, 2002, 2003 by ITOH Yasufumi (itohy@netbsd.org). 6 * Public domain. 7 */ 8 9#include <sys/types.h> 10#include <sys/param.h> 11#include <ufs/ufs/dinode.h> 12#include <ufs/ufs/dir.h> 13 14/* 15 * UFS1 / UFS2 16 */ 17union ufs_dinode { 18#ifdef USE_UFS1 19 struct ufs1_dinode di1; 20#endif 21#ifdef USE_UFS2 22 struct ufs2_dinode di2; 23#endif 24}; 25 26/* short-cut for common fields (di_mode, di_nlink) */ 27#ifdef USE_UFS1 28# define di_common di1 29#elif defined USE_UFS2 30# define di_common di2 31#endif 32 33/* for fields of same names and different locations */ 34#if !(defined(USE_UFS1) && defined(USE_UFS2)) 35# ifdef USE_UFS1 36# define di_thisver di1 37# endif 38# ifdef USE_UFS2 39# define di_thisver di2 40# endif 41#endif 42 43/* this is a size hack */ 44#if defined(USE_UFS1) && defined(USE_UFS2) 45# define DI_SIZE(di) ((di)->di1.di_size) 46#else 47# define DI_SIZE(di) ((di)->di_thisver.di_size) 48#endif 49/* and may break following fields on UFS2 */ 50#define di_gid di_gid__is_not_available 51#define di_blksize di_blksize__is_not_available 52 53/* 54 * filesystem information 55 */ 56struct ufs_info { 57 enum ufs_fstype { 58 UFSTYPE_UNKNOWN 59#ifdef USE_FFS 60 , UFSTYPE_FFS 61#endif 62#ifdef USE_LFS 63 , UFSTYPE_LFS 64#endif 65 } fstype; 66#if defined(USE_UFS1) && defined(USE_UFS2) 67 enum ufs_ufstype { 68 UFSTYPE_UFS1, UFSTYPE_UFS2 69 } ufstype; 70#endif 71 int (*get_inode) __P((ino_t ino, union ufs_dinode *dibuf)); 72 73 /* superblock information */ 74 u_int32_t bsize; /* fs block size */ 75 u_int32_t nindir; /* # indirect per block */ 76 u_int32_t fsbtodb; /* block -> sector shift count */ 77 union { 78#ifdef USE_FFS 79 struct { 80 daddr_t iblkno; /* inode-block offset */ 81 int32_t old_cgoffset; /* cylinder group offset */ 82 int32_t old_cgmask; /* cylinder group mask */ 83 int32_t fragshift; /* block to fragmentation */ 84 int32_t inopb; /* # inodes per block */ 85 int32_t ipg; /* # inodes per group */ 86 int32_t fpg; /* # inodes per group * frag */ 87 int32_t magic; /* FS_UFSx_MAGIC */ 88 } u_ffs; 89#endif 90#ifdef USE_LFS 91 struct { 92 u_int32_t version; /* LFS version # */ 93 daddr_t idaddr; /* ifile inode disk address */ 94 u_int32_t inopb; /* inodes per block (v1) */ 95 /* inodes per frag (v2) */ 96 u_int32_t ifpb; /* inode addrs / ifile block */ 97 u_int32_t ioffset; /* start of inode in ifile */ 98 /* (in sector) */ 99 u_int32_t ibsize; /* size of inode block */ 100 } u_lfs; 101#endif 102 } fs_u; 103}; 104 105extern struct ufs_info ufs_info; 106#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 107 108void RAW_READ __P((void *buf, daddr_t blkpos, size_t bytelen)); 109 110size_t ufs_read __P((union ufs_dinode *di, void *buf, unsigned off, 111 size_t count)); 112ino_t ufs_lookup __P((ino_t dirino, const char *fn)); 113ino_t ufs_lookup_path __P((const char *path)); 114size_t ufs_load_file __P((void *buf, ino_t dirino, const char *fn)); 115int ufs_init __P((void)); 116 117#ifdef USE_FFS 118int try_ffs __P((void)); 119#endif 120 121#ifdef USE_LFS 122int try_lfs __P((void)); 123#endif 124 125#ifdef DEBUG_WITH_STDIO 126#include <fcntl.h> 127#include <err.h> 128#include <stdio.h> 129#include <unistd.h> 130#include <stdlib.h> 131#endif 132 133#ifdef __GNUC__ 134# ifndef alloca 135# define alloca(n) __builtin_alloca(n) 136# endif 137# ifndef strcmp 138# define strcmp(p, q) __builtin_strcmp(p, q) 139# endif 140#endif 141