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