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