2021-10-11 18:37:13 -03:00

184 lines
6.0 KiB
C

/* @(#)hsnode.h 1.1 94/10/31 SMI */
/*
* High Sierra filesystem structure definitions
* Copyright (c) 1989 by Sun Microsystem, Inc.
*/
struct hs_direntry {
u_int ext_lbn; /* LBN of start of extent */
u_int ext_size; /* no. of data bytes in extent */
struct timeval cdate; /* creation date */
enum vtype type; /* file type */
u_short mode; /* mode and type of file (UNIX) */
u_short nlink; /* no. of links to file */
u_short uid; /* owner's user id */
u_short gid; /* owner's group id */
u_int xar_prot :1; /* 1 if protection in XAR */
u_char xar_len; /* no. of Logical blocks in XAR */
u_char intlf_sz; /* intleaving size */
u_char intlf_sk; /* intleaving skip factor */
};
struct ptable {
u_char filler[7]; /* filler */
u_char dname_len; /* length of directory name */
u_char dname[HS_DIR_NAMELEN+1];/* directory name */
};
struct ptable_idx {
struct ptable_idx *idx_pptbl_idx;/* parent's path table index entry */
struct ptable *idx_mptbl; /* path table entry for myself */
u_short idx_nochild; /* no. of childern */
u_short idx_childid; /* directroy no of first child */
};
/* hs_offset, hs_ptbl_idx, base apply to VDIR type only */
struct hsnode {
struct hsnode *hs_hash; /* next hsnode in hash list */
struct hsnode *hs_freef; /* next hsnode in free list */
struct hsnode *hs_freeb; /* previous hsnode in free list */
struct vnode hs_vnode; /* the real vnode for the file */
struct hs_direntry hs_dirent;
/* the directory entry for this file */
u_int hs_dir_lbn; /* LBN of directory entry */
u_int hs_dir_off; /* offset in LBN of directory entry */
struct ptable_idx *hs_ptbl_idx; /* path table index*/
u_int hs_offset; /* start offset in dir for searching */
u_int hs_flags; /* (see below) */
};
struct hsfid {
u_short hf_len; /* length of fid */
u_short hf_dir_off; /* offset in LBN of directory entry */
u_int hf_ext_lbn; /* LBN of data extent */
u_int hf_dir_lbn; /* LBN of directory entry */
};
struct hs_volume {
u_long vol_size; /* no. of Logical blocks in Volume */
u_int lbn_size; /* no. of bytes in a block */
u_int lbn_shift; /* shift to convert lbn to bytes */
u_int lbn_secshift; /* shift to convert lbn to sec */
u_char file_struct_ver;/* version of directory structure */
short vol_uid; /* uid of volume */
short vol_gid; /* gid of volume */
u_short vol_prot; /* protection (mode) of volume */
struct timeval cre_date; /* volume creation time */
struct timeval mod_date; /* volume modification time */
struct hs_direntry root_dir;
/* directory entry for Root Directory */
u_short ptbl_len; /* number of bytes in Path Table */
u_int ptbl_lbn; /* logical block no of Path Table */
u_short vol_set_size; /* number of CD in this vol set */
u_short vol_set_seq; /* the sequence number of this CD */
};
/*
* hsnode incore table
*
*/
#define HS_HASHSIZE 32 /* hsnode hash table size */
#ifdef i386 || sun4c
#define HS_HSTABLESIZE 4 * PAGESIZE /* hsnode incore table size */
#else
#define HS_HSTABLESIZE 2 * PAGESIZE /* hsnode incore table size */
#endif
struct hstable {
struct vfs *hs_vfsp; /* point back to vfs */
int hs_tablesize; /* size of the hstable */
struct hsnode *hshash[HS_HASHSIZE]; /* head of hash lists */
struct hsnode *hsfree_f; /* first entry of free list */
struct hsnode *hsfree_b; /* last entry of free list */
int hs_refct; /* no. of active hsnode */
int hs_nohsnode; /* no. of hsnode in table */
struct hsnode hs_node[1]; /* should be much more */
};
/*
* High Sierra filesystem structure.
* There is one of these for each mounted High Sierra filesystem.
*/
enum hs_vol_type {
HS_VOL_TYPE_HS = 0, HS_VOL_TYPE_ISO = 1,
HS_VOL_TYPE_UNIX = 2
};
struct hsfs {
struct hsfs *hsfs_next; /* ptr to next entry in linked list */
struct vfs *hsfs_vfs; /* vfs for this fs */
struct vnode *hsfs_rootvp; /* vnode for root of filesystem */
struct vnode *hsfs_devvp; /* device mounted on */
enum hs_vol_type hsfs_vol_type; /* 0 hsfs 1 iso 2 hsfs+sun 3 iso+sun */
struct hs_volume hsfs_vol; /* File Structure Volume Descriptor */
struct ptable* hsfs_ptbl; /* pointer to incore Path Table */
int hsfs_ptbl_size; /* size of incore path table */
struct ptable_idx *hsfs_ptbl_idx;/* pointer to path table index */
int hsfs_ptbl_idx_size; /* no. of path table index */
int hsfs_flags; /* flags */
struct hstable *hsfs_hstbl; /* pointer to incore hsnode table */
};
/*
* flags in hsfs_flags field
*/
#define HSFS_FATMOD 0x01 /* fat has been modified */
#define HSFS_LOCKED 0x02 /* fs is locked */
#define HSFS_WANTED 0x04 /* locked fs is wanted */
/*
* File system parameter macros
*/
#define hs_blksize(HSFS, HSP, OFF) /* file system block size */ \
((HSP)->hs_vn.v_flag & VROOT? \
((OFF) >= \
((HSFS)->hsfs_rdirsec & ~((HSFS)->hsfs_spcl - 1)) * HS_SECSIZE? \
((HSFS)->hsfs_rdirsec & ((HSFS)->hsfs_spcl - 1)) * HS_SECSIZE: \
(HSFS)->hsfs_clsize): \
(HSFS)->hsfs_clsize)
#define hs_blkoff(OFF) /* offset within block */ \
((OFF) & (HS_SECSIZE - 1))
/*
* Conversion macros
*/
#define VFS_TO_HSFS(VFSP) ((struct hsfs *)(VFSP)->vfs_data)
#define HSFS_TO_VFS(FSP) ((FSP)->hsfs_vfs)
#define VTOH(VP) ((struct hsnode *)(VP)->v_data)
#define HTOV(HP) (&((HP)->hs_vnode))
/*
* Convert between Logical Block Number and Sector Number.
*/
#define LBN_TO_SEC(lbn, vfsp) ((lbn)>>((struct hsfs *)((vfsp)->vfs_data))-> \
hsfs_vol.lbn_secshift)
#define SEC_TO_LBN(sec, vfsp) ((sec)<<((struct hsfs *)((vfsp)->vfs_data))-> \
hsfs_vol.lbn_secshift)
#define LBN_TO_BYTE(lbn, vfsp) ((lbn)<<((struct hsfs *)((vfsp)->vfs_data))-> \
hsfs_vol.lbn_shift)
/*
* lock and unlock macros
*/
#define HS_LOCKFS(HSFS) { \
while ((HSFS)->hsfs_flags & HSFS_LOCKED) { \
(HSFS)->hsfs_flags |= HSFS_WANTED; \
(void) sleep((caddr_t)(HSFS), PRIBIO); \
} \
(HSFS)->hsfs_flags |= HSFS_LOCKED; \
}
#define HS_UNLOCKFS(HSFS) { \
(HSFS)->hsfs_flags &= ~HSFS_LOCKED; \
if ((HSFS)->hsfs_flags & HSFS_WANTED) { \
(HSFS)->hsfs_flags &= ~HSFS_WANTED; \
wakeup((caddr_t)(HSFS)); \
} \
}