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