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