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