1 /*	from Id: readufs_ffs.c,v 1.5 2002/01/26 16:26:44 itohy Exp 	*/
2 
3 /*
4  * FS specific support for 4.2BSD Fast Filesystem
5  *
6  * Written by ITOH, Yasufumi (itohy@netbsd.org).
7  * Public domain.
8  *
9  * Intended to be used for boot programs (first stage).
10  * DON'T ADD ANY FANCY FEATURE.  THIS SHALL BE COMPACT.
11  */
12 
13 #include <sys/types.h>
14 #include <sys/param.h>
15 #include <ufs/ufs/dinode.h>
16 #include <ufs/ffs/fs.h>
17 
18 #include "readufs.h"
19 
20 static int get_ffs_inode __P((ino_t ino, struct dinode *dibuf));
21 
22 #define fsi	(*ufsinfo)
23 #define fsi_ffs	fsi.fs_u.u_ffs
24 
25 /*
26  * Read and check superblock.
27  * If it is an FFS, save information from the superblock.
28  */
29 int
30 try_ffs()
31 {
32 	union {
33 		struct fs	sblk;
34 		unsigned char	pad[SBSIZE];
35 	} buf;
36 	struct ufs_info *ufsinfo = &ufs_info;
37 
38 #ifdef DEBUG_WITH_STDIO
39 	printf("trying FFS\n");
40 #endif
41 	/* read FFS superblock */
42 	RAW_READ(&buf, SBLOCK, SBSIZE);
43 
44 #ifdef DEBUG_WITH_STDIO
45 	printf("FFS: sblk: magic: 0x%x\n", buf.sblk.fs_magic);
46 #endif
47 
48 	if (buf.sblk.fs_magic != FS_MAGIC)
49 		return 1;
50 
51 	/* This partition looks like an FFS. */
52 	fsi.fstype = UFSTYPE_FFS;
53 	fsi.get_inode = get_ffs_inode;
54 
55 	/* Get information from the superblock. */
56 	fsi.bsize = buf.sblk.fs_bsize;
57 	fsi.fsbtodb = buf.sblk.fs_fsbtodb;
58 	fsi.nindir = buf.sblk.fs_nindir;
59 
60 	fsi_ffs.iblkno = buf.sblk.fs_iblkno;
61 	fsi_ffs.cgoffset = buf.sblk.fs_cgoffset;
62 	fsi_ffs.cgmask = buf.sblk.fs_cgmask;
63 	fsi_ffs.fragshift = buf.sblk.fs_fragshift;
64 	fsi_ffs.inopb = buf.sblk.fs_inopb;
65 	fsi_ffs.ipg = buf.sblk.fs_ipg;
66 	fsi_ffs.fpg = buf.sblk.fs_fpg;
67 
68 	return 0;
69 }
70 
71 /* for inode macros */
72 #define fs_ipg		fs_u.u_ffs.ipg
73 #define fs_iblkno	fs_u.u_ffs.iblkno
74 #define fs_cgoffset	fs_u.u_ffs.cgoffset
75 #define fs_cgmask	fs_u.u_ffs.cgmask
76 #define fs_fpg		fs_u.u_ffs.fpg
77 #define fs_inopb	fs_u.u_ffs.inopb
78 #define fs_fragshift	fs_u.u_ffs.fragshift
79 #define fs_fsbtodb	fsbtodb
80 
81 /*
82  * Get inode from disk.
83  */
84 static int
85 get_ffs_inode(ino, dibuf)
86 	ino_t ino;
87 	struct dinode *dibuf;
88 {
89 	struct ufs_info *ufsinfo = &ufs_info;
90 	struct dinode *buf = alloca((size_t) fsi.bsize);
91 	struct dinode *di;
92 
93 	RAW_READ(buf, fsbtodb(&fsi, ino_to_fsba(&fsi, ino)),
94 			(size_t) fsi.bsize);
95 
96 	di = &buf[ino_to_fsbo(&fsi, ino)];
97 #ifdef DEBUG_WITH_STDIO
98 	printf("FFS: dinode(%d): mode 0%o, nlink %d, size %d, uid %d, gid %d, db[0] %d\n",
99 		ino, di->di_mode, di->di_nlink, (int)di->di_size,
100 		di->di_uid, di->di_gid, di->di_db[0]);
101 #endif
102 
103 	if (di->di_mode == 0)
104 		return 1;	/* unused inode (file is not found) */
105 
106 	*dibuf = *di;
107 
108 	return 0;
109 }
110 
111