#ifndef _AUTOMOUNT_H
#define _AUTOMOUNT_H
#include <fslib.h>
#include <thread.h>
#include <sys/mntent.h>
#include <synch.h>
#include <sys/types.h>
#include <rpc/rpc.h>
#include <sys/fs/autofs.h>
#include <netinet/in.h>
#include <door.h>
#ifdef MALLOC_DEBUG
#include <debug_alloc.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _REENTRANT
#define fork1 vfork
#define rpc_control(a, b) 1
#endif
#define DOMOUNT_USER 1
#define DOMOUNT_KERNEL 2
#define AUTOFSADMIN "/etc/default/autofs"
#define MXHOSTNAMELEN 64
#define MAXNETNAMELEN 255
#define MAXFILENAMELEN 255
#define LINESZ 4096
#define MAXADDRLEN 128
#define MAXOPTSLEN 1024
#define AUTOFS_MOUNT_TIMEOUT 600
#define AUTOFS_RPC_TIMEOUT 60
#define ERASE 0
#define PUSH 1
#define POP 2
#define INIT 3
#define STACKSIZ 30
#define DIST_SELF 1
#define DIST_MYSUB 2
#define DIST_MYNET 3
#define DIST_OTHER 4
#define MAXIFS 32
#define RET_OK 0
#define RET_RETRY 32
#define RET_ERR 33
#define INITDELAY 5
#define DELAY_BACKOFF 2
#define MAXDELAY 120
#define ARGV_MAX 16
#define VFS_PATH "/usr/lib/fs"
#define DELAY(delay) { \
(void) sleep(delay); \
delay *= DELAY_BACKOFF; \
if (delay > MAXDELAY) \
delay = MAXDELAY; \
}
struct mapline {
char linebuf[LINESZ];
char lineqbuf[LINESZ];
};
struct mapfs {
struct mapfs *mfs_next;
int mfs_ignore;
char *mfs_host;
char *mfs_dir;
int mfs_penalty;
int mfs_distance;
struct nfs_args *mfs_args;
struct netconfig *mfs_nconf;
rpcvers_t mfs_version;
#define MFS_ALLOC_DIR 0x1
#define MFS_URL 0x2
#define MFS_FH_VIA_WEBNFS 0x4
uint_t mfs_flags;
uint_t mfs_port;
};
struct mapent {
char *map_fstype;
char *map_mounter;
char *map_root;
char *map_mntpnt;
char *map_mntopts;
char *map_fsw;
char *map_fswq;
int map_mntlevel;
bool_t map_modified;
bool_t map_faked;
int map_err;
struct mapfs *map_fs;
struct mapent *map_next;
};
struct autodir {
char *dir_name;
char *dir_map;
char *dir_opts;
int dir_direct;
int dir_remount;
struct autodir *dir_next;
struct autodir *dir_prev;
};
struct host_names {
char *host;
int penalty;
};
struct dir_entry {
char *name;
ino_t nodeid;
off_t offset;
struct dir_entry *next;
struct dir_entry *left;
struct dir_entry *right;
};
struct off_tbl {
off_t offset;
struct dir_entry *first;
struct off_tbl *next;
};
#ifndef NO_RDDIR_CACHE
struct autofs_rddir_cache {
char *map;
struct off_tbl *offtp;
ulong_t bucket_size;
time_t ttl;
struct dir_entry *entp;
mutex_t lock;
int in_use;
rwlock_t rwlock;
int full;
struct autofs_rddir_cache *next;
};
#define RDDIR_CACHE_TIME 300
#endif
struct myaddrs {
struct sockaddr_in sin;
struct myaddrs *myaddrs_next;
};
typedef struct command {
char file[MAXPATHLEN];
char argv[ARGV_MAX][MAXOPTSLEN];
char key[MAXOPTSLEN];
int console;
} command_t;
extern int did_exec_map;
extern int did_fork_exec;
extern time_t timenow;
extern char self[];
extern int verbose;
extern int trace;
extern int automountd_nobrowse;
extern struct autodir *dir_head;
extern struct autodir *dir_tail;
extern struct mntlist *current_mounts;
struct mounta;
extern struct myaddrs *myaddrs_head;
extern rwlock_t cache_lock;
extern rwlock_t portmap_cache_lock;
extern rwlock_t autofs_rddir_cache_lock;
extern mutex_t cleanup_lock;
extern cond_t cleanup_start_cv;
extern cond_t cleanup_done_cv;
extern void free_mapent(struct mapent *);
extern struct mntlist *getmntlist(void);
extern dev_t get_devid(struct extmnttab *);
extern struct mapent *parse_entry(char *, char *, char *, struct mapline *,
char *, uint_t, bool_t);
extern int macro_expand(char *, char *, char *, int);
extern void unquote(char *, char *);
extern void unbracket(char **);
extern void trim(char *);
extern char *get_line(FILE *, char *, char *, int);
extern int getword(char *, char *, char **, char **, char, int);
extern int get_retry(char *);
extern int str_opt(struct mnttab *, char *, char **);
extern void put_automountd_env(void);
extern void dirinit(char *, char *, char *, int, char **, char ***);
extern void pr_msg(const char *, ...);
extern void trace_prt(int, char *, ...);
extern void free_autofs_args(autofs_args *);
extern void free_nfs_args(struct nfs_args *);
extern void free_mounta(struct mounta *);
extern int nopt(struct mnttab *, char *, int *);
extern int set_versrange(rpcvers_t, rpcvers_t *, rpcvers_t *);
extern enum clnt_stat pingnfs(char *, int, rpcvers_t *, rpcvers_t,
ushort_t, bool_t, char *, char *);
extern void *autofs_get_buffer(size_t);
extern int self_check(char *);
extern int do_mount1(char *, char *, char *, char *, char *, uint_t, uid_t,
action_list **, int);
extern int do_lookup1(char *, char *, char *, char *, char *, uint_t, uid_t,
autofs_action_t *, struct linka *);
extern int do_unmount1(umntrequest *);
extern int do_readdir(autofs_rddirargs *, autofs_rddirres *);
extern int nfsunmount(struct mnttab *);
extern int loopbackmount(char *, char *, char *, int);
extern int mount_nfs(struct mapent *, char *, char *, int, uid_t,
action_list **);
extern int mount_autofs(struct mapent *, char *, action_list *,
char *rootp, char *subdir, char *key);
extern int mount_generic(char *, char *, char *, char *, int);
extern enum clnt_stat nfs_cast(struct mapfs *, struct mapfs **, int);
extern bool_t hasrestrictopt(char *);
#ifndef NO_RDDIR_CACHE
extern char *auto_rddir_malloc(unsigned);
extern char *auto_rddir_strdup(const char *);
extern struct dir_entry *btree_lookup(struct dir_entry *, char *);
extern void btree_enter(struct dir_entry **, struct dir_entry *);
extern int add_dir_entry(char *, struct dir_entry **, struct dir_entry **);
extern void cache_cleanup(void);
extern int autofs_rddir_cache_lookup(char *, struct autofs_rddir_cache **);
extern struct dir_entry *rddir_entry_lookup(char *, struct dir_entry *);
#endif
extern void ns_setup(char **, char ***);
extern int getmapent(char *, char *, struct mapline *, char **, char ***,
bool_t *, bool_t);
extern int getmapkeys(char *, struct dir_entry **, int *, int *, char **,
char ***, uid_t);
extern int loadmaster_map(char *, char *, char **, char ***);
extern int loaddirect_map(char *, char *, char *, char **, char ***);
extern void init_files(char **, char ***);
extern int getmapent_files(char *, char *, struct mapline *, char **, char ***,
bool_t *, bool_t);
extern int loadmaster_files(char *, char *, char **, char ***);
extern int loaddirect_files(char *, char *, char *, char **, char ***);
extern int getmapkeys_files(char *, struct dir_entry **, int *, int *,
char **, char ***);
extern int stack_op(int, char *, char **, char ***);
extern void init_nis(char **, char ***);
extern int getmapent_nis(char *, char *, struct mapline *, char **, char ***,
bool_t *, bool_t);
extern int loadmaster_nis(char *, char *, char **, char ***);
extern int loaddirect_nis(char *, char *, char *, char **, char ***);
extern int getmapkeys_nis(char *, struct dir_entry **, int *, int *,
char **, char ***);
extern void init_ldap(char **, char ***);
extern int getmapent_ldap(char *, char *, struct mapline *, char **, char ***,
bool_t *, bool_t);
extern int loadmaster_ldap(char *, char *, char **, char ***);
extern int loaddirect_ldap(char *, char *, char *, char **, char ***);
extern int getmapkeys_ldap(char *, struct dir_entry **, int *, int *,
char **, char ***);
extern int __clnt_bindresvport(CLIENT *);
extern int getnetmaskbynet(const struct in_addr, struct in_addr *);
extern int __nis_reset_state();
extern int __rpc_negotiate_uid(int);
void automountd_do_fork_exec(void *, char *, size_t, door_desc_t *, uint_t);
void automountd_do_exec_map(void *, char *, size_t, door_desc_t *, uint_t);
#ifdef __cplusplus
}
#endif
#endif