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