readufs.h revision 1.9
11.9Sdsl/* $NetBSD: readufs.h,v 1.9 2009/03/14 14:46:07 dsl Exp $ */ 21.5Sitohy/* from Id: readufs.h,v 1.9 2003/10/15 14:16:58 itohy Exp */ 31.1Sminoura 41.1Sminoura/* 51.6Skeihan * Written in 1999, 2002, 2003 by ITOH Yasufumi (itohy@NetBSD.org). 61.1Sminoura * Public domain. 71.1Sminoura */ 81.1Sminoura 91.4Sitohy#include <sys/types.h> 101.4Sitohy#include <sys/param.h> 111.4Sitohy#include <ufs/ufs/dinode.h> 121.1Sminoura#include <ufs/ufs/dir.h> 131.1Sminoura 141.1Sminoura/* 151.4Sitohy * UFS1 / UFS2 161.4Sitohy */ 171.4Sitohyunion ufs_dinode { 181.4Sitohy#ifdef USE_UFS1 191.4Sitohy struct ufs1_dinode di1; 201.4Sitohy#endif 211.4Sitohy#ifdef USE_UFS2 221.4Sitohy struct ufs2_dinode di2; 231.4Sitohy#endif 241.4Sitohy}; 251.4Sitohy 261.7She/* For more compact code and independence on 64-bit types and ops */ 271.7Shetypedef uint32_t ino32_t; 281.7She 291.4Sitohy/* short-cut for common fields (di_mode, di_nlink) */ 301.4Sitohy#ifdef USE_UFS1 311.4Sitohy# define di_common di1 321.4Sitohy#elif defined USE_UFS2 331.4Sitohy# define di_common di2 341.4Sitohy#endif 351.4Sitohy 361.5Sitohy/* for fields of same names and different locations */ 371.4Sitohy#if !(defined(USE_UFS1) && defined(USE_UFS2)) 381.4Sitohy# ifdef USE_UFS1 391.4Sitohy# define di_thisver di1 401.4Sitohy# endif 411.4Sitohy# ifdef USE_UFS2 421.4Sitohy# define di_thisver di2 431.4Sitohy# endif 441.4Sitohy#endif 451.4Sitohy 461.5Sitohy/* this is a size hack */ 471.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 481.4Sitohy# define DI_SIZE(di) ((di)->di1.di_size) 491.4Sitohy#else 501.4Sitohy# define DI_SIZE(di) ((di)->di_thisver.di_size) 511.4Sitohy#endif 521.5Sitohy/* and may break following fields on UFS2 */ 531.5Sitohy#define di_gid di_gid__is_not_available 541.5Sitohy#define di_blksize di_blksize__is_not_available 551.4Sitohy 561.4Sitohy/* 571.1Sminoura * filesystem information 581.1Sminoura */ 591.1Sminourastruct ufs_info { 601.1Sminoura enum ufs_fstype { 611.1Sminoura UFSTYPE_UNKNOWN 621.1Sminoura#ifdef USE_FFS 631.1Sminoura , UFSTYPE_FFS 641.1Sminoura#endif 651.1Sminoura#ifdef USE_LFS 661.1Sminoura , UFSTYPE_LFS 671.1Sminoura#endif 681.1Sminoura } fstype; 691.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 701.4Sitohy enum ufs_ufstype { 711.4Sitohy UFSTYPE_UFS1, UFSTYPE_UFS2 721.4Sitohy } ufstype; 731.4Sitohy#endif 741.9Sdsl int (*get_inode)(ino32_t ino, union ufs_dinode *dibuf); 751.1Sminoura 761.1Sminoura /* superblock information */ 771.1Sminoura u_int32_t bsize; /* fs block size */ 781.1Sminoura u_int32_t nindir; /* # indirect per block */ 791.1Sminoura u_int32_t fsbtodb; /* block -> sector shift count */ 801.1Sminoura union { 811.1Sminoura#ifdef USE_FFS 821.1Sminoura struct { 831.4Sitohy daddr_t iblkno; /* inode-block offset */ 841.4Sitohy int32_t old_cgoffset; /* cylinder group offset */ 851.4Sitohy int32_t old_cgmask; /* cylinder group mask */ 861.1Sminoura int32_t fragshift; /* block to fragmentation */ 871.1Sminoura int32_t inopb; /* # inodes per block */ 881.1Sminoura int32_t ipg; /* # inodes per group */ 891.1Sminoura int32_t fpg; /* # inodes per group * frag */ 901.4Sitohy int32_t magic; /* FS_UFSx_MAGIC */ 911.1Sminoura } u_ffs; 921.1Sminoura#endif 931.1Sminoura#ifdef USE_LFS 941.1Sminoura struct { 951.2Sminoura u_int32_t version; /* LFS version # */ 961.4Sitohy daddr_t idaddr; /* ifile inode disk address */ 971.2Sminoura u_int32_t inopb; /* inodes per block (v1) */ 981.2Sminoura /* inodes per frag (v2) */ 991.1Sminoura u_int32_t ifpb; /* inode addrs / ifile block */ 1001.2Sminoura u_int32_t ioffset; /* start of inode in ifile */ 1011.2Sminoura /* (in sector) */ 1021.2Sminoura u_int32_t ibsize; /* size of inode block */ 1031.1Sminoura } u_lfs; 1041.1Sminoura#endif 1051.1Sminoura } fs_u; 1061.1Sminoura}; 1071.1Sminoura 1081.1Sminouraextern struct ufs_info ufs_info; 1091.1Sminoura#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 1101.1Sminoura 1111.9Sdslvoid RAW_READ(void *buf, daddr_t blkpos, size_t bytelen); 1121.1Sminoura 1131.9Sdslsize_t ufs_read(union ufs_dinode *di, void *buf, unsigned off, 1141.9Sdsl size_t count); 1151.9Sdslino32_t ufs_lookup(ino32_t dirino, const char *fn); 1161.9Sdslino32_t ufs_lookup_path(const char *path); 1171.9Sdslsize_t ufs_load_file(void *buf, ino32_t dirino, const char *fn); 1181.9Sdslint ufs_init(void); 1191.1Sminoura 1201.1Sminoura#ifdef USE_FFS 1211.9Sdslint try_ffs(void); 1221.1Sminoura#endif 1231.1Sminoura 1241.1Sminoura#ifdef USE_LFS 1251.9Sdslint try_lfs(void); 1261.1Sminoura#endif 1271.1Sminoura 1281.1Sminoura#ifdef DEBUG_WITH_STDIO 1291.1Sminoura#include <fcntl.h> 1301.1Sminoura#include <err.h> 1311.1Sminoura#include <stdio.h> 1321.1Sminoura#include <unistd.h> 1331.1Sminoura#include <stdlib.h> 1341.4Sitohy#endif 1351.4Sitohy 1361.4Sitohy#ifdef __GNUC__ 1371.4Sitohy# ifndef alloca 1381.5Sitohy# define alloca(n) __builtin_alloca(n) 1391.4Sitohy# endif 1401.4Sitohy# ifndef strcmp 1411.5Sitohy# define strcmp(p, q) __builtin_strcmp(p, q) 1421.4Sitohy# endif 1431.1Sminoura#endif 144