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.
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.
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]
23 * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
27 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
28 * Use is subject to license terms.
34 #include <fslib.h> /* needed for mntlist_t declaration */
36 #include <sys/mntent.h> /* " " MNTTYPE_* declarations */
37 #include <synch.h> /* needed for mutex_t declaration */
38 #include <sys/types.h>
40 #include <sys/fs/autofs.h>
41 #include <netinet/in.h> /* needed for sockaddr_in declaration */
45 #include <debug_alloc.h>
54 #define rpc_control(a, b) 1
57 #define DOMOUNT_USER 1
58 #define DOMOUNT_KERNEL 2
61 * Solaris autofs configuration file location
63 #define AUTOFSADMIN "/etc/default/autofs"
65 #define MXHOSTNAMELEN 64
66 #define MAXNETNAMELEN 255
67 #define MAXFILENAMELEN 255
69 #define MAXADDRLEN 128 /* max autofs address length */
70 #define MAXOPTSLEN 1024
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 */
92 * Retry operation related definitions.
98 #define DELAY_BACKOFF 2
101 #define VFS_PATH "/usr/lib/fs"
102 #define DELAY(delay) { \
103 (void) sleep(delay); \
104 delay *= DELAY_BACKOFF; \
105 if (delay > MAXDELAY) \
110 char linebuf
[LINESZ
];
111 char lineqbuf
[LINESZ
];
115 * Structure describing a host/filesystem/dir tuple in a NIS map entry
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 */
128 #define MFS_ALLOC_DIR 0x1 /* mfs_dir now points to different */
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 */
135 uint_t mfs_port
; /* port# in NFS url */
139 * NIS entry - lookup of name in DIR gets us this
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
;
159 * Descriptor for each directory served by the automounter
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 */
172 * This structure is used to build an array of
173 * hostnames with associated penalties to be
174 * passed to the nfs_cast procedure
182 * structure used to build list of contents for a map on
186 char *name
; /* name of entry */
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 */
199 struct dir_entry
*first
;
200 struct off_tbl
*next
;
203 #ifndef NO_RDDIR_CACHE
205 * directory cache for 'map'
207 struct autofs_rddir_cache
{
209 struct off_tbl
*offtp
;
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
;
220 #define RDDIR_CACHE_TIME 300 /* in seconds */
222 #endif /* NO_RDDIR_CACHE */
225 * structure used to maintain address list for localhost
229 struct sockaddr_in sin
;
230 struct myaddrs
*myaddrs_next
;
234 * structure used to pass commands to the door servers
237 typedef struct command
{
238 char file
[MAXPATHLEN
];
239 char argv
[ARGV_MAX
][MAXOPTSLEN
];
240 char key
[MAXOPTSLEN
];
245 * globally visible door_server file descriptor
250 extern time_t timenow
; /* set at start of processing of each RPC call */
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
;
261 extern rwlock_t cache_lock
;
262 extern rwlock_t portmap_cache_lock
;
263 extern rwlock_t autofs_rddir_cache_lock
;
265 extern mutex_t cleanup_lock
;
266 extern cond_t cleanup_start_cv
;
267 extern cond_t cleanup_done_cv
;
270 * mnttab handling routines
272 extern void free_mapent(struct mapent
*);
273 extern struct mntlist
*getmntlist(void);
274 extern dev_t
get_devid(struct extmnttab
*);
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
*);
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 *);
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
,
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);
319 extern bool_t
hasrestrictopt(char *);
321 #ifndef NO_RDDIR_CACHE
323 * readdir handling routines
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 */
336 * generic interface to specific name service functions
338 extern void ns_setup(char **, char ***);
339 extern int getmapent(char *, char *, struct mapline
*, char **, char ***,
341 extern int getmapkeys(char *, struct dir_entry
**, int *, int *, char **,
343 extern int loadmaster_map(char *, char *, char **, char ***);
344 extern int loaddirect_map(char *, char *, char *, char **, char ***);
347 * these name service specific functions should not be
348 * accessed directly, use the generic functions.
350 extern void init_files(char **, char ***);
351 extern int getmapent_files(char *, char *, struct mapline
*, char **, char ***,
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 *,
357 extern int stack_op(int, char *, char **, char ***);
359 extern void init_nis(char **, char ***);
360 extern int getmapent_nis(char *, char *, struct mapline
*, char **, char ***,
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 *,
367 extern void init_ldap(char **, char ***);
368 extern int getmapent_ldap(char *, char *, struct mapline
*, char **, char ***,
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 *,
377 * end of name service specific functions
381 * not defined in any header file
383 extern int __clnt_bindresvport(CLIENT
*);
384 extern int getnetmaskbynet(const struct in_addr
, struct in_addr
*);
387 * Hidden rpc functions
389 extern int __nis_reset_state();
390 extern int __rpc_negotiate_uid(int);
393 * door_server functions to handle fork activity within the automounter
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
);
402 #endif /* _AUTOMOUNT_H */