xref: /csrg-svn/usr.sbin/amd/include/am.h (revision 61795)
144922Smckusick /*
244922Smckusick  * Copyright (c) 1990 Jan-Simon Pendry
344922Smckusick  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
4*61795Sbostic  * Copyright (c) 1990, 1993
5*61795Sbostic  *	The Regents of the University of California.  All rights reserved.
644922Smckusick  *
744922Smckusick  * This code is derived from software contributed to Berkeley by
844922Smckusick  * Jan-Simon Pendry at Imperial College, London.
944922Smckusick  *
1044922Smckusick  * %sccs.include.redist.c%
1144922Smckusick  *
12*61795Sbostic  *	@(#)am.h	5.6 (Berkeley) 06/06/93
1349688Spendry  *
1452456Spendry  * $Id: am.h,v 5.2.2.1 1992/02/09 15:09:54 jsp beta $
1549688Spendry  *
1644922Smckusick  */
1744922Smckusick 
1847527Spendry #include "config.h"
1944922Smckusick 
2044922Smckusick /*
2144922Smckusick  * Global declarations
2244922Smckusick  */
2344922Smckusick #include <sys/param.h>
2444922Smckusick #include <sys/socket.h>
2544922Smckusick #include <rpc/rpc.h>
2644922Smckusick #include "nfs_prot.h"
2744922Smckusick #ifdef MNTENT_HDR
2844922Smckusick #include MNTENT_HDR
2944922Smckusick #endif /* MNTENT_HDR */
3044922Smckusick #include <assert.h>
3144922Smckusick 
3244922Smckusick #ifdef DEBUG_MEM
3344922Smckusick #include <malloc.h>
3444922Smckusick #endif /* DEBUG_MEM */
3544922Smckusick 
3644922Smckusick #ifndef MAXHOSTNAMELEN
3744922Smckusick #define MAXHOSTNAMELEN 64
3844922Smckusick #endif /* MAXHOSTNAMELEN */
3944922Smckusick 
4044922Smckusick #ifndef MNTTYPE_AUTO
4144922Smckusick #define MNTTYPE_AUTO "auto"
4244922Smckusick #endif /* MNTTYPE_AUTO */
4344922Smckusick 
4444922Smckusick #ifndef FALSE
4544922Smckusick #define FALSE 0
4644922Smckusick #define TRUE 1
4744922Smckusick #endif /* FALSE */
4844922Smckusick 
4944922Smckusick #ifndef ROOT_MAP
5044922Smckusick #define	ROOT_MAP "\"root\""
5144922Smckusick #endif /* ROOT_MAP */
5244922Smckusick 
5344922Smckusick /*
5444922Smckusick  * Flags from command line
5544922Smckusick  */
5644922Smckusick extern int print_pid;		/* Print pid to stdout */
5744922Smckusick extern int normalize_hosts;	/* Normalize host names before use */
5844922Smckusick extern int restart_existing_mounts;
5944922Smckusick #ifdef HAS_NIS_MAPS
6044922Smckusick extern char *domain;		/* NIS domain to use */
6144922Smckusick #endif /* HAS_NIS_MAPS */
6244922Smckusick extern int am_timeo;		/* Cache period */
6344922Smckusick extern int afs_timeo;		/* AFS timeout */
6444922Smckusick extern int afs_retrans;		/* AFS retrans */
6544922Smckusick extern int am_timeo_w;		/* Unmount timeout */
6644922Smckusick extern char *mtab;		/* Mount table */
6744922Smckusick 
6844922Smckusick typedef enum {
6944922Smckusick 	Start,
7044922Smckusick 	Run,
7144922Smckusick 	Finishing,
7244922Smckusick 	Quit,
7344922Smckusick 	Done
7444922Smckusick } serv_state;
7544922Smckusick 
7644922Smckusick extern serv_state amd_state;	/* Should we go now */
7744922Smckusick extern int immediate_abort;	/* Should close-down unmounts be retried */
7844922Smckusick extern time_t do_mapc_reload;	/* Flush & reload mount map cache */
7944922Smckusick 
8044922Smckusick /*
8144922Smckusick  * Useful constants
8244922Smckusick  */
8344922Smckusick extern char pid_fsname[];	/* kiska.southseas.nz:(pid%d) */
8444922Smckusick extern char hostd[];		/* "kiska.southseas.nz" */
8544922Smckusick extern char *hostdomain;	/* "southseas.nz" */
8644922Smckusick extern char *op_sys;		/* "sos4" */
8744922Smckusick extern char *arch;		/* "sun4" */
8844922Smckusick extern char *karch;		/* "sun4c" */
8944922Smckusick extern char *cluster;		/* "r+d-kluster" */
9044922Smckusick extern char *endian;		/* "big" */
9144922Smckusick extern char *auto_dir;		/* "/a" */
9247527Spendry extern char copyright[];	/* Copyright info */
9344922Smckusick extern char version[];		/* Version info */
9444922Smckusick 
9544922Smckusick typedef struct am_ops am_ops;
9644922Smckusick typedef struct am_node am_node;
9744922Smckusick typedef struct am_opts am_opts;
9844922Smckusick typedef struct mntfs mntfs;
9944922Smckusick typedef struct fserver fserver;
10044922Smckusick typedef struct fsrvinfo fsrvinfo;
10144922Smckusick 
10244922Smckusick /*
10347527Spendry  * Debug defns.
10447527Spendry  */
10547527Spendry #ifdef DEBUG
10647527Spendry #define	DEBUG_MTAB	"./mtab"
10747527Spendry 
10847527Spendry extern int debug_flags;		/* Debug options */
10947527Spendry 
11047527Spendry #define	D_DAEMON	0x0001	/* Enter daemon mode */
11147527Spendry #define	D_TRACE		0x0002	/* Do protocol trace */
11247527Spendry #define	D_FULL		0x0004	/* Do full trace */
11347527Spendry #define	D_MTAB		0x0008	/* Use local mtab */
11447527Spendry #define	D_AMQ		0x0010	/* Register amq program */
11547527Spendry #define	D_STR		0x0020	/* Debug string munging */
11647527Spendry #define	D_MEM		0x0040	/* Trace memory allocations */
11747527Spendry 
11847527Spendry /*
11947527Spendry  * Normally, don't enter daemon mode, and don't register amq
12047527Spendry  */
12147527Spendry #define	D_TEST	(~(D_DAEMON|D_MEM|D_STR))
12247527Spendry #endif /* DEBUG */
12347527Spendry 
12447527Spendry /*
12544922Smckusick  * Global variables.
12644922Smckusick  */
12744922Smckusick extern unsigned short nfs_port;	/* Our NFS service port */
12844922Smckusick extern struct in_addr myipaddr;	/* (An) IP address of this host */
12944922Smckusick 
13044922Smckusick extern int foreground;		/* Foreground process */
13144922Smckusick extern time_t next_softclock;	/* Time to call softclock() */
13244922Smckusick extern int task_notify_todo;	/* Task notifier needs running */
13344922Smckusick #ifdef HAS_TFS
13444922Smckusick extern int nfs_server_code_available;
13544922Smckusick #endif /* HAS_TFS */
13644922Smckusick extern int last_used_map;	/* Last map being used for mounts */
13744922Smckusick extern AUTH *nfs_auth;		/* Dummy uthorisation for remote servers */
13847527Spendry extern am_node **exported_ap;	/* List of nodes */
13944922Smckusick extern int first_free_map;	/* First free node */
14047527Spendry extern am_node *root_node;	/* Node for "root" */
14147527Spendry extern char *wire;		/* Name of primary connected network */
14247527Spendry #define	NEXP_AP	(254)
14347527Spendry #define NEXP_AP_MARGIN (128)
14444922Smckusick 
14544922Smckusick typedef int (*task_fun)P((voidp));
14644922Smckusick typedef void (*cb_fun)P((int, int, voidp));
14744922Smckusick typedef void (*fwd_fun)P((voidp, int, struct sockaddr_in *,
14844922Smckusick 				struct sockaddr_in *, voidp, int));
14944922Smckusick 
15044922Smckusick /*
15144922Smckusick  * String comparison macros
15244922Smckusick  */
15344922Smckusick #define STREQ(s1, s2) (strcmp((s1), (s2)) == 0)
15444922Smckusick #define FSTREQ(s1, s2) ((*(s1) == *(s2)) && STREQ((s1),(s2)))
15544922Smckusick 
15644922Smckusick /*
15744922Smckusick  * Linked list
15844922Smckusick  */
15944922Smckusick typedef struct qelem qelem;
16044922Smckusick struct qelem {
16144922Smckusick 	qelem *q_forw;
16244922Smckusick 	qelem *q_back;
16344922Smckusick };
16444922Smckusick #define	FIRST(ty, q)	((ty *) ((q)->q_forw))
16544922Smckusick #define	LAST(ty, q)	((ty *) ((q)->q_back))
16644922Smckusick #define	NEXT(ty, q)	((ty *) (((qelem *) q)->q_forw))
16744922Smckusick #define	PREV(ty, q)	((ty *) (((qelem *) q)->q_back))
16844922Smckusick #define	HEAD(ty, q)	((ty *) q)
16944922Smckusick #define	ITER(v, ty, q) \
17044922Smckusick 	for ((v) = FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
17144922Smckusick 
17244922Smckusick /*
17344922Smckusick  * List of mount table entries
17444922Smckusick  */
17544922Smckusick typedef struct mntlist mntlist;
17644922Smckusick struct mntlist {
17744922Smckusick 	struct mntlist *mnext;
17844922Smckusick 	struct mntent *mnt;
17944922Smckusick };
18044922Smckusick 
18144922Smckusick /*
18244922Smckusick  * Mount map
18344922Smckusick  */
18444922Smckusick typedef struct mnt_map mnt_map;
18544922Smckusick 
18644922Smckusick /*
18744922Smckusick  * Global routines
18844922Smckusick  */
18947527Spendry extern int atoi P((Const char *)); /* C */
19044922Smckusick extern void am_mounted P((am_node*));
19144922Smckusick extern void am_unmounted P((am_node*));
19244922Smckusick extern int background(P_void);
19344922Smckusick extern int bind_resv_port P((int, unsigned short*));
19444922Smckusick extern int compute_mount_flags P((struct mntent *));
19544922Smckusick extern int softclock(P_void);
19644922Smckusick #ifdef DEBUG
19744922Smckusick extern int debug_option P((char*));
19844922Smckusick #endif /* DEBUG */
19947527Spendry extern void deslashify P((char*));
20044922Smckusick /*extern void domain_strip P((char*, char*));*/
20144922Smckusick extern mntfs* dup_mntfs P((mntfs*));
20244922Smckusick extern fserver* dup_srvr P((fserver*));
20344922Smckusick extern int eval_fs_opts P((am_opts*, char*, char*, char*, char*, char*));
20444922Smckusick extern char* expand_key P((char*));
20544922Smckusick extern am_node* exported_ap_alloc(P_void);
20644922Smckusick extern am_node* find_ap P((char*));
20747527Spendry extern am_node* find_mf P((mntfs*));
20852456Spendry extern mntfs* find_mntfs P((am_ops*, am_opts*, char*, char*, char*, char*, char*));
20944922Smckusick extern void flush_mntfs(P_void);
21047527Spendry extern void flush_nfs_fhandle_cache P((fserver*));
21147527Spendry extern void forcibly_timeout_mp P((am_node*));
21244922Smckusick extern FREE_RETURN_TYPE free P((voidp)); /* C */
21344922Smckusick extern void free_mntfs P((mntfs*));
21444922Smckusick extern void free_opts P((am_opts*));
21544922Smckusick extern void free_map P((am_node*));
21644922Smckusick extern void free_mntlist P((mntlist*));
21747527Spendry extern void free_srvr P((fserver*));
21844922Smckusick extern int fwd_init(P_void);
21944922Smckusick extern int fwd_packet P((int, voidp, int, struct sockaddr_in *,
22044922Smckusick 		struct sockaddr_in *, voidp, fwd_fun));
22144922Smckusick extern void fwd_reply(P_void);
22244922Smckusick extern void get_args P((int, char*[]));
22347527Spendry extern char *getwire P((void));
22444922Smckusick #ifdef NEED_MNTOPT_PARSER
22544922Smckusick extern char *hasmntopt P((struct mntent*, char*));
22644922Smckusick #endif /* NEED_MNTOPT_PARSER */
22744922Smckusick extern int hasmntval P((struct mntent*, char*));
22844922Smckusick extern void host_normalize P((char **));
22947527Spendry extern char *inet_dquad P((char*, unsigned long));
23044922Smckusick extern void init_map P((am_node*, char*));
23144922Smckusick extern void insert_am P((am_node*, am_node*));
23244922Smckusick extern void ins_que P((qelem*, qelem*));
23352456Spendry extern int islocalnet P((unsigned long));
23449688Spendry extern int make_nfs_auth P((void));
23544922Smckusick extern void make_root_node(P_void);
23644922Smckusick extern int make_rpc_packet P((char*, int, u_long, struct rpc_msg*, voidp, xdrproc_t, AUTH*));
23749688Spendry extern void map_flush_srvr P((fserver*));
23844922Smckusick extern void mapc_add_kv P((mnt_map*, char*, char*));
23944922Smckusick extern mnt_map* mapc_find P((char*, char*));
24044922Smckusick extern void mapc_free P((mnt_map*));
24147527Spendry extern int mapc_keyiter P((mnt_map*, void (*)(char*,voidp), voidp));
24244922Smckusick extern int mapc_search P((mnt_map*, char*, char**));
24344922Smckusick extern void mapc_reload(P_void);
24444922Smckusick extern void mapc_showtypes P((FILE*));
24544922Smckusick extern int mkdirs P((char*, int));
24647527Spendry extern void mk_fattr P((am_node*, enum ftype));
24744922Smckusick extern void mnt_free P((struct mntent*));
24847527Spendry extern int mount_auto_node P((char*, voidp));
24944922Smckusick extern int mount_automounter P((int));
25044922Smckusick extern int mount_exported(P_void);
25147527Spendry extern int mount_fs P((struct mntent*, int, caddr_t, int, MTYPE_TYPE));
25252456Spendry /*extern int mount_nfs_fh P((struct fhstatus*, char*, char*, char*, mntfs*));*/
25344922Smckusick extern int mount_node P((am_node*));
25444922Smckusick extern mntfs* new_mntfs(P_void);
25544922Smckusick extern void new_ttl P((am_node*));
25644922Smckusick extern am_node* next_map P((int*));
25744922Smckusick extern int nfs_srvr_port P((fserver*, u_short*, voidp));
25847527Spendry extern void normalize_slash P((char*));
25947527Spendry extern void ops_showfstypes P((FILE*));
26044922Smckusick extern int pickup_rpc_reply P((voidp, int, voidp, xdrproc_t));
26144922Smckusick extern mntlist* read_mtab P((char*));
26252456Spendry extern mntfs* realloc_mntfs  P((mntfs*, am_ops*, am_opts*, char*, char*, char*, char*, char*));
26344922Smckusick extern void rem_que P((qelem*));
26444922Smckusick extern void reschedule_timeout_mp(P_void);
26544922Smckusick extern void restart(P_void);
26644922Smckusick #ifdef UPDATE_MTAB
26744922Smckusick extern void rewrite_mtab P((mntlist *));
26844922Smckusick #endif /* UPDATE_MTAB */
26944922Smckusick extern void rmdirs P((char*));
27044922Smckusick extern am_node* root_ap P((char*, int));
27147527Spendry extern int root_keyiter P((void (*)(char*,voidp), voidp));
27244922Smckusick extern void root_newmap P((char*, char*, char*));
27344922Smckusick extern void rpc_msg_init P((struct rpc_msg*, u_long, u_long, u_long));
27444922Smckusick extern void run_task P((task_fun, voidp, cb_fun, voidp));
27544922Smckusick extern void sched_task P((cb_fun, voidp, voidp));
27647527Spendry extern void show_rcs_info P((Const char*, char*));
27744922Smckusick extern void sigchld P((int));
27844922Smckusick extern void srvrlog P((fserver*, char*));
27944922Smckusick extern char* str3cat P((char*, char*, char*, char*));
28047527Spendry extern char* strcat P((char*, Const char*)); /* C */
28147527Spendry extern int strcmp P((Const char*, Const char*)); /* C */
28247527Spendry extern char* strdup P((Const char*));
28347527Spendry extern int strlen P((Const char*)); /* C */
28447527Spendry extern char* strnsave P((Const char*, int));
28547527Spendry extern char* strrchr P((Const char*, int)); /* C */
28644922Smckusick extern char* strealloc P((char*, char *));
28747527Spendry extern char** strsplit P((char*, int, int));
28844922Smckusick extern int switch_option P((char*));
28947527Spendry extern int switch_to_logfile P((char*));
29047527Spendry extern void do_task_notify(P_void);
29144922Smckusick extern int timeout P((unsigned int, void (*fn)(), voidp));
29244922Smckusick extern void timeout_mp(P_void);
29344922Smckusick extern void umount_exported(P_void);
29447527Spendry extern int umount_fs P((char*));
29544922Smckusick /*extern int unmount_node P((am_node*));
29644922Smckusick extern int unmount_node_wrap P((voidp));*/
29744922Smckusick extern void unregister_amq(P_void);
29844922Smckusick extern void untimeout P((int));
29944922Smckusick extern int valid_key P((char*));
30044922Smckusick extern void wakeup P((voidp));
30144922Smckusick extern void wakeup_task P((int,int,voidp));
30244922Smckusick extern void wakeup_srvr P((fserver*));
30344922Smckusick extern void write_mntent P((struct mntent*));
30447527Spendry #ifdef UPDATE_MTAB
30547527Spendry extern void unlock_mntlist P((void));
30647527Spendry #else
30747527Spendry #define	unlock_mntlist()
30847527Spendry #endif /* UPDATE_MTAB */
30944922Smckusick 
31047527Spendry 
31144922Smckusick #define	ALLOC(ty)	((struct ty *) xmalloc(sizeof(struct ty)))
31244922Smckusick 
31344922Smckusick /*
31444922Smckusick  * Options
31544922Smckusick  */
31644922Smckusick struct am_opts {
31744922Smckusick 	char	*fs_glob;		/* Smashed copy of global options */
31844922Smckusick 	char	*fs_local;		/* Expanded copy of local options */
31944922Smckusick 	char	*fs_mtab;		/* Mount table entry */
32044922Smckusick 	/* Other options ... */
32144922Smckusick 	char	*opt_dev;
32244922Smckusick 	char	*opt_delay;
32344922Smckusick 	char	*opt_dir;
32444922Smckusick 	char	*opt_fs;
32544922Smckusick 	char	*opt_group;
32644922Smckusick 	char	*opt_mount;
32744922Smckusick 	char	*opt_opts;
32852456Spendry 	char	*opt_remopts;
32944922Smckusick 	char	*opt_pref;
33044922Smckusick 	char	*opt_cache;
33144922Smckusick 	char	*opt_rfs;
33244922Smckusick 	char	*opt_rhost;
33344922Smckusick 	char	*opt_sublink;
33444922Smckusick 	char	*opt_type;
33544922Smckusick 	char	*opt_unmount;
33644922Smckusick 	char	*opt_user;
33744922Smckusick };
33844922Smckusick 
33944922Smckusick /*
34044922Smckusick  * File Handle
34144922Smckusick  *
34244922Smckusick  * This is interpreted by indexing the exported array
34344922Smckusick  * by fhh_id.
34444922Smckusick  *
34544922Smckusick  * The whole structure is mapped onto a standard fhandle_t
34644922Smckusick  * when transmitted.
34744922Smckusick  */
34844922Smckusick struct am_fh {
34944922Smckusick 	int	fhh_pid;		/* process id */
35044922Smckusick 	int	fhh_id;			/* map id */
35144922Smckusick 	int	fhh_gen;		/* generation number */
35244922Smckusick };
35344922Smckusick 
35444922Smckusick extern am_node *fh_to_mp P((nfs_fh*));
35544922Smckusick extern am_node *fh_to_mp3 P((nfs_fh*,int*,int));
35644922Smckusick extern void mp_to_fh P((am_node*, nfs_fh*));
35744922Smckusick #define	fh_to_mp2(fhp, rp) fh_to_mp3(fhp, rp, VLOOK_CREATE)
35847527Spendry extern int auto_fmount P((am_node *mp));
35947527Spendry extern int auto_fumount P((am_node *mp));
36044922Smckusick 
36147527Spendry #define	MAX_READDIR_ENTRIES	16
36247527Spendry 
36347527Spendry typedef char*	(*vfs_match)P((am_opts*));
36444922Smckusick typedef int	(*vfs_init)P((mntfs*));
36544922Smckusick typedef int	(*vmount_fs)P((am_node*));
36647527Spendry typedef int	(*vfmount_fs)P((mntfs*));
36744922Smckusick typedef int	(*vumount_fs)P((am_node*));
36847527Spendry typedef int	(*vfumount_fs)P((mntfs*));
36944922Smckusick typedef am_node*(*vlookuppn)P((am_node*, char*, int*, int));
37047527Spendry typedef int	(*vreaddir)P((am_node*, nfscookie, dirlist*, entry*, int));
37144922Smckusick typedef am_node*(*vreadlink)P((am_node*, int*));
37247527Spendry typedef void	(*vmounted)P((mntfs*));
37344922Smckusick typedef void	(*vumounted)P((am_node*));
37444922Smckusick typedef fserver*(*vffserver)P((mntfs*));
37544922Smckusick 
37644922Smckusick struct am_ops {
37744922Smckusick 	char		*fs_type;
37844922Smckusick 	vfs_match	fs_match;
37944922Smckusick 	vfs_init	fs_init;
38044922Smckusick 	vmount_fs	mount_fs;
38147527Spendry 	vfmount_fs	fmount_fs;
38244922Smckusick 	vumount_fs	umount_fs;
38347527Spendry 	vfumount_fs	fumount_fs;
38444922Smckusick 	vlookuppn	lookuppn;
38544922Smckusick 	vreaddir	readdir;
38644922Smckusick 	vreadlink	readlink;
38744922Smckusick 	vmounted	mounted;
38844922Smckusick 	vumounted	umounted;
38944922Smckusick 	vffserver	ffserver;
39044922Smckusick 	int		fs_flags;
39144922Smckusick };
39244922Smckusick extern am_node *efs_lookuppn P((am_node*, char*, int*, int));
39347527Spendry extern int efs_readdir P((am_node*, nfscookie, dirlist*, entry*, int));
39444922Smckusick 
39544922Smckusick #define	VLOOK_CREATE	0x1
39644922Smckusick #define	VLOOK_DELETE	0x2
39744922Smckusick 
39847527Spendry #define FS_DIRECTORY	0x0001		/* This looks like a dir, not a link */
39944922Smckusick #define	FS_MBACKGROUND	0x0002		/* Should background this mount */
40044922Smckusick #define	FS_NOTIMEOUT	0x0004		/* Don't bother with timeouts */
40147527Spendry #define FS_MKMNT	0x0008		/* Need to make the mount point */
40244922Smckusick #define FS_UBACKGROUND	0x0010		/* Unmount in background */
40344922Smckusick #define	FS_BACKGROUND	(FS_MBACKGROUND|FS_UBACKGROUND)
40444922Smckusick #define	FS_DISCARD	0x0020		/* Discard immediately on last reference */
40544922Smckusick #define	FS_AMQINFO	0x0040		/* Amq is interested in this fs type */
40644922Smckusick 
40744922Smckusick #ifdef SUNOS4_COMPAT
40844922Smckusick extern am_ops *sunos4_match P((am_opts*, char*, char*, char*, char*, char*));
40944922Smckusick #endif /* SUNOS4_COMPAT */
41044922Smckusick extern am_ops *ops_match P((am_opts*, char*, char*, char*, char*, char*));
41144922Smckusick #include "fstype.h"
41244922Smckusick 
41344922Smckusick /*
41444922Smckusick  * Per-mountpoint statistics
41544922Smckusick  */
41644922Smckusick struct am_stats {
41744922Smckusick 	time_t	s_mtime;	/* Mount time */
41844922Smckusick 	u_short	s_uid;		/* Uid of mounter */
41944922Smckusick 	int	s_getattr;	/* Count of getattrs */
42044922Smckusick 	int	s_lookup;	/* Count of lookups */
42144922Smckusick 	int	s_readdir;	/* Count of readdirs */
42244922Smckusick 	int	s_readlink;	/* Count of readlinks */
42344922Smckusick 	int	s_statfs;	/* Count of statfs */
42444922Smckusick };
42544922Smckusick typedef struct am_stats am_stats;
42644922Smckusick 
42744922Smckusick /*
42844922Smckusick  * System statistics
42944922Smckusick  */
43044922Smckusick struct amd_stats {
43144922Smckusick 	int	d_drops;	/* Dropped requests */
43244922Smckusick 	int	d_stale;	/* Stale NFS handles */
43344922Smckusick 	int	d_mok;		/* Succesful mounts */
43444922Smckusick 	int	d_merr;		/* Failed mounts */
43544922Smckusick 	int	d_uerr;		/* Failed unmounts */
43644922Smckusick };
43744922Smckusick extern struct amd_stats amd_stats;
43844922Smckusick 
43944922Smckusick /*
44044922Smckusick  * List of fileservers
44144922Smckusick  */
44244922Smckusick struct fserver {
44344922Smckusick 	qelem		fs_q;		/* List of fileservers */
44444922Smckusick 	int		fs_refc;	/* Number of references to this node */
44544922Smckusick 	char		*fs_host;	/* Normalized hostname of server */
44644922Smckusick 	struct sockaddr_in *fs_ip;	/* Network address of server */
44744922Smckusick 	int		fs_cid;		/* Callout id */
44844922Smckusick 	int		fs_pinger;	/* Ping (keepalive) interval */
44944922Smckusick 	int		fs_flags;	/* Flags */
45044922Smckusick 	char		*fs_type;	/* File server type */
45144922Smckusick 	voidp		fs_private;	/* Private data */
45244922Smckusick 	void		(*fs_prfree)();	/* Free private data */
45344922Smckusick };
45444922Smckusick #define	FSF_VALID	0x0001		/* Valid information available */
45544922Smckusick #define	FSF_DOWN	0x0002		/* This fileserver is thought to be down */
45644922Smckusick #define	FSF_ERROR	0x0004		/* Permanent error has occured */
45744922Smckusick #define	FSF_WANT	0x0008		/* Want a wakeup call */
45844922Smckusick #define	FSF_PINGING	0x0010		/* Already doing pings */
45944922Smckusick #define	FSRV_ISDOWN(fs)	(((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_DOWN|FSF_VALID))
46044922Smckusick #define	FSRV_ISUP(fs)	(((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_VALID))
46144922Smckusick 
46244922Smckusick /*
46344922Smckusick  * List of mounted filesystems
46444922Smckusick  */
46544922Smckusick struct mntfs {
46644922Smckusick 	qelem		mf_q;		/* List of mounted filesystems */
46744922Smckusick 	am_ops		*mf_ops;	/* Operations on this mountpoint */
46844922Smckusick 	am_opts		*mf_fo;		/* File opts */
46944922Smckusick 	char		*mf_mount;	/* "/a/kiska/home/kiska" */
47044922Smckusick 	char		*mf_info;	/* Mount info */
47147527Spendry 	char		*mf_auto;	/* Automount opts */
47247527Spendry 	char		*mf_mopts;	/* FS mount opts */
47352456Spendry 	char		*mf_remopts;	/* Remote FS mount opts */
47444922Smckusick 	fserver		*mf_server;	/* File server */
47544922Smckusick 	int		mf_flags;	/* Flags */
47644922Smckusick 	int		mf_error;	/* Error code from background mount */
47744922Smckusick 	int		mf_refc;	/* Number of references to this node */
47844922Smckusick 	int		mf_cid;		/* Callout id */
47944922Smckusick 	void		(*mf_prfree)();	/* Free private space */
48044922Smckusick 	voidp		mf_private;	/* Private - per-fs data */
48144922Smckusick };
48244922Smckusick 
48344922Smckusick #define	MFF_MOUNTED	0x0001		/* Node is mounted */
48444922Smckusick #define	MFF_MOUNTING	0x0002		/* Mount is in progress */
48544922Smckusick #define	MFF_UNMOUNTING	0x0004		/* Unmount is in progress */
48644922Smckusick #define	MFF_RESTART	0x0008		/* Restarted node */
48744922Smckusick #define MFF_MKMNT	0x0010		/* Delete this node's am_mount */
48844922Smckusick #define	MFF_ERROR	0x0020		/* This node failed to mount */
48944922Smckusick #define	MFF_LOGDOWN	0x0040		/* Logged that this mount is down */
49044922Smckusick #define	MFF_RSTKEEP	0x0080		/* Don't timeout this filesystem - restarted */
49144922Smckusick #define	MFF_WANTTIMO	0x0100		/* Need a timeout call when not busy */
49244922Smckusick 
49344922Smckusick /*
49444922Smckusick  * Map of auto-mount points.
49544922Smckusick  */
49644922Smckusick struct am_node {
49744922Smckusick 	int		am_mapno;	/* Map number */
49844922Smckusick 	mntfs		*am_mnt;	/* Mounted filesystem */
49944922Smckusick 	char		*am_name;	/* "kiska"
50044922Smckusick 					   Name of this node */
50144922Smckusick 	char		*am_path;	/* "/home/kiska"
50244922Smckusick 					   Path of this node's mount point */
50344922Smckusick 	char		*am_link;	/* "/a/kiska/home/kiska/this/that"
50444922Smckusick 					   Link to sub-directory */
50544922Smckusick 	am_node		*am_parent,	/* Parent of this node */
50644922Smckusick 			*am_ysib,	/* Younger sibling of this node */
50744922Smckusick 			*am_osib,	/* Older sibling of this node */
50844922Smckusick 			*am_child;	/* First child of this node */
50947527Spendry 	struct attrstat	am_attr;	/* File attributes */
51047527Spendry #define am_fattr	am_attr.attrstat_u.attributes
51144922Smckusick 	int		am_flags;	/* Boolean flags */
51244922Smckusick 	int		am_error;	/* Specific mount error */
51344922Smckusick 	time_t		am_ttl;		/* Time to live */
51444922Smckusick 	int		am_timeo_w;	/* Wait interval */
51544922Smckusick 	int		am_timeo;	/* Timeout interval */
51644922Smckusick 	unsigned int	am_gen;		/* Generation number */
51744922Smckusick 	char		*am_pref;	/* Mount info prefix */
51844922Smckusick 	am_stats	am_stats;	/* Statistics gathering */
51944922Smckusick };
52044922Smckusick 
52144922Smckusick #define	AMF_NOTIMEOUT	0x0001		/* This node never times out */
52244922Smckusick #define	AMF_ROOT	0x0002		/* This is a root node */
52344922Smckusick 
52444922Smckusick #define	ONE_HOUR	(60 * 60)	/* One hour in seconds */
52544922Smckusick 
52644922Smckusick /*
52744922Smckusick  * The following values can be tuned...
52844922Smckusick  */
52944922Smckusick #define	ALLOWED_MOUNT_TIME	40		/* 40s for a mount */
53044922Smckusick #define	AM_TTL			(5 * 60)	/* Default cache period */
53144922Smckusick #define	AM_TTL_W		(2 * 60)	/* Default unmount interval */
53244922Smckusick #define	AM_PINGER		30		/* NFS ping interval for live systems */
53344922Smckusick #define	AFS_TIMEO		8		/* Default afs timeout - .8s */
53447527Spendry #define	AFS_RETRANS		((ALLOWED_MOUNT_TIME*10+5*afs_timeo)/afs_timeo * 2)
53547527Spendry 						/* Default afs retrans - 1/10th seconds */
53644922Smckusick 
53744922Smckusick #define	RPC_XID_PORTMAP		0
53844922Smckusick #define	RPC_XID_MOUNTD		1
53944922Smckusick #define	RPC_XID_NFSPING		2
54044922Smckusick #define	RPC_XID_MASK		(0x0f)		/* 16 id's for now */
54144922Smckusick #define	MK_RPC_XID(type_id, uniq)	((type_id) | ((uniq) << 4))
542