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 2014 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 e.g. "cachefs" */
 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 int did_exec_map;
 248 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 */