1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_AUTOMOUNT_H
27#define	_AUTOMOUNT_H
28
29#include <fslib.h>		/* needed for mntlist_t declaration */
30#include <thread.h>
31#include <sys/mntent.h>		/*    "    "  MNTTYPE_* declarations */
32#include <synch.h>		/* needed for mutex_t declaration */
33#include <sys/types.h>
34#include <rpc/rpc.h>
35#include <sys/fs/autofs.h>
36#include <netinet/in.h>		/* needed for sockaddr_in declaration */
37#include <door.h>
38
39#ifdef MALLOC_DEBUG
40#include <debug_alloc.h>
41#endif
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#ifndef _REENTRANT
48#define	fork1			vfork
49#define	rpc_control(a, b)	1
50#endif
51
52#define	DOMOUNT_USER	1
53#define	DOMOUNT_KERNEL	2
54
55/*
56 * Solaris autofs configuration file location
57 */
58#define	AUTOFSADMIN	"/etc/default/autofs"
59
60#define	MXHOSTNAMELEN	64
61#define	MAXNETNAMELEN   255
62#define	MAXFILENAMELEN  255
63#define	LINESZ		4096
64#define	MAXADDRLEN	128		/* max autofs address length */
65#define	MAXOPTSLEN	1024
66
67#define	AUTOFS_MOUNT_TIMEOUT	600	/* default min time mount will */
68					/* remain mounted (in seconds) */
69#define	AUTOFS_RPC_TIMEOUT	60	/* secs autofs will wait for */
70					/* automountd's reply before */
71					/* retransmitting */
72/* stack ops */
73#define	ERASE		0
74#define	PUSH		1
75#define	POP		2
76#define	INIT		3
77#define	STACKSIZ	30
78
79#define	DIST_SELF	1
80#define	DIST_MYSUB	2
81#define	DIST_MYNET	3
82#define	DIST_OTHER	4
83
84#define	MAXIFS		32
85
86/*
87 * Retry operation related definitions.
88 */
89#define	RET_OK		0
90#define	RET_RETRY	32
91#define	RET_ERR		33
92#define	INITDELAY	5
93#define	DELAY_BACKOFF	2
94#define	MAXDELAY	120
95#define	ARGV_MAX	16
96#define	VFS_PATH	"/usr/lib/fs"
97#define	DELAY(delay) { \
98	(void) sleep(delay); \
99	delay *= DELAY_BACKOFF; \
100	if (delay > MAXDELAY) \
101		delay = MAXDELAY; \
102}
103
104struct mapline {
105	char linebuf[LINESZ];
106	char lineqbuf[LINESZ];
107};
108
109/*
110 * Structure describing a host/filesystem/dir tuple in a NIS map entry
111 */
112struct mapfs {
113	struct mapfs *mfs_next;	/* next in entry */
114	int 	mfs_ignore;	/* ignore this entry */
115	char	*mfs_host;	/* host name */
116	char	*mfs_dir;	/* dir to mount */
117	int	mfs_penalty;	/* mount penalty for this host */
118	int	mfs_distance;	/* distance hint */
119	struct nfs_args *mfs_args;	/* nfs_args */
120	struct netconfig *mfs_nconf;
121	rpcvers_t	mfs_version;	/* NFS version */
122
123#define	MFS_ALLOC_DIR		0x1	/* mfs_dir now points to different */
124					/* buffer */
125
126#define	MFS_URL			0x2	/* is NFS url listed in this tuple. */
127#define	MFS_FH_VIA_WEBNFS	0x4	/* got file handle during ping phase */
128
129	uint_t	mfs_flags;
130	uint_t	mfs_port;	/* port# in NFS url */
131};
132
133/*
134 * NIS entry - lookup of name in DIR gets us this
135 */
136struct mapent {
137	char	*map_fstype;	/* file system type e.g. "nfs" */
138	char	*map_mounter;	/* base fs e.g. "cachefs" */
139	char	*map_root;	/* path to mount root */
140	char	*map_mntpnt;	/* path from mount root */
141	char	*map_mntopts;	/* mount options */
142	char    *map_fsw;	/* mount fs information */
143	char    *map_fswq;	/* quoted mountfs information */
144	int	map_mntlevel;	/* mapentry hierarchy level */
145	bool_t	map_modified;	/* flags modified mapentries */
146	bool_t	map_faked;	/* flags faked mapentries */
147	int	map_err;	/* flags any bad entries in the map */
148	struct mapfs *map_fs;	/* list of replicas for nfs */
149	struct mapent *map_next;
150};
151
152
153/*
154 * Descriptor for each directory served by the automounter
155 */
156struct autodir {
157	char	*dir_name;		/* mount point */
158	char	*dir_map;		/* name of map for dir */
159	char	*dir_opts;		/* default mount options */
160	int 	dir_direct;		/* direct mountpoint ? */
161	int 	dir_remount;		/* a remount */
162	struct autodir *dir_next;	/* next entry */
163	struct autodir *dir_prev;	/* prev entry */
164};
165
166/*
167 * This structure is used to build an array of
168 * hostnames with associated penalties to be
169 * passed to the nfs_cast procedure
170 */
171struct host_names {
172	char *host;
173	int  penalty;
174};
175
176/*
177 * structure used to build list of contents for a map on
178 * a readdir request
179 */
180struct dir_entry {
181	char		*name;		/* name of entry */
182	ino_t		nodeid;
183	off_t		offset;
184	struct dir_entry *next;
185	struct dir_entry *left;		/* left element in binary tree */
186	struct dir_entry *right;	/* right element in binary tree */
187};
188
189/*
190 * offset index table
191 */
192struct off_tbl {
193	off_t			offset;
194	struct dir_entry	*first;
195	struct off_tbl		*next;
196};
197
198#ifndef NO_RDDIR_CACHE
199/*
200 * directory cache for 'map'
201 */
202struct autofs_rddir_cache {
203	char			*map;
204	struct off_tbl		*offtp;
205	ulong_t			bucket_size;
206	time_t			ttl;
207	struct dir_entry	*entp;
208	mutex_t			lock;		/* protects 'in_use' field */
209	int			in_use;		/* # threads referencing it */
210	rwlock_t		rwlock;		/* protects 'full' and 'next' */
211	int			full;		/* full == 1 when cache full */
212	struct autofs_rddir_cache	*next;
213};
214
215#define	RDDIR_CACHE_TIME	300		/* in seconds */
216
217#endif /* NO_RDDIR_CACHE */
218
219/*
220 * structure used to maintain address list for localhost
221 */
222
223struct myaddrs {
224	struct sockaddr_in sin;
225	struct myaddrs *myaddrs_next;
226};
227
228/*
229 * structure used to pass commands to the door servers
230 */
231
232typedef struct command {
233	char file[MAXPATHLEN];
234	char argv[ARGV_MAX][MAXOPTSLEN];
235	char key[MAXOPTSLEN];
236	int console;
237} command_t;
238
239/*
240 * globally visible door_server file descriptor
241 */
242int did_exec_map;
243int did_fork_exec;
244
245extern time_t timenow;	/* set at start of processing of each RPC call */
246extern char self[];
247extern int verbose;
248extern int trace;
249extern int automountd_nobrowse;
250extern struct autodir *dir_head;
251extern struct autodir *dir_tail;
252extern struct mntlist *current_mounts;
253struct mounta;			/* defined in sys/vfs.h */
254extern struct myaddrs *myaddrs_head;
255
256extern rwlock_t	cache_lock;
257extern rwlock_t portmap_cache_lock;
258extern rwlock_t autofs_rddir_cache_lock;
259
260extern mutex_t cleanup_lock;
261extern cond_t cleanup_start_cv;
262extern cond_t cleanup_done_cv;
263
264/*
265 * mnttab handling routines
266 */
267extern void free_mapent(struct mapent *);
268extern struct mntlist *getmntlist(void);
269extern dev_t get_devid(struct extmnttab *);
270
271/*
272 * utilities
273 */
274extern struct mapent *parse_entry(char *, char *, char *, struct mapline *,
275				char *, uint_t, bool_t);
276extern int macro_expand(char *, char *, char *, int);
277extern void unquote(char *, char *);
278extern void unbracket(char **);
279extern void trim(char *);
280extern char *get_line(FILE *, char *, char *, int);
281extern int getword(char *, char *, char **, char **, char, int);
282extern int get_retry(char *);
283extern int str_opt(struct mnttab *, char *, char **);
284extern void put_automountd_env(void);
285extern void dirinit(char *, char *, char *, int, char **, char ***);
286extern void pr_msg(const char *, ...);
287extern void trace_prt(int, char *, ...);
288extern void free_autofs_args(autofs_args *);
289extern void free_nfs_args(struct nfs_args *);
290extern void free_mounta(struct mounta *);
291
292extern int nopt(struct mnttab *, char *, int *);
293extern int set_versrange(rpcvers_t, rpcvers_t *, rpcvers_t *);
294extern enum clnt_stat pingnfs(char *, int, rpcvers_t *, rpcvers_t,
295	ushort_t, bool_t, char *, char *);
296
297extern void *autofs_get_buffer(size_t);
298extern int self_check(char *);
299extern int do_mount1(char *, char *, char *, char *, char *, uint_t, uid_t,
300	action_list **, int);
301extern int do_lookup1(char *, char *, char *, char *, char *, uint_t, uid_t,
302	autofs_action_t *, struct linka *);
303extern int do_unmount1(umntrequest *);
304extern int do_readdir(autofs_rddirargs *, autofs_rddirres *);
305extern int nfsunmount(struct mnttab *);
306extern int loopbackmount(char *, char *, char *, int);
307extern int mount_nfs(struct mapent *, char *, char *, int, uid_t,
308	action_list **);
309extern int mount_autofs(struct mapent *, char *, action_list *,
310	char *rootp, char *subdir, char *key);
311extern int mount_generic(char *, char *, char *, char *, int);
312extern enum clnt_stat nfs_cast(struct mapfs *, struct mapfs **, int);
313
314extern bool_t hasrestrictopt(char *);
315
316#ifndef NO_RDDIR_CACHE
317/*
318 * readdir handling routines
319 */
320extern char *auto_rddir_malloc(unsigned);
321extern char *auto_rddir_strdup(const char *);
322extern struct dir_entry *btree_lookup(struct dir_entry *, char *);
323extern void btree_enter(struct dir_entry **, struct dir_entry *);
324extern int add_dir_entry(char *, struct dir_entry **, struct dir_entry **);
325extern void cache_cleanup(void);
326extern int autofs_rddir_cache_lookup(char *, struct autofs_rddir_cache **);
327extern struct dir_entry *rddir_entry_lookup(char *, struct dir_entry *);
328#endif /* NO_RDDIR_CACHE */
329
330/*
331 * generic interface to specific name service functions
332 */
333extern void ns_setup(char **, char ***);
334extern int getmapent(char *, char *, struct mapline *, char **, char ***,
335			bool_t *, bool_t);
336extern int getmapkeys(char *, struct dir_entry **, int *, int *, char **,
337			char ***, uid_t);
338extern int loadmaster_map(char *, char *, char **, char ***);
339extern int loaddirect_map(char *, char *, char *, char **, char ***);
340
341/*
342 * these name service specific functions should not be
343 * accessed directly, use the generic functions.
344 */
345extern void init_files(char **, char ***);
346extern int getmapent_files(char *, char *, struct mapline *, char **, char ***,
347				bool_t *, bool_t);
348extern int loadmaster_files(char *, char *, char **, char ***);
349extern int loaddirect_files(char *, char *, char *, char **, char ***);
350extern int getmapkeys_files(char *, struct dir_entry **, int *, int *,
351	char **, char ***);
352extern int stack_op(int, char *, char **, char ***);
353
354extern void init_nis(char **, char ***);
355extern int getmapent_nis(char *, char *, struct mapline *, char **, char ***,
356				bool_t *, bool_t);
357extern int loadmaster_nis(char *, char *, char **, char ***);
358extern int loaddirect_nis(char *, char *, char *, char **, char ***);
359extern int getmapkeys_nis(char *, struct dir_entry **, int *, int *,
360	char **, char ***);
361
362extern void init_ldap(char **, char ***);
363extern int getmapent_ldap(char *, char *, struct mapline *, char **, char ***,
364				bool_t *, bool_t);
365extern int loadmaster_ldap(char *, char *, char **, char ***);
366extern int loaddirect_ldap(char *, char *, char *, char **, char ***);
367extern int getmapkeys_ldap(char *, struct dir_entry **, int *, int *,
368	char **, char ***);
369
370
371/*
372 * end of name service specific functions
373 */
374
375/*
376 * not defined in any header file
377 */
378extern bool_t xdr_uid_t(XDR *, uid_t *);
379extern int __clnt_bindresvport(CLIENT *);
380extern int getnetmaskbynet(const struct in_addr, struct in_addr *);
381
382/*
383 * Hidden rpc functions
384 */
385extern int __nis_reset_state();
386extern int __rpc_negotiate_uid(int);
387
388/*
389 * door_server functions to handle fork activity within the automounter
390 */
391void automountd_do_fork_exec(void *, char *, size_t, door_desc_t *, uint_t);
392void automountd_do_exec_map(void *, char *, size_t, door_desc_t *, uint_t);
393
394#ifdef __cplusplus
395}
396#endif
397
398#endif	/* _AUTOMOUNT_H */
399