#ifndef _SYS_FS_AUTOFS_H
#define _SYS_FS_AUTOFS_H
#include <rpc/clnt.h>
#include <gssapi/gssapi.h>
#include <sys/vfs.h>
#include <sys/dirent.h>
#include <sys/types.h>
#include <sys/types32.h>
#include <sys/note.h>
#include <sys/time_impl.h>
#include <sys/mntent.h>
#include <nfs/mount.h>
#include <rpc/rpcsec_gss.h>
#include <sys/zone.h>
#include <sys/door.h>
#include <rpcsvc/autofs_prot.h>
#ifdef _KERNEL
#include <sys/vfs_opreg.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#ifndef DEBUG
#define AUTOFS_DPRINT(x)
#else
#define AUTOFS_DPRINT(x) auto_dprint x
#endif
typedef struct fninfo {
struct vfs *fi_mountvfs;
struct vnode *fi_rootvp;
struct knetconfig fi_knconf;
struct netbuf fi_addr;
char *fi_path;
char *fi_map;
char *fi_subdir;
char *fi_key;
char *fi_opts;
int fi_pathlen;
int fi_maplen;
int fi_subdirlen;
int fi_keylen;
int fi_optslen;
int fi_refcnt;
int fi_flags;
int fi_mount_to;
int fi_rpc_to;
zoneid_t fi_zoneid;
} fninfo_t;
typedef struct fnnode {
char *fn_name;
char *fn_symlink;
int fn_namelen;
int fn_symlinklen;
uint_t fn_linkcnt;
mode_t fn_mode;
uid_t fn_uid;
gid_t fn_gid;
int fn_error;
ino_t fn_nodeid;
off_t fn_offset;
int fn_flags;
uint_t fn_size;
struct vnode *fn_vnode;
struct fnnode *fn_parent;
struct fnnode *fn_next;
struct fnnode *fn_dirents;
struct fnnode *fn_trigger;
struct action_list *fn_alp;
cred_t *fn_cred;
krwlock_t fn_rwlock;
kmutex_t fn_lock;
timestruc_t fn_atime;
timestruc_t fn_mtime;
timestruc_t fn_ctime;
time_t fn_ref_time;
time_t fn_unmount_ref_time;
kcondvar_t fn_cv_mount;
struct vnode *fn_seen;
kthread_t *fn_thread;
struct autofs_globals *fn_globals;
} fnnode_t;
#define vntofn(vp) ((struct fnnode *)((vp)->v_data))
#define fntovn(fnp) (((fnp)->fn_vnode))
#define vfstofni(vfsp) ((struct fninfo *)((vfsp)->vfs_data))
#define MF_DIRECT 0x001
#define MF_INPROG 0x002
#define MF_WAITING 0x004
#define MF_LOOKUP 0x008
#define MF_ATTR_WAIT 0x010
#define MF_IK_MOUNT 0x040
#define MF_TRIGGER 0x080
#define MF_THISUID_MATCH_RQD 0x100
#define MF_MOUNTPOINT 0x200
#define AUTOFS_MODE 0555
#define AUTOFS_BLOCKSIZE 1024
struct autofs_callargs {
fnnode_t *fnc_fnp;
char *fnc_name;
kthread_t *fnc_origin;
cred_t *fnc_cred;
};
struct autofs_globals {
fnnode_t *fng_rootfnnodep;
int fng_fnnode_count;
int fng_printed_not_running_msg;
kmutex_t fng_unmount_threads_lock;
int fng_unmount_threads;
int fng_verbose;
zoneid_t fng_zoneid;
pid_t fng_autofs_pid;
kmutex_t fng_autofs_daemon_lock;
door_handle_t fng_autofs_daemon_dh;
};
extern kmutex_t autofs_minor_lock;
extern zone_key_t autofs_key;
#define AUTOFS_BLOCK_OTHERS(fnp, operation) { \
ASSERT(MUTEX_HELD(&(fnp)->fn_lock)); \
ASSERT(!((fnp)->fn_flags & operation)); \
(fnp)->fn_flags |= (operation); \
}
#define AUTOFS_UNBLOCK_OTHERS(fnp, operation) { \
auto_unblock_others((fnp), (operation)); \
}
extern struct vnodeops *auto_vnodeops;
extern const struct fs_operation_def auto_vnodeops_template[];
extern int auto_search(fnnode_t *, char *, fnnode_t **, cred_t *);
extern int auto_enter(fnnode_t *, char *, fnnode_t **, cred_t *);
extern void auto_unblock_others(fnnode_t *, uint_t);
extern int auto_wait4mount(fnnode_t *);
extern fnnode_t *auto_makefnnode(vtype_t, vfs_t *, char *, cred_t *,
struct autofs_globals *);
extern void auto_freefnnode(fnnode_t *);
extern void auto_disconnect(fnnode_t *, fnnode_t *);
extern void auto_do_unmount(struct autofs_globals *);
extern void auto_log(int verbose, zoneid_t zoneid, int level,
const char *fmt, ...)
__KPRINTFLIKE(4);
extern void auto_dprint(int level, const char *fmt, ...)
__KPRINTFLIKE(2);
extern int auto_calldaemon(zoneid_t, int, xdrproc_t, void *, xdrproc_t,
void *, int, bool_t);
extern int auto_lookup_aux(fnnode_t *, char *, cred_t *);
extern void auto_new_mount_thread(fnnode_t *, char *, cred_t *);
extern int auto_nobrowse_option(char *);
extern int unmount_subtree(fnnode_t *, boolean_t);
extern void unmount_tree(struct autofs_globals *, boolean_t);
extern void autofs_free_globals(struct autofs_globals *);
extern void autofs_shutdown_zone(struct autofs_globals *);
#endif
#define AUTOFS_NULL 0
#define AUTOFS_MOUNT 1
#define AUTOFS_UNMOUNT 2
#define AUTOFS_READDIR 3
#define AUTOFS_LOOKUP 4
#define AUTOFS_SRVINFO 5
#define AUTOFS_MNTINFO 6
typedef struct {
int cmd;
int xdr_len;
char xdr_arg[1];
} autofs_door_args_t;
typedef struct {
int res_status;
int xdr_len;
char xdr_res[1];
} autofs_door_res_t;
typedef enum autofs_res autofs_res_t;
typedef enum autofs_stat autofs_stat_t;
typedef enum autofs_action autofs_action_t;
typedef struct {
void * atsd_buf;
size_t atsd_len;
} autofs_tsd_t;
typedef struct sec_desdata {
int nd_sec_syncaddr_len;
int nd_sec_knc_semantics;
int nd_sec_netnamelen;
uint64_t nd_sec_knc_rdev;
int nd_sec_knc_unused[8];
} sec_desdata_t;
typedef struct sec_gssdata {
int element_length;
rpc_gss_service_t service;
char uname[MAX_NAME_LEN];
char inst[MAX_NAME_LEN];
char realm[MAX_NAME_LEN];
uint_t qop;
} sec_gssdata_t;
typedef struct nfs_secdata {
sec_desdata_t nfs_des_clntdata;
sec_gssdata_t nfs_gss_clntdata;
} nfs_secdata_t;
#define RESTRICTED_MNTOPTS \
MNTOPT_RESTRICT, MNTOPT_NOSUID, MNTOPT_NOSETUID, MNTOPT_NODEVICES
enum autofssys_op { AUTOFS_UNMOUNTALL, AUTOFS_SETDOOR };
#ifdef _KERNEL
extern int autofssys(enum autofssys_op, uintptr_t);
#endif
#ifdef __cplusplus
}
#endif
#endif