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