amd.h revision 51292
1/*
2 * Copyright (c) 1997-1999 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.3 1999/02/04 07:24:14 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_ENABLE_DEFAULT_SELECTORS	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 */
110  char *op_sys_ver;		/* OS version */
111  char *pid_file;		/* PID file */
112  char *sub_domain;		/* local domain */
113  char *map_options;		/* global map options */
114  char *map_type;		/* global map type */
115  char *search_path;		/* search path for maps */
116  char *mount_type;		/* mount type for map */
117  u_int flags;			/* various CFM_* flags */
118  int amfs_auto_retrans;	/* NFS retransmit counter */
119  int amfs_auto_timeo;		/* NFS retry interval */
120  int am_timeo;			/* cache duration */
121  int am_timeo_w;		/* dismount interval */
122  int portmap_program;		/* amd RPC program number */
123#ifdef HAVE_MAP_HESIOD
124  char *hesiod_base;		/* Hesiod rhs */
125#endif /* HAVE_MAP_HESIOD */
126#ifdef HAVE_MAP_LDAP
127  char *ldap_base;		/* LDAP base */
128  char *ldap_hostports;		/* LDAP host ports */
129  long ldap_cache_seconds; 	/* LDAP internal cache - keep seconds */
130  long ldap_cache_maxmem;	/* LDAP internal cache - max memory (bytes) */
131#endif /* HAVE_MAP_LDAP */
132#ifdef HAVE_MAP_NIS
133  char *nis_domain;		/* YP domain name */
134#endif /* HAVE_MAP_NIS */
135};
136
137/* if you add anything here, update conf.c:reset_cf_map() */
138struct cf_map {
139  char *cfm_dir;		/* /home, /u, /src */
140  char *cfm_name;		/* amd.home, /etc/amd.home ... */
141  char *cfm_type;		/* file, hesiod, ndbm, nis ... */
142  char *cfm_opts;		/* -cache:=all, etc. */
143  char *cfm_search_path;	/* /etc/local:/etc/amdmaps:/misc/yp */
144  char *cfm_tag;		/* optional map tag for amd -T */
145  u_int cfm_flags;		/* browsable_dirs? mount_type? */
146};
147
148/*
149 * Key-value pair
150 */
151struct kv {
152  kv *next;
153  char *key;
154#ifdef HAVE_REGEXEC
155  regex_t re;                   /* store the regexp from regcomp() */
156#endif /* HAVE_REGEXEC */
157  char *val;
158};
159
160struct mnt_map {
161  qelem hdr;
162  int refc;                     /* Reference count */
163  short flags;                  /* Allocation flags */
164  short alloc;                  /* Allocation mode */
165  time_t modify;                /* Modify time of map */
166  char *map_name;               /* Name of this map */
167  char *wildcard;               /* Wildcard value */
168  reload_fn *reload;            /* Function to be used for reloads */
169  isup_fn *isup;		/* Is service up or not? (1=up, 0=down) */
170  search_fn *search;            /* Function to be used for searching */
171  mtime_fn *mtime;              /* Modify time function */
172  kv *kvhash[NKVHASH];          /* Cached data */
173  /* options available via amd conf file */
174  char *cf_map_type;            /* file, hesiod, ndbm, nis, etc. */
175  char *cf_search_path;         /* /etc/local:/etc/amdmaps:/misc/yp */
176  void *map_data;               /* Map data black box */
177};
178
179/*
180 * Mounting a file system may take a significant period of time.  The
181 * problem is that if this is done in the main process thread then the
182 * entire automounter could be blocked, possibly hanging lots of processes
183 * on the system.  Instead we use a continuation scheme to allow mounts to
184 * be attempted in a sub-process.  When the sub-process exits we pick up the
185 * exit status (by convention a UN*X error number) and continue in a
186 * notifier.  The notifier gets handed a data structure and can then
187 * determine whether the mount was successful or not.  If not, it updates
188 * the data structure and tries again until there are no more ways to try
189 * the mount, or some other permanent error occurs.  In the mean time no RPC
190 * reply is sent, even after the mount is successful.  We rely on the RPC
191 * retry mechanism to resend the lookup request which can then be handled.
192 */
193struct continuation {
194  char **ivec;			/* Current mount info */
195  am_node *mp;			/* Node we are trying to mount */
196  char *key;			/* Map key */
197  char *info;			/* Info string */
198  char **xivec;			/* Saved strsplit vector */
199  char *auto_opts;		/* Automount options */
200  am_opts fs_opts;		/* Filesystem options */
201  char *def_opts;		/* Default automount options */
202  int retry;			/* Try again? */
203  int tried;			/* Have we tried any yet? */
204  time_t start;			/* Time we started this mount */
205  int callout;			/* Callout identifier */
206};
207
208
209/*
210 * EXTERNALS:
211 */
212
213/* Amq server global functions */
214extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp);
215extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp);
216extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp);
217extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp);
218extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp);
219extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp);
220extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp);
221extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp);
222extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp);
223extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp);
224
225/* other external definitions */
226extern am_nfs_fh *root_fh(char *dir);
227extern am_node * autofs_lookuppn(am_node *mp, char *fname, int *error_return, int op);
228extern am_node *find_ap(char *);
229extern am_node *find_ap2(char *, am_node *);
230extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead);
231extern fserver *find_nfs_srvr(mntfs *mf);
232extern int auto_fmount(am_node *mp);
233extern int auto_fumount(am_node *mp);
234extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *dir, char *fs_name, char *opts, mntfs *mf);
235extern int process_last_regular_map(void);
236extern int set_conf_kv(const char *section, const char *k, const char *v);
237extern int try_mount(voidp mvp);
238extern int yyparse (void);
239extern nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable);
240extern void amfs_auto_cont(int rc, int term, voidp closure);
241extern void amfs_auto_mkcacheref(mntfs *mf);
242extern void amfs_auto_retry(int rc, int term, voidp closure);
243extern void assign_error_mntfs(am_node *mp);
244extern void flush_srvr_nfs_cache(void);
245extern void free_continuation(struct continuation *cp);
246extern void mf_mounted(mntfs *mf);
247extern void quick_reply(am_node *mp, int error);
248extern void root_newmap(const char *, const char *, const char *, const cf_map_t *);
249
250/* amd global variables */
251extern FILE *yyin;
252extern SVCXPRT *nfs_program_2_transp;	/* For quick_reply() */
253extern char *conf_tag;
254extern int NumChild;
255extern int fwd_sock;
256extern int select_intr_valid;
257extern int usage;
258extern int use_conf_file;	/* use amd configuration file */
259extern jmp_buf select_intr;
260extern qelem mfhead;
261extern struct amu_global_options gopt;	/* where global options are stored */
262
263#ifdef HAVE_SIGACTION
264extern sigset_t masked_sigs;
265#endif /* HAVE_SIGACTION */
266
267#if defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX)
268extern char *amfs_link_match(am_opts *fo);
269extern int amfs_link_fumount(mntfs *mf);
270#endif /* defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX) */
271
272#ifdef HAVE_AM_FS_NFSL
273extern char *nfs_match(am_opts *fo);
274#endif /* HAVE_AM_FS_NFSL */
275
276#if defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3)
277extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp);
278#endif /* defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) */
279
280#ifdef HAVE_FS_AUTOFS
281extern SVCXPRT *autofsxprt;
282extern u_short autofs_port;
283extern int amd_use_autofs;
284
285extern int autofs_mount(am_node *mp);
286extern int autofs_umount(am_node *mp);
287extern int create_autofs_service(int *soAUTOFSp, u_short *autofs_portp, SVCXPRT **autofs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp));
288extern int svc_create_local_service(void (*dispatch) (), u_long prognum, u_long versnum, char *nettype, char *servname);
289extern void autofs_mounted(mntfs *mf);
290extern void autofs_program_1(struct svc_req *rqstp, SVCXPRT *transp);
291#endif /* HAVE_FS_AUTOFS */
292
293/* Unix file system (irix) */
294#ifdef HAVE_FS_XFS
295extern am_ops xfs_ops;		/* Un*x file system */
296#endif /* HAVE_FS_XFS */
297
298/* Unix file system (irix) */
299#ifdef HAVE_FS_EFS
300extern am_ops efs_ops;		/* Un*x file system */
301#endif /* HAVE_FS_EFS */
302
303#endif /* not _AMD_H */
304