readufs.h revision 1.11
11.11Schristos/* $NetBSD: readufs.h,v 1.11 2013/06/15 01:37:10 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.1Sminoura#include <ufs/ufs/dir.h> 161.1Sminoura 171.1Sminoura/* 181.4Sitohy * UFS1 / UFS2 191.4Sitohy */ 201.4Sitohyunion ufs_dinode { 211.4Sitohy#ifdef USE_UFS1 221.4Sitohy struct ufs1_dinode di1; 231.4Sitohy#endif 241.4Sitohy#ifdef USE_UFS2 251.4Sitohy struct ufs2_dinode di2; 261.4Sitohy#endif 271.11Schristos#ifdef USE_LFS 281.11Schristos struct ulfs1_dinode dil1; 291.11Schristos struct ulfs2_dinode dil2; 301.11Schristos#endif 311.4Sitohy}; 321.4Sitohy 331.7She/* For more compact code and independence on 64-bit types and ops */ 341.7Shetypedef uint32_t ino32_t; 351.7She 361.4Sitohy/* short-cut for common fields (di_mode, di_nlink) */ 371.4Sitohy#ifdef USE_UFS1 381.4Sitohy# define di_common di1 391.4Sitohy#elif defined USE_UFS2 401.4Sitohy# define di_common di2 411.4Sitohy#endif 421.4Sitohy 431.5Sitohy/* for fields of same names and different locations */ 441.4Sitohy#if !(defined(USE_UFS1) && defined(USE_UFS2)) 451.4Sitohy# ifdef USE_UFS1 461.4Sitohy# define di_thisver di1 471.4Sitohy# endif 481.4Sitohy# ifdef USE_UFS2 491.4Sitohy# define di_thisver di2 501.4Sitohy# endif 511.4Sitohy#endif 521.4Sitohy 531.5Sitohy/* this is a size hack */ 541.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 551.4Sitohy# define DI_SIZE(di) ((di)->di1.di_size) 561.4Sitohy#else 571.4Sitohy# define DI_SIZE(di) ((di)->di_thisver.di_size) 581.4Sitohy#endif 591.5Sitohy/* and may break following fields on UFS2 */ 601.5Sitohy#define di_gid di_gid__is_not_available 611.5Sitohy#define di_blksize di_blksize__is_not_available 621.4Sitohy 631.4Sitohy/* 641.1Sminoura * filesystem information 651.1Sminoura */ 661.1Sminourastruct ufs_info { 671.1Sminoura enum ufs_fstype { 681.1Sminoura UFSTYPE_UNKNOWN 691.1Sminoura#ifdef USE_FFS 701.1Sminoura , UFSTYPE_FFS 711.1Sminoura#endif 721.1Sminoura#ifdef USE_LFS 731.1Sminoura , UFSTYPE_LFS 741.1Sminoura#endif 751.1Sminoura } fstype; 761.4Sitohy#if defined(USE_UFS1) && defined(USE_UFS2) 771.4Sitohy enum ufs_ufstype { 781.4Sitohy UFSTYPE_UFS1, UFSTYPE_UFS2 791.4Sitohy } ufstype; 801.4Sitohy#endif 811.9Sdsl int (*get_inode)(ino32_t ino, union ufs_dinode *dibuf); 821.1Sminoura 831.1Sminoura /* superblock information */ 841.1Sminoura u_int32_t bsize; /* fs block size */ 851.1Sminoura u_int32_t nindir; /* # indirect per block */ 861.1Sminoura u_int32_t fsbtodb; /* block -> sector shift count */ 871.1Sminoura union { 881.1Sminoura#ifdef USE_FFS 891.1Sminoura struct { 901.4Sitohy daddr_t iblkno; /* inode-block offset */ 911.4Sitohy int32_t old_cgoffset; /* cylinder group offset */ 921.4Sitohy int32_t old_cgmask; /* cylinder group mask */ 931.1Sminoura int32_t fragshift; /* block to fragmentation */ 941.1Sminoura int32_t inopb; /* # inodes per block */ 951.1Sminoura int32_t ipg; /* # inodes per group */ 961.1Sminoura int32_t fpg; /* # inodes per group * frag */ 971.4Sitohy int32_t magic; /* FS_UFSx_MAGIC */ 981.1Sminoura } u_ffs; 991.1Sminoura#endif 1001.1Sminoura#ifdef USE_LFS 1011.1Sminoura struct { 1021.2Sminoura u_int32_t version; /* LFS version # */ 1031.4Sitohy daddr_t idaddr; /* ifile inode disk address */ 1041.2Sminoura u_int32_t inopb; /* inodes per block (v1) */ 1051.2Sminoura /* inodes per frag (v2) */ 1061.1Sminoura u_int32_t ifpb; /* inode addrs / ifile block */ 1071.2Sminoura u_int32_t ioffset; /* start of inode in ifile */ 1081.2Sminoura /* (in sector) */ 1091.2Sminoura u_int32_t ibsize; /* size of inode block */ 1101.1Sminoura } u_lfs; 1111.1Sminoura#endif 1121.1Sminoura } fs_u; 1131.1Sminoura}; 1141.1Sminoura 1151.1Sminouraextern struct ufs_info ufs_info; 1161.1Sminoura#define ufs_get_inode(ino, di) ((*ufs_info.get_inode)((ino), (di))) 1171.1Sminoura 1181.9Sdslvoid RAW_READ(void *buf, daddr_t blkpos, size_t bytelen); 1191.1Sminoura 1201.9Sdslsize_t ufs_read(union ufs_dinode *di, void *buf, unsigned off, 1211.9Sdsl size_t count); 1221.9Sdslino32_t ufs_lookup(ino32_t dirino, const char *fn); 1231.9Sdslino32_t ufs_lookup_path(const char *path); 1241.9Sdslsize_t ufs_load_file(void *buf, ino32_t dirino, const char *fn); 1251.9Sdslint ufs_init(void); 1261.1Sminoura 1271.1Sminoura#ifdef USE_FFS 1281.9Sdslint try_ffs(void); 1291.1Sminoura#endif 1301.1Sminoura 1311.1Sminoura#ifdef USE_LFS 1321.9Sdslint try_lfs(void); 1331.1Sminoura#endif 1341.1Sminoura 1351.1Sminoura#ifdef DEBUG_WITH_STDIO 1361.1Sminoura#include <fcntl.h> 1371.1Sminoura#include <err.h> 1381.1Sminoura#include <stdio.h> 1391.1Sminoura#include <unistd.h> 1401.1Sminoura#include <stdlib.h> 1411.4Sitohy#endif 1421.4Sitohy 1431.4Sitohy#ifdef __GNUC__ 1441.4Sitohy# ifndef alloca 1451.5Sitohy# define alloca(n) __builtin_alloca(n) 1461.4Sitohy# endif 1471.4Sitohy# ifndef strcmp 1481.5Sitohy# define strcmp(p, q) __builtin_strcmp(p, q) 1491.4Sitohy# endif 1501.1Sminoura#endif 151