amd.h revision 119679
1/*
2 * Copyright (c) 1997-2003 Erez Zadok
3 * Copyright (c) 1990 Jan-Simon Pendry
4 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
5 * Copyright (c) 1990 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Jan-Simon Pendry at Imperial College, London.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgment:
21 *      This product includes software developed by the University of
22 *      California, Berkeley and its contributors.
23 * 4. Neither the name of the University nor the names of its contributors
24 *    may be used to endorse or promote products derived from this software
25 *    without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 *
39 *      %W% (Berkeley) %G%
40 *
41 * $Id: amd.h,v 1.8.2.6 2002/12/27 22:44:29 ezk Exp $
42 *
43 */
44
45#ifndef _AMD_H
46#define _AMD_H
47
48
49/*
50 * MACROS:
51 */
52
53/* options for amd.conf */
54#define CFM_BROWSABLE_DIRS		0x0001
55#define CFM_MOUNT_TYPE_AUTOFS		0x0002
56#define CFM_SELECTORS_IN_DEFAULTS	0x0004
57#define CFM_NORMALIZE_HOSTNAMES		0x0008
58#define CFM_PROCESS_LOCK		0x0010
59#define CFM_PRINT_PID			0x0020
60#define CFM_RESTART_EXISTING_MOUNTS	0x0040
61#define CFM_SHOW_STATFS_ENTRIES		0x0080
62#define CFM_FULLY_QUALIFIED_HOSTS	0x0100
63#define CFM_BROWSABLE_DIRS_FULL		0x0200 /* allow '/' in readdir() */
64#define CFM_UNMOUNT_ON_EXIT		0x0400 /* when amd finishing */
65
66/* some systems (SunOS 4.x) neglect to define the mount null message */
67#ifndef MOUNTPROC_NULL
68# define MOUNTPROC_NULL ((u_long)(0))
69#endif /* not MOUNTPROC_NULL */
70
71/* Hash table size */
72#define NKVHASH (1 << 2)        /* Power of two */
73
74/* interval between forced retries of a mount */
75#define RETRY_INTERVAL	2
76
77#define ereturn(x) { *error_return = x; return 0; }
78
79
80/*
81 * TYPEDEFS:
82 */
83
84typedef struct cf_map cf_map_t;
85typedef struct kv kv;
86/*
87 * Cache map operations
88 */
89typedef void add_fn(mnt_map *, char *, char *);
90typedef int init_fn(mnt_map *, char *, time_t *);
91typedef int mtime_fn(mnt_map *, char *, time_t *);
92typedef int isup_fn(mnt_map *, char *);
93typedef int reload_fn(mnt_map *, char *, add_fn *);
94typedef int search_fn(mnt_map *, char *, char *, char **, time_t *);
95
96
97
98/*
99 * STRUCTURES:
100 */
101
102/* global amd options that are manipulated by conf.c */
103struct amu_global_options {
104  char *arch;			/* name of current architecture */
105  char *auto_dir;		/* automounter temp dir */
106  char *cluster;		/* cluster name */
107  char *karch;			/* kernel architecture */
108  char *logfile;		/* amd log file */
109  char *op_sys;			/* operating system name ${os} */
110  char *op_sys_ver;		/* OS version ${osver} */
111  char *op_sys_full;		/* full OS name ${full_os} */
112  char *op_sys_vendor;		/* name of OS vendor ${vendor} */
113  char *pid_file;		/* PID file */
114  char *sub_domain;		/* local domain */
115  char *map_options;		/* global map options */
116  char *map_type;		/* global map type */
117  char *search_path;		/* search path for maps */
118  char *mount_type;		/* mount type for map */
119  u_int flags;			/* various CFM_* flags */
120  int amfs_auto_retrans;	/* NFS retransmit counter */
121  int amfs_auto_timeo;		/* NFS retry interval */
122  int am_timeo;			/* cache duration */
123  int am_timeo_w;		/* dismount interval */
124  int portmap_program;		/* amd RPC program number */
125#ifdef HAVE_MAP_HESIOD
126  char *hesiod_base;		/* Hesiod rhs */
127#endif /* HAVE_MAP_HESIOD */
128#ifdef HAVE_MAP_LDAP
129  char *ldap_base;		/* LDAP base */
130  char *ldap_hostports;		/* LDAP host ports */
131  long ldap_cache_seconds; 	/* LDAP internal cache - keep seconds */
132  long ldap_cache_maxmem;	/* LDAP internal cache - max memory (bytes) */
133#endif /* HAVE_MAP_LDAP */
134#ifdef HAVE_MAP_NIS
135  char *nis_domain;		/* YP domain name */
136#endif /* HAVE_MAP_NIS */
137  char *nfs_proto;		/* NFS protocol (NULL, udp, tcp) */
138  int nfs_vers;			/* NFS version (0, 2, 3, 4) */
139};
140
141/* if you add anything here, update conf.c:reset_cf_map() */
142struct cf_map {
143  char *cfm_dir;		/* /home, /u, /src */
144  char *cfm_name;		/* amd.home, /etc/amd.home ... */
145  char *cfm_type;		/* file, hesiod, ndbm, nis ... */
146  char *cfm_opts;		/* -cache:=all, etc. */
147  char *cfm_search_path;	/* /etc/local:/etc/amdmaps:/misc/yp */
148  char *cfm_tag;		/* optional map tag for amd -T */
149  u_int cfm_flags;		/* browsable_dirs? mount_type? */
150};
151
152/*
153 * Key-value pair
154 */
155struct kv {
156  kv *next;
157  char *key;
158#ifdef HAVE_REGEXEC
159  regex_t re;                   /* store the regexp from regcomp() */
160#endif /* HAVE_REGEXEC */
161  char *val;
162};
163
164struct mnt_map {
165  qelem hdr;
166  int refc;                     /* Reference count */
167  short flags;                  /* Allocation flags */
168  short alloc;                  /* Allocation mode */
169  time_t modify;                /* Modify time of map */
170  u_int reloads;		/* Number of times map was reloaded */
171  char *map_name;               /* Name of this map */
172  char *wildcard;               /* Wildcard value */
173  reload_fn *reload;            /* Function to be used for reloads */
174  isup_fn *isup;		/* Is service up or not? (1=up, 0=down) */
175  search_fn *search;            /* Function to be used for searching */
176  mtime_fn *mtime;              /* Modify time function */
177  kv *kvhash[NKVHASH];          /* Cached data */
178  /* options available via amd conf file */
179  char *cf_map_type;            /* file, hesiod, ndbm, nis, etc. */
180  char *cf_search_path;         /* /etc/local:/etc/amdmaps:/misc/yp */
181  void *map_data;               /* Map data black box */
182};
183
184/*
185 * Mounting a file system may take a significant period of time.  The
186 * problem is that if this is done in the main process thread then the
187 * entire automounter could be blocked, possibly hanging lots of processes
188 * on the system.  Instead we use a continuation scheme to allow mounts to
189 * be attempted in a sub-process.  When the sub-process exits we pick up the
190 * exit status (by convention a UN*X error number) and continue in a
191 * notifier.  The notifier gets handed a data structure and can then
192 * determine whether the mount was successful or not.  If not, it updates
193 * the data structure and tries again until there are no more ways to try
194 * the mount, or some other permanent error occurs.  In the mean time no RPC
195 * reply is sent, even after the mount is successful.  We rely on the RPC
196 * retry mechanism to resend the lookup request which can then be handled.
197 */
198struct continuation {
199  char **ivec;			/* Current mount info */
200  am_node *mp;			/* Node we are trying to mount */
201  char *key;			/* Map key */
202  char *info;			/* Info string */
203  char **xivec;			/* Saved strsplit vector */
204  char *auto_opts;		/* Automount options */
205  am_opts fs_opts;		/* Filesystem options */
206  char *def_opts;		/* Default automount options */
207  int retry;			/* Try again? */
208  int tried;			/* Have we tried any yet? */
209  time_t start;			/* Time we started this mount */
210  int callout;			/* Callout identifier */
211};
212
213
214/*
215 * EXTERNALS:
216 */
217
218/* Amq server global functions */
219extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp);
220extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp);
221extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp);
222extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp);
223extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp);
224extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp);
225extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp);
226extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp);
227extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp);
228extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp);
229
230/* other external definitions */
231extern am_nfs_fh *root_fh(char *dir);
232extern am_node *find_ap(char *);
233extern am_node *find_ap2(char *, am_node *);
234extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead);
235extern fserver *find_nfs_srvr(mntfs *mf);
236extern int auto_fmount(am_node *mp);
237extern int auto_fumount(am_node *mp);
238extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *dir, char *fs_name, char *opts, mntfs *mf);
239extern int process_last_regular_map(void);
240extern int set_conf_kv(const char *section, const char *k, const char *v);
241extern int try_mount(voidp mvp);
242extern int yyparse (void);
243extern nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable);
244extern void amfs_auto_cont(int rc, int term, voidp closure);
245extern void amfs_auto_mkcacheref(mntfs *mf);
246extern void amfs_auto_retry(int rc, int term, voidp closure);
247extern void assign_error_mntfs(am_node *mp);
248extern void flush_srvr_nfs_cache(void);
249extern void free_continuation(struct continuation *cp);
250extern void mf_mounted(mntfs *mf);
251extern void quick_reply(am_node *mp, int error);
252extern void root_newmap(const char *, const char *, const char *, const cf_map_t *);
253
254/* amd global variables */
255extern FILE *yyin;
256extern SVCXPRT *nfs_program_2_transp; /* For quick_reply() */
257extern char *conf_tag;
258extern char *opt_gid;
259extern char *opt_uid;
260extern int NumChild;
261extern int fwd_sock;
262extern int select_intr_valid;
263extern int usage;
264extern int use_conf_file;	/* use amd configuration file */
265extern jmp_buf select_intr;
266extern qelem mfhead;
267extern struct am_opts fs_static; /* copy of the options to play with */
268extern struct amu_global_options gopt; /* where global options are stored */
269
270#ifdef HAVE_SIGACTION
271extern sigset_t masked_sigs;
272#endif /* HAVE_SIGACTION */
273
274#if defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX)
275extern char *amfs_link_match(am_opts *fo);
276extern int amfs_link_fumount(mntfs *mf);
277#endif /* defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX) */
278
279#ifdef HAVE_AMU_FS_NFSL
280extern char *nfs_match(am_opts *fo);
281#endif /* HAVE_AMU_FS_NFSL */
282
283#if defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3)
284extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp);
285#endif /* defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) */
286
287/* Unix file system (irix) */
288#ifdef HAVE_FS_XFS
289extern am_ops xfs_ops;		/* Un*x file system */
290#endif /* HAVE_FS_XFS */
291
292/* Unix file system (irix) */
293#ifdef HAVE_FS_EFS
294extern am_ops efs_ops;		/* Un*x file system */
295#endif /* HAVE_FS_EFS */
296
297#endif /* not _AMD_H */
298