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