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