Home | History | Annotate | Line # | Download | only in xxboot
      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