#ifndef __AUTOFS_KERN_H__
#define __AUTOFS_KERN_H__
#ifdef __APPLE_API_PRIVATE
#include <sys/param.h>
#include <sys/lock.h>
#include <sys/queue.h>
#include <sys/attr.h>
#include <kern/locks.h>
extern lck_grp_t *autofs_lck_grp;
extern lck_mtx_t *autofs_nodeid_lock;
#define M_AUTOFS M_TEMP
#define VT_AUTOFS (VT_OTHER+1)
#ifndef DEBUG
#define AUTOFS_DPRINT(x)
#else
#define AUTOFS_DPRINT(x) auto_dprint x
#ifndef MACH_ASSERT
#define MACH_ASSERT
#endif
#endif
extern int (**autofs_vnodeop_p)(void *);
struct action_list;
typedef struct fninfo {
lck_rw_t *fi_rwlock;
vnode_t fi_rootvp;
char *fi_path;
char *fi_map;
char *fi_subdir;
char *fi_key;
char *fi_opts;
uint32_t fi_mntflags;
int fi_pathlen;
int fi_maplen;
int fi_subdirlen;
int fi_keylen;
int fi_optslen;
int fi_flags;
} fninfo_t;
#define MF_DIRECT 0x001
#define MF_UNMOUNTING 0x002
#define MF_SUBTRIGGER 0x004
struct autofs_dir_node {
struct fnnode *d_dirents;
int d_direntcnt;
};
#define fn_dirents fn_u.d.d_dirents
#define fn_direntcnt fn_u.d.d_direntcnt
struct autofs_symlink_node {
int s_length;
char *s_symlinktarget;
};
#define fn_symlink fn_u.s.s_symlinktarget
#define fn_symlinklen fn_u.s.s_length
typedef struct fnnode {
char *fn_name;
int fn_namelen;
nlink_t fn_linkcnt;
mode_t fn_mode;
uid_t fn_uid;
int fn_error;
ino_t fn_nodeid;
off_t fn_offset;
int fn_flags;
trigger_info_t *fn_trigger_info;
union {
struct autofs_dir_node d;
struct autofs_symlink_node s;
} fn_u;
vnode_t fn_vnode;
uint32_t fn_vid;
struct fnnode *fn_parent;
struct fnnode *fn_next;
lck_rw_t *fn_rwlock;
lck_mtx_t *fn_lock;
struct timeval fn_crtime;
struct timeval fn_atime;
struct timeval fn_mtime;
struct timeval fn_ctime;
struct autofs_globals *fn_globals;
} fnnode_t;
#define vntofn(vp) ((struct fnnode *)(vnode_fsnode(vp)))
#define fntovn(fnp) (((fnp)->fn_vnode))
#define vfstofni(mp) ((fninfo_t *)(vfs_fsprivate(mp)))
#define MF_HOMEDIRMOUNT 0x001
#define AUTOFS_MODE 0555
#define AUTOFS_BLOCKSIZE 1024
struct autofs_globals {
fnnode_t *fng_rootfnnodep;
int fng_fnnode_count;
int fng_printed_not_running_msg;
int fng_verbose;
lck_mtx_t *fng_flush_notification_lock;
int fng_flush_notification_pending;
};
extern struct vnodeops *auto_vnodeops;
extern int auto_root(mount_t, vnode_t *, vfs_context_t);
extern fnnode_t *auto_search(fnnode_t *, char *, int);
extern int auto_enter(fnnode_t *, struct componentname *, fnnode_t **);
extern int auto_wait4unmount_tree(fnnode_t *, vfs_context_t);
extern int auto_makefnnode(fnnode_t **, int, mount_t,
struct componentname *, const char *, vnode_t, int,
struct autofs_globals *);
extern void auto_freefnnode(fnnode_t *);
extern void auto_disconnect(fnnode_t *, fnnode_t *);
extern void auto_dprint(int level, const char *fmt, ...)
__printflike(2, 3);
extern void auto_debug_set(int level);
extern int auto_lookup_aux(struct fninfo *, fnnode_t *, char *, int,
vfs_context_t, int *);
extern int auto_readdir_aux(struct fninfo *, fnnode_t *, off_t, u_int,
int64_t *, boolean_t *, byte_buffer *, mach_msg_type_number_t *);
extern int auto_is_automounter(int);
extern int auto_is_nowait_process(int);
extern int auto_is_notrigger_process(int);
extern int auto_is_homedirmounter_process(vnode_t, int);
extern int auto_mark_vnode_homedirmount(vnode_t, int);
extern int auto_is_autofs(mount_t);
extern int auto_nobrowse(vnode_t);
extern void auto_get_attributes(vnode_t, struct vnode_attr *);
extern int auto_lookup_request(fninfo_t *, char *, int, char *,
vfs_context_t, int *, boolean_t *);
extern void autofs_free_globals(struct autofs_globals *);
extern void auto_fninfo_lock_shared(fninfo_t *fnip, int pid);
extern void auto_fninfo_unlock_shared(fninfo_t *fnip, int pid);
#endif
#endif