#ifndef _VNODE_H_
#define _VNODE_H_
#include <sys/appleapiopts.h>
#include <sys/cdefs.h>
#ifdef KERNEL
#include <sys/kernel_types.h>
#include <sys/signal.h>
#endif
enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD, VSTR,
VCPLX };
enum vtagtype {
VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS, VT_LFS, VT_LOFS, VT_FDESC,
VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,
VT_UNION, VT_HFS, VT_VOLFS, VT_DEVFS, VT_WEBDAV, VT_UDF, VT_AFP,
VT_CDDA, VT_CIFS,VT_OTHER};
#define VNODE_READ 0x01
#define VNODE_WRITE 0x02
#define PREALLOCATE 0x00000001
#define ALLOCATECONTIG 0x00000002
#define ALLOCATEALL 0x00000004
#define FREEREMAINDER 0x00000008
#define ALLOCATEFROMPEOF 0x00000010
#define ALLOCATEFROMVOL 0x00000020
#define VNOVAL (-1)
#ifdef KERNEL
#define IO_UNIT 0x0001
#define IO_APPEND 0x0002
#define IO_SYNC 0x0004
#define IO_NODELOCKED 0x0008
#define IO_NDELAY 0x0010
#define IO_NOZEROFILL 0x0020
#define IO_TAILZEROFILL 0x0040
#define IO_HEADZEROFILL 0x0080
#define IO_NOZEROVALID 0x0100
#define IO_NOZERODIRTY 0x0200
#define IO_CLOSE 0x0400
#define IO_NOCACHE 0x0800
#define IO_RAOFF 0x1000
#define IO_DEFWRITE 0x2000
struct componentname {
u_long cn_nameiop;
u_long cn_flags;
#ifdef BSD_KERNEL_PRIVATE
vfs_context_t cn_context;
void * pad_obsolete2;
#define cn_proc (cn_context->vc_proc + 0)
#define cn_cred (cn_context->vc_ucred + 0)
#else
void * obsolete1;
void * obsolete2;
#endif
char *cn_pnbuf;
long cn_pnlen;
char *cn_nameptr;
long cn_namelen;
u_long cn_hash;
long cn_consume;
};
#define LOOKUP 0
#define CREATE 1
#define DELETE 2
#define RENAME 3
#define OPMASK 3
#define FOLLOW 0x0040
#define ISDOTDOT 0x002000
#define MAKEENTRY 0x004000
#define ISLASTCN 0x008000
#define ISWHITEOUT 0x020000
#define DOWHITEOUT 0x040000
struct vnode_fsparam {
struct mount * vnfs_mp;
enum vtype vnfs_vtype;
const char * vnfs_str;
struct vnode * vnfs_dvp;
void * vnfs_fsnode;
int (**vnfs_vops)(void *);
int vnfs_markroot;
int vnfs_marksystem;
dev_t vnfs_rdev;
off_t vnfs_filesize;
struct componentname * vnfs_cnp;
uint32_t vnfs_flags;
};
#define VNFS_NOCACHE 0x01
#define VNFS_CANTCACHE 0x02
#define VNCREATE_FLAVOR 0
#define VCREATESIZE sizeof(struct vnode_fsparam)
#define VATTR_INIT(v) do {(v)->va_supported = (v)->va_active = 0ll; (v)->va_vaflags = 0;} while(0)
#define VATTR_SET_ACTIVE(v, a) ((v)->va_active |= VNODE_ATTR_ ## a)
#define VATTR_SET_SUPPORTED(v, a) ((v)->va_supported |= VNODE_ATTR_ ## a)
#define VATTR_IS_SUPPORTED(v, a) ((v)->va_supported & VNODE_ATTR_ ## a)
#define VATTR_CLEAR_ACTIVE(v, a) ((v)->va_active &= ~VNODE_ATTR_ ## a)
#define VATTR_CLEAR_SUPPORTED(v, a) ((v)->va_supported &= ~VNODE_ATTR_ ## a)
#define VATTR_IS_ACTIVE(v, a) ((v)->va_active & VNODE_ATTR_ ## a)
#define VATTR_ALL_SUPPORTED(v) (((v)->va_active & (v)->va_supported) == (v)->va_active)
#define VATTR_INACTIVE_SUPPORTED(v) do {(v)->va_active &= ~(v)->va_supported; (v)->va_supported = 0;} while(0)
#define VATTR_SET(v, a, x) do { (v)-> a = (x); VATTR_SET_ACTIVE(v, a);} while(0)
#define VATTR_WANTED(v, a) VATTR_SET_ACTIVE(v, a)
#define VATTR_RETURN(v, a, x) do { (v)-> a = (x); VATTR_SET_SUPPORTED(v, a);} while(0)
#define VATTR_NOT_RETURNED(v, a) (VATTR_IS_ACTIVE(v, a) && !VATTR_IS_SUPPORTED(v, a))
#define VATTR_IS(v, a, x) (VATTR_IS_SUPPORTED(v, a) && (v)-> a == (x))
#define VATTR_IS_NOT(v, a, x) (VATTR_IS_SUPPORTED(v, a) && (v)-> a != (x))
#define VNODE_ATTR_va_rdev (1LL<< 0)
#define VNODE_ATTR_va_nlink (1LL<< 1)
#define VNODE_ATTR_va_total_size (1LL<< 2)
#define VNODE_ATTR_va_total_alloc (1LL<< 3)
#define VNODE_ATTR_va_data_size (1LL<< 4)
#define VNODE_ATTR_va_data_alloc (1LL<< 5)
#define VNODE_ATTR_va_iosize (1LL<< 6)
#define VNODE_ATTR_va_uid (1LL<< 7)
#define VNODE_ATTR_va_gid (1LL<< 8)
#define VNODE_ATTR_va_mode (1LL<< 9)
#define VNODE_ATTR_va_flags (1LL<<10)
#define VNODE_ATTR_va_acl (1LL<<11)
#define VNODE_ATTR_va_create_time (1LL<<12)
#define VNODE_ATTR_va_access_time (1LL<<13)
#define VNODE_ATTR_va_modify_time (1LL<<14)
#define VNODE_ATTR_va_change_time (1LL<<15)
#define VNODE_ATTR_va_backup_time (1LL<<16)
#define VNODE_ATTR_va_fileid (1LL<<17)
#define VNODE_ATTR_va_linkid (1LL<<18)
#define VNODE_ATTR_va_parentid (1LL<<19)
#define VNODE_ATTR_va_fsid (1LL<<20)
#define VNODE_ATTR_va_filerev (1LL<<21)
#define VNODE_ATTR_va_gen (1LL<<22)
#define VNODE_ATTR_va_encoding (1LL<<23)
#define VNODE_ATTR_va_type (1LL<<24)
#define VNODE_ATTR_va_name (1LL<<25)
#define VNODE_ATTR_va_uuuid (1LL<<26)
#define VNODE_ATTR_va_guuid (1LL<<27)
#define VNODE_ATTR_va_nchildren (1LL<<28)
#define VNODE_ATTR_BIT(n) (VNODE_ATTR_ ## n)
#define VNODE_ATTR_RDONLY (VNODE_ATTR_BIT(va_rdev) | \
VNODE_ATTR_BIT(va_nlink) | \
VNODE_ATTR_BIT(va_total_size) | \
VNODE_ATTR_BIT(va_total_alloc) | \
VNODE_ATTR_BIT(va_data_alloc) | \
VNODE_ATTR_BIT(va_iosize) | \
VNODE_ATTR_BIT(va_fileid) | \
VNODE_ATTR_BIT(va_linkid) | \
VNODE_ATTR_BIT(va_parentid) | \
VNODE_ATTR_BIT(va_fsid) | \
VNODE_ATTR_BIT(va_filerev) | \
VNODE_ATTR_BIT(va_gen) | \
VNODE_ATTR_BIT(va_name) | \
VNODE_ATTR_BIT(va_type) | \
VNODE_ATTR_BIT(va_nchildren))
#define VNODE_ATTR_NEWOBJ (VNODE_ATTR_BIT(va_rdev) | \
VNODE_ATTR_BIT(va_uid) | \
VNODE_ATTR_BIT(va_gid) | \
VNODE_ATTR_BIT(va_mode) | \
VNODE_ATTR_BIT(va_flags) | \
VNODE_ATTR_BIT(va_acl) | \
VNODE_ATTR_BIT(va_create_time) | \
VNODE_ATTR_BIT(va_modify_time) | \
VNODE_ATTR_BIT(va_change_time) | \
VNODE_ATTR_BIT(va_encoding) | \
VNODE_ATTR_BIT(va_type) | \
VNODE_ATTR_BIT(va_uuuid) | \
VNODE_ATTR_BIT(va_guuid))
struct vnode_attr {
uint64_t va_supported;
uint64_t va_active;
int va_vaflags;
dev_t va_rdev;
uint64_t va_nlink;
uint64_t va_total_size;
uint64_t va_total_alloc;
uint64_t va_data_size;
uint64_t va_data_alloc;
uint32_t va_iosize;
uid_t va_uid;
gid_t va_gid;
mode_t va_mode;
uint32_t va_flags;
struct kauth_acl *va_acl;
struct timespec va_create_time;
struct timespec va_access_time;
struct timespec va_modify_time;
struct timespec va_change_time;
struct timespec va_backup_time;
uint64_t va_fileid;
uint64_t va_linkid;
uint64_t va_parentid;
uint32_t va_fsid;
uint64_t va_filerev;
uint32_t va_gen;
uint32_t va_encoding;
enum vtype va_type;
char * va_name;
guid_t va_uuuid;
guid_t va_guuid;
uint64_t va_nchildren;
};
#define VA_UTIMES_NULL 0x010000
#define VA_EXCLUSIVE 0x020000
#define VSUID 0x800
#define VSGID 0x400
#define VSVTX 0x200
#define VREAD 0x100
#define VWRITE 0x080
#define VEXEC 0x040
extern enum vtype iftovt_tab[];
extern int vttoif_tab[];
#define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12])
#define VTTOIF(indx) (vttoif_tab[(int)(indx)])
#define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode))
#define SKIPSYSTEM 0x0001
#define FORCECLOSE 0x0002
#define WRITECLOSE 0x0004
#define SKIPSWAP 0x0008
#define SKIPROOT 0x0010
#define DOCLOSE 0x0008
#define V_SAVE 0x0001
#define V_SAVEMETA 0x0002
#define REVOKEALL 0x0001
#define VNODE_REMOVE_NODELETEBUSY 0x0001
#define VNODE_READDIR_EXTENDED 0x0001
#define VNODE_READDIR_REQSEEKOFF 0x0002
#define NULLVP ((struct vnode *)NULL)
#define LEASE_READ 0x1
#define LEASE_WRITE 0x2
#ifndef BSD_KERNEL_PRIVATE
struct vnodeop_desc;
#endif
extern int desiredvnodes;
struct vnodeopv_entry_desc {
struct vnodeop_desc *opve_op;
int (*opve_impl)(void *);
};
struct vnodeopv_desc {
int (***opv_desc_vector_p)(void *);
struct vnodeopv_entry_desc *opv_desc_ops;
};
int vn_default_error(void);
struct vnop_generic_args {
struct vnodeop_desc *a_desc;
};
#ifndef _KAUTH_ACTION_T
typedef int kauth_action_t;
# define _KAUTH_ACTION_T
#endif
#include <sys/vnode_if.h>
__BEGIN_DECLS
errno_t vnode_create(int, size_t, void *, vnode_t *);
int vnode_addfsref(vnode_t);
int vnode_removefsref(vnode_t);
int vnode_hasdirtyblks(vnode_t);
int vnode_hascleanblks(vnode_t);
#define VNODE_ASYNC_THROTTLE 18
int vnode_waitforwrites(vnode_t, int, int, int, char *);
void vnode_startwrite(vnode_t);
void vnode_writedone(vnode_t);
enum vtype vnode_vtype(vnode_t);
uint32_t vnode_vid(vnode_t);
mount_t vnode_mountedhere(vnode_t vp);
mount_t vnode_mount(vnode_t);
dev_t vnode_specrdev(vnode_t);
void * vnode_fsnode(vnode_t);
void vnode_clearfsnode(vnode_t);
int vnode_isvroot(vnode_t);
int vnode_issystem(vnode_t);
int vnode_ismount(vnode_t);
int vnode_isreg(vnode_t);
int vnode_isdir(vnode_t);
int vnode_islnk(vnode_t);
int vnode_isfifo(vnode_t);
int vnode_isblk(vnode_t);
int vnode_ischr(vnode_t);
int vnode_ismountedon(vnode_t);
void vnode_setmountedon(vnode_t);
void vnode_clearmountedon(vnode_t);
int vnode_isnocache(vnode_t);
void vnode_setnocache(vnode_t);
void vnode_clearnocache(vnode_t);
int vnode_isnoreadahead(vnode_t);
void vnode_setnoreadahead(vnode_t);
void vnode_clearnoreadahead(vnode_t);
void vnode_settag(vnode_t, int);
int vnode_tag(vnode_t);
int vnode_getattr(vnode_t vp, struct vnode_attr *vap, vfs_context_t ctx);
int vnode_setattr(vnode_t vp, struct vnode_attr *vap, vfs_context_t ctx);
#ifdef BSD_KERNEL_PRIVATE
void vnode_set_hard_link(vnode_t vp);
vnode_t vnode_parent(vnode_t);
void vnode_setparent(vnode_t, vnode_t);
char * vnode_name(vnode_t);
void vnode_setname(vnode_t, char *);
int vnode_isnoflush(vnode_t);
void vnode_setnoflush(vnode_t);
void vnode_clearnoflush(vnode_t);
#endif
uint32_t vnode_vfsmaxsymlen(vnode_t);
int vnode_vfsisrdonly(vnode_t);
int vnode_vfstypenum(vnode_t);
void vnode_vfsname(vnode_t, char *);
int vnode_vfs64bitready(vnode_t);
proc_t vfs_context_proc(vfs_context_t);
ucred_t vfs_context_ucred(vfs_context_t);
int vfs_context_issuser(vfs_context_t);
int vfs_context_pid(vfs_context_t);
int vfs_context_issignal(vfs_context_t, sigset_t);
int vfs_context_suser(vfs_context_t);
int vfs_context_is64bit(vfs_context_t);
vfs_context_t vfs_context_create(vfs_context_t);
int vfs_context_rele(vfs_context_t);
int vflush(struct mount *mp, struct vnode *skipvp, int flags);
int vnode_get(vnode_t);
int vnode_getwithvid(vnode_t, int);
int vnode_put(vnode_t);
int vnode_ref(vnode_t);
void vnode_rele(vnode_t);
int vnode_isinuse(vnode_t, int);
void vnode_lock(vnode_t);
void vnode_unlock(vnode_t);
int vnode_recycle(vnode_t);
void vnode_reclaim(vnode_t);
#define VNODE_UPDATE_PARENT 0x01
#define VNODE_UPDATE_NAME 0x02
#define VNODE_UPDATE_CACHE 0x04
void vnode_update_identity(vnode_t vp, vnode_t dvp, char *name, int name_len, int name_hashval, int flags);
int vn_bwrite(struct vnop_bwrite_args *ap);
int vnode_authorize(vnode_t , vnode_t , kauth_action_t, vfs_context_t);
int vnode_authattr(vnode_t, struct vnode_attr *, kauth_action_t *, vfs_context_t);
int vnode_authattr_new(vnode_t , struct vnode_attr *, int , vfs_context_t);
errno_t vnode_close(vnode_t, int, vfs_context_t);
int vn_getpath(struct vnode *vp, char *pathbuf, int *len);
#define VNODE_LOOKUP_NOFOLLOW 0x01
#define VNODE_LOOKUP_NOCROSSMOUNT 0x02
#define VNODE_LOOKUP_DOWHITEOUT 0x04
errno_t vnode_lookup(const char *, int, vnode_t *, vfs_context_t);
errno_t vnode_open(const char *, int, int, int, vnode_t *, vfs_context_t);
int vnode_iterate(struct mount *, int, int (*)(struct vnode *, void *), void *);
#define VNODE_RELOAD 0x01
#define VNODE_WAIT 0x02
#define VNODE_WRITEABLE 0x04
#define VNODE_WITHID 0x08
#define VNODE_NOLOCK_INTERNAL 0x10
#define VNODE_NODEAD 0x20
#define VNODE_NOSUSPEND 0x40
#define VNODE_ITERATE_ALL 0x80
#define VNODE_ITERATE_ACTIVE 0x100
#define VNODE_ITERATE_INACTIVE 0x200
#define VNODE_RETURNED 0
#define VNODE_RETURNED_DONE 1
#define VNODE_CLAIMED 2
#define VNODE_CLAIMED_DONE 3
struct stat;
int vn_stat(struct vnode *vp, struct stat *sb, kauth_filesec_t *xsec, vfs_context_t ctx);
int vn_stat_noauth(struct vnode *vp, struct stat *sb, kauth_filesec_t *xsec, vfs_context_t ctx);
int vn_revoke(vnode_t vp, int flags, vfs_context_t);
int vaccess(mode_t file_mode, uid_t uid, gid_t gid,
mode_t acc_mode, struct ucred *cred);
int cache_lookup(vnode_t dvp, vnode_t *vpp, struct componentname *cnp);
void cache_enter(vnode_t dvp, vnode_t vp, struct componentname *cnp);
void cache_purge(vnode_t vp);
void cache_purge_negatives(vnode_t vp);
char *vfs_addname(const char *name, size_t len, u_int nc_hash, u_int flags);
int vfs_removename(const char *name);
__END_DECLS
#endif
#endif