#ifndef _AUTOMOUNT_H
#define _AUTOMOUNT_H
#pragma ident "@(#)automount.h 1.69 05/09/30 SMI"
#include <assert.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <rpc/rpc.h>
#include <netinet/in.h>
#include <mach/mach.h>
#ifdef MALLOC_DEBUG
#include <debug_alloc.h>
#endif
#include "autofs.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _REENTRANT
#define fork1 vfork
#define rpc_control(a, b) 1
#endif
#define AUTOFSADMIN "/etc/autofs.conf"
#define MXHOSTNAMELEN 64
#define MAXNETNAMELEN 255
#define MAXFILENAMELEN (sizeof (((struct dirent *)0)->d_name) - 1)
#define LINESZ 4096
#define MAXOPTSLEN AUTOFS_MAXOPTSLEN
#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 DO_DELAY(delay) { \
(void) sleep(delay); \
delay *= DELAY_BACKOFF; \
if (delay > MAXDELAY) \
delay = MAXDELAY; \
}
struct mapline {
char linebuf[LINESZ];
char lineqbuf[LINESZ];
};
typedef unsigned char uchar_t;
typedef unsigned short ushort_t;
typedef unsigned int uint_t;
typedef unsigned long ulong_t;
typedef uint32_t rpcvers_t;
struct mnttab {
char *mnt_special;
char *mnt_mountp;
char *mnt_fstype;
char *mnt_mntopts;
char *mnt_time;
};
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;
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;
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 rddir_cache {
char *map;
struct off_tbl *offtp;
ulong_t bucket_size;
time_t ttl;
struct dir_entry *entp;
pthread_mutex_t lock;
int in_use;
pthread_rwlock_t rwlock;
int full;
struct rddir_cache *next;
};
#define RDDIR_CACHE_TIME 300
#endif
struct myaddrs {
struct sockaddr_in sin;
struct myaddrs *myaddrs_next;
};
extern time_t timenow;
extern char self[];
extern int verbose;
extern int trace;
extern struct autodir *dir_head;
extern struct autodir *dir_tail;
struct autofs_args;
extern struct myaddrs *myaddrs_head;
extern pthread_rwlock_t cache_lock;
extern pthread_rwlock_t rddir_cache_lock;
extern pthread_mutex_t cleanup_lock;
extern pthread_cond_t cleanup_start_cv;
extern pthread_cond_t cleanup_done_cv;
#define CHECK_STRCPY(a, b, size) \
assert(strlcpy(a, b, (size)) < (size))
#define CHECK_STRCAT(a, b, size) \
assert(strlcat((a), (b), (size)) < (size))
extern void free_mapent(struct mapent *);
#define MNTTYPE_NFS "nfs"
#define MNTTYPE_LOFS "lofs"
extern struct mapent *parse_entry(char *, char *, char *, char *, uint_t,
bool_t *, bool_t, bool_t, int *);
extern int macro_expand(char *, char *, char *, int);
extern void unquote(char *, 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 dirinit(char *, char *, char *, int, char **, char ***);
extern void pr_msg(const char *, ...);
extern void trace_prt(int, char *, ...);
extern void free_action_list_fields(action_list *);
extern int nopt(struct mnttab *, char *, int *);
extern int set_versrange(rpcvers_t, rpcvers_t *, rpcvers_t *);
extern enum clnt_stat pingnfs(char *, rpcvers_t *, rpcvers_t,
ushort_t, char *, char *);
extern int self_check(char *);
extern int host_is_us(const char *, size_t);
extern int we_are_a_server(void);
extern int do_mount1(autofs_pathname, char *, autofs_pathname,
autofs_opts, autofs_pathname, boolean_t, uid_t, mach_port_t,
byte_buffer *, mach_msg_type_number_t *);
extern int
do_check_trigger(autofs_pathname mapname, char *key, autofs_pathname subdir,
autofs_opts mapopts, autofs_pathname path, boolean_t isdirect,
boolean_t *istrigger);
extern int do_lookup1(autofs_pathname, char *, autofs_pathname, autofs_opts,
boolean_t, uid_t, boolean_t *);
extern int do_unmount1(int32_t, int32_t, autofs_pathname, autofs_pathname,
autofs_component, autofs_opts);
extern int do_readdir(autofs_pathname, uint64_t, uint32_t, uint64_t *,
boolean_t *, byte_buffer *, mach_msg_type_number_t *);
extern int nfsunmount(fsid_t *, struct mnttab *);
extern int loopbackmount(char *, char *, char *);
extern int mount_nfs(struct mapent *, char *, char *, boolean_t,
mach_port_t);
extern int mount_autofs(struct mapent *, char *, action_list *,
char *root, char *subdir, char *key);
extern int mount_generic(char *, char *, char *, char *, boolean_t, uid_t,
mach_port_t);
extern enum clnt_stat nfs_cast(struct mapfs *, struct mapfs **, int);
extern bool_t hasrestrictopt(char *);
extern void flush_caches(void);
#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 rddir_cache_lookup(char *, struct 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 ***);
extern int loadmaster_map(char *, char *, char **, char ***);
extern int loaddirect_map(char *, char *, char *, char **, char ***);
#define __NSW_SUCCESS 0
#define __NSW_NOTFOUND 1
#define __NSW_UNAVAIL 2
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_ds(char **, char ***);
extern int getmapent_ds(char *, char *, struct mapline *, char **,
char ***, bool_t *, bool_t);
extern int loadmaster_ds(char *, char *, char **, char ***);
extern int loaddirect_ds(char *, char *, char *, char **, char ***);
extern int getmapkeys_ds(char *, struct dir_entry **, int *, int *,
char **, char ***);
struct fstabnode {
char *fst_dir;
char *fst_vfstype;
char *fst_mntops;
char *fst_url;
struct fstabnode *fst_next;
};
struct staticmap {
char *dir;
char *vfstype;
char *mntops;
char *host;
char *spec;
struct staticmap *next;
};
extern int fstab_process_host(const char *host,
int (*callback)(struct fstabnode *, void *), void *callback_arg);
extern int getfstabkeys(struct dir_entry **list, int *error, int *cache_time);
extern int havefstabkeys(void);
extern int loaddirect_static(char *local_map, char *opts, char **stack,
char ***stkptr);
extern struct staticmap *get_staticmap_entry(const char *dir);
extern void clean_fstab_cache(int scheduled);
extern int getnetmaskbynet(const struct in_addr, struct in_addr *);
extern int __nis_reset_state();
extern int __rpc_negotiate_uid(int);
extern int __rpc_get_local_uid(SVCXPRT *, uid_t *);
#ifdef __cplusplus
}
#endif
#endif