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