readufs.h revision 1.12
11.12Schristos/* $NetBSD: readufs.h,v 1.12 2013/06/18 18:18:58 christos Exp $ */ 21.5Sitohy/* from Id: readufs.h,v 1.9 2003/10/15 14:16:58 itohy Exp */ 31.1Sminoura 41.1Sminoura/* 51.10Sitohy * Written in 1999, 2002, 2003 by ITOH Yasufumi. 61.1Sminoura * Public domain. 71.1Sminoura */ 81.1Sminoura 91.4Sitohy#include <sys/types.h> 101.4Sitohy#include <sys/param.h> 111.11Schristos#ifdef USE_LFS 121.11Schristos#include <ufs/lfs/lfs.h> 131.11Schristos#endif 141.4Sitohy#include <ufs/ufs/dinode.h> 151.12Schristos#include <ufs/lfs/lfs.h> 161.1Sminoura#include <ufs/ufs/dir.h> 171.1Sminoura 181.1Sminoura/* 191.4Sitohy * UFS1 / UFS2 201.4Sitohy */ 211.4Sitohyunion ufs_dinode { 221.4Sitohy#ifdef USE_UFS1 231.4Sitohy struct ufs1_dinode di1; 241.4Sitohy#endif 251.4Sitohy#ifdef USE_UFS2 261.4Sitohy struct ufs2_dinode di2; 271.4Sitohy#endif 281.11Schristos#ifdef USE_LFS 291.11Schristos struct ulfs1_dinode dil1; 301.11Schristos struct ulfs2_dinode dil2; 311.11Schristos#endif 321.4Sitohy}; 331.4Sitohy 341.7She/* For more compact code and independence on 64-bit types and ops */ 351.7Shetypedef uint32_t ino32_t; 361.7She 371.4Sitohy/* short-cut for common fields (di_mode, di_nlink) */ 381.4Sitohy#ifdef USE_UFS1 391.4Sitohy# define di_common di1 401.4Sitohy#elif defined USE_UFS2 411.4Sitohy# define di_common di2 421.4Sitohy#endif 431.4Sitohy 441.5Sitohy/* for fields of same names and different locations */ 451.4Sitohy#if !(defined(USE_UFS1) && defined(USE_UFS2)) 461.4Sitohy# ifdef USE_UFS1 471.4Sitohy# define di_thisver di1 481.4Sitohy# endif 491.4Sitohy# ifdef USE_UFS2 501.4Sitohy# define di_thisver di2 511.4Sitohy# endif 521.4Sitohy#endif 531.4Sitohy 541.5Sitohy/* this is a size hack */ 551.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 561.4Sitohy# define DI_SIZE(di) ((di)->di1.di_size) 571.4Sitohy#else 581.4Sitohy# define DI_SIZE(di) ((di)->di_thisver.di_size) 591.4Sitohy#endif 601.5Sitohy/* and may break following fields on UFS2 */ 611.5Sitohy#define di_gid di_gid__is_not_available 621.5Sitohy#define di_blksize di_blksize__is_not_available 631.4Sitohy 641.4Sitohy/* 651.1Sminoura * filesystem information 661.1Sminoura */ 671.1Sminourastruct ufs_info { 681.1Sminoura enum ufs_fstype { 691.1Sminoura UFSTYPE_UNKNOWN 701.1Sminoura#ifdef USE_FFS 711.1Sminoura , UFSTYPE_FFS 721.1Sminoura#endif 731.1Sminoura#ifdef USE_LFS 741.1Sminoura , UFSTYPE_LFS 751.1Sminoura#endif 761.1Sminoura } fstype; 771.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 781.4Sitohy enum ufs_ufstype { 791.4Sitohy UFSTYPE_UFS1, UFSTYPE_UFS2 801.4Sitohy } ufstype; 811.4Sitohy#endif 821.9Sdsl int (*get_inode)(ino32_t ino, union ufs_dinode *dibuf); 831.1Sminoura 841.1Sminoura /* superblock information */ 851.1Sminoura u_int32_t bsize; /* fs block size */ 861.1Sminoura u_int32_t nindir; /* # indirect per block */ 871.1Sminoura u_int32_t fsbtodb; /* block -> sector shift count */ 881.1Sminoura union { 891.1Sminoura#ifdef USE_FFS 901.1Sminoura struct { 911.4Sitohy daddr_t iblkno; /* inode-block offset */ 921.4Sitohy int32_t old_cgoffset; /* cylinder group offset */ 931.4Sitohy int32_t old_cgmask; /* cylinder group mask */ 941.1Sminoura int32_t fragshift; /* block to fragmentation */ 951.1Sminoura int32_t inopb; /* # inodes per block */ 961.1Sminoura int32_t ipg; /* # inodes per group */ 971.1Sminoura int32_t fpg; /* # inodes per group * frag */ 981.4Sitohy int32_t magic; /* FS_UFSx_MAGIC */ 991.1Sminoura } u_ffs; 1001.1Sminoura#endif 1011.1Sminoura#ifdef USE_LFS 1021.1Sminoura struct { 1031.2Sminoura u_int32_t version; /* LFS version # */ 1041.4Sitohy daddr_t idaddr; /* ifile inode disk address */ 1051.2Sminoura u_int32_t inopb; /* inodes per block (v1) */ 1061.2Sminoura /* inodes per frag (v2) */ 1071.1Sminoura u_int32_t ifpb; /* inode addrs / ifile block */ 1081.2Sminoura u_int32_t ioffset; /* start of inode in ifile */ 1091.2Sminoura /* (in sector) */ 1101.2Sminoura u_int32_t ibsize; /* size of inode block */ 1111.1Sminoura } u_lfs; 1121.1Sminoura#endif 1131.1Sminoura } fs_u; 1141.1Sminoura}; 1151.1Sminoura 1161.1Sminouraextern struct ufs_info ufs_info; 1171.1Sminoura#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 1181.1Sminoura 1191.9Sdslvoid RAW_READ(void *buf, daddr_t blkpos, size_t bytelen); 1201.1Sminoura 1211.9Sdslsize_t ufs_read(union ufs_dinode *di, void *buf, unsigned off, 1221.9Sdsl size_t count); 1231.9Sdslino32_t ufs_lookup(ino32_t dirino, const char *fn); 1241.9Sdslino32_t ufs_lookup_path(const char *path); 1251.9Sdslsize_t ufs_load_file(void *buf, ino32_t dirino, const char *fn); 1261.9Sdslint ufs_init(void); 1271.1Sminoura 1281.1Sminoura#ifdef USE_FFS 1291.9Sdslint try_ffs(void); 1301.1Sminoura#endif 1311.1Sminoura 1321.1Sminoura#ifdef USE_LFS 1331.9Sdslint try_lfs(void); 1341.1Sminoura#endif 1351.1Sminoura 1361.1Sminoura#ifdef DEBUG_WITH_STDIO 1371.1Sminoura#include <fcntl.h> 1381.1Sminoura#include <err.h> 1391.1Sminoura#include <stdio.h> 1401.1Sminoura#include <unistd.h> 1411.1Sminoura#include <stdlib.h> 1421.4Sitohy#endif 1431.4Sitohy 1441.4Sitohy#ifdef __GNUC__ 1451.4Sitohy# ifndef alloca 1461.5Sitohy# define alloca(n) __builtin_alloca(n) 1471.4Sitohy# endif 1481.4Sitohy# ifndef strcmp 1491.5Sitohy# define strcmp(p, q) __builtin_strcmp(p, q) 1501.4Sitohy# endif 1511.1Sminoura#endif 152