amd.h revision 119679
1/* 2 * Copyright (c) 1997-2003 Erez Zadok 3 * Copyright (c) 1990 Jan-Simon Pendry 4 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 5 * Copyright (c) 1990 The Regents of the University of California. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Jan-Simon Pendry at Imperial College, London. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgment: 21 * This product includes software developed by the University of 22 * California, Berkeley and its contributors. 23 * 4. Neither the name of the University nor the names of its contributors 24 * may be used to endorse or promote products derived from this software 25 * without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * %W% (Berkeley) %G% 40 * 41 * $Id: amd.h,v 1.8.2.6 2002/12/27 22:44:29 ezk Exp $ 42 * 43 */ 44 45#ifndef _AMD_H 46#define _AMD_H 47 48 49/* 50 * MACROS: 51 */ 52 53/* options for amd.conf */ 54#define CFM_BROWSABLE_DIRS 0x0001 55#define CFM_MOUNT_TYPE_AUTOFS 0x0002 56#define CFM_SELECTORS_IN_DEFAULTS 0x0004 57#define CFM_NORMALIZE_HOSTNAMES 0x0008 58#define CFM_PROCESS_LOCK 0x0010 59#define CFM_PRINT_PID 0x0020 60#define CFM_RESTART_EXISTING_MOUNTS 0x0040 61#define CFM_SHOW_STATFS_ENTRIES 0x0080 62#define CFM_FULLY_QUALIFIED_HOSTS 0x0100 63#define CFM_BROWSABLE_DIRS_FULL 0x0200 /* allow '/' in readdir() */ 64#define CFM_UNMOUNT_ON_EXIT 0x0400 /* when amd finishing */ 65 66/* some systems (SunOS 4.x) neglect to define the mount null message */ 67#ifndef MOUNTPROC_NULL 68# define MOUNTPROC_NULL ((u_long)(0)) 69#endif /* not MOUNTPROC_NULL */ 70 71/* Hash table size */ 72#define NKVHASH (1 << 2) /* Power of two */ 73 74/* interval between forced retries of a mount */ 75#define RETRY_INTERVAL 2 76 77#define ereturn(x) { *error_return = x; return 0; } 78 79 80/* 81 * TYPEDEFS: 82 */ 83 84typedef struct cf_map cf_map_t; 85typedef struct kv kv; 86/* 87 * Cache map operations 88 */ 89typedef void add_fn(mnt_map *, char *, char *); 90typedef int init_fn(mnt_map *, char *, time_t *); 91typedef int mtime_fn(mnt_map *, char *, time_t *); 92typedef int isup_fn(mnt_map *, char *); 93typedef int reload_fn(mnt_map *, char *, add_fn *); 94typedef int search_fn(mnt_map *, char *, char *, char **, time_t *); 95 96 97 98/* 99 * STRUCTURES: 100 */ 101 102/* global amd options that are manipulated by conf.c */ 103struct amu_global_options { 104 char *arch; /* name of current architecture */ 105 char *auto_dir; /* automounter temp dir */ 106 char *cluster; /* cluster name */ 107 char *karch; /* kernel architecture */ 108 char *logfile; /* amd log file */ 109 char *op_sys; /* operating system name ${os} */ 110 char *op_sys_ver; /* OS version ${osver} */ 111 char *op_sys_full; /* full OS name ${full_os} */ 112 char *op_sys_vendor; /* name of OS vendor ${vendor} */ 113 char *pid_file; /* PID file */ 114 char *sub_domain; /* local domain */ 115 char *map_options; /* global map options */ 116 char *map_type; /* global map type */ 117 char *search_path; /* search path for maps */ 118 char *mount_type; /* mount type for map */ 119 u_int flags; /* various CFM_* flags */ 120 int amfs_auto_retrans; /* NFS retransmit counter */ 121 int amfs_auto_timeo; /* NFS retry interval */ 122 int am_timeo; /* cache duration */ 123 int am_timeo_w; /* dismount interval */ 124 int portmap_program; /* amd RPC program number */ 125#ifdef HAVE_MAP_HESIOD 126 char *hesiod_base; /* Hesiod rhs */ 127#endif /* HAVE_MAP_HESIOD */ 128#ifdef HAVE_MAP_LDAP 129 char *ldap_base; /* LDAP base */ 130 char *ldap_hostports; /* LDAP host ports */ 131 long ldap_cache_seconds; /* LDAP internal cache - keep seconds */ 132 long ldap_cache_maxmem; /* LDAP internal cache - max memory (bytes) */ 133#endif /* HAVE_MAP_LDAP */ 134#ifdef HAVE_MAP_NIS 135 char *nis_domain; /* YP domain name */ 136#endif /* HAVE_MAP_NIS */ 137 char *nfs_proto; /* NFS protocol (NULL, udp, tcp) */ 138 int nfs_vers; /* NFS version (0, 2, 3, 4) */ 139}; 140 141/* if you add anything here, update conf.c:reset_cf_map() */ 142struct cf_map { 143 char *cfm_dir; /* /home, /u, /src */ 144 char *cfm_name; /* amd.home, /etc/amd.home ... */ 145 char *cfm_type; /* file, hesiod, ndbm, nis ... */ 146 char *cfm_opts; /* -cache:=all, etc. */ 147 char *cfm_search_path; /* /etc/local:/etc/amdmaps:/misc/yp */ 148 char *cfm_tag; /* optional map tag for amd -T */ 149 u_int cfm_flags; /* browsable_dirs? mount_type? */ 150}; 151 152/* 153 * Key-value pair 154 */ 155struct kv { 156 kv *next; 157 char *key; 158#ifdef HAVE_REGEXEC 159 regex_t re; /* store the regexp from regcomp() */ 160#endif /* HAVE_REGEXEC */ 161 char *val; 162}; 163 164struct mnt_map { 165 qelem hdr; 166 int refc; /* Reference count */ 167 short flags; /* Allocation flags */ 168 short alloc; /* Allocation mode */ 169 time_t modify; /* Modify time of map */ 170 u_int reloads; /* Number of times map was reloaded */ 171 char *map_name; /* Name of this map */ 172 char *wildcard; /* Wildcard value */ 173 reload_fn *reload; /* Function to be used for reloads */ 174 isup_fn *isup; /* Is service up or not? (1=up, 0=down) */ 175 search_fn *search; /* Function to be used for searching */ 176 mtime_fn *mtime; /* Modify time function */ 177 kv *kvhash[NKVHASH]; /* Cached data */ 178 /* options available via amd conf file */ 179 char *cf_map_type; /* file, hesiod, ndbm, nis, etc. */ 180 char *cf_search_path; /* /etc/local:/etc/amdmaps:/misc/yp */ 181 void *map_data; /* Map data black box */ 182}; 183 184/* 185 * Mounting a file system may take a significant period of time. The 186 * problem is that if this is done in the main process thread then the 187 * entire automounter could be blocked, possibly hanging lots of processes 188 * on the system. Instead we use a continuation scheme to allow mounts to 189 * be attempted in a sub-process. When the sub-process exits we pick up the 190 * exit status (by convention a UN*X error number) and continue in a 191 * notifier. The notifier gets handed a data structure and can then 192 * determine whether the mount was successful or not. If not, it updates 193 * the data structure and tries again until there are no more ways to try 194 * the mount, or some other permanent error occurs. In the mean time no RPC 195 * reply is sent, even after the mount is successful. We rely on the RPC 196 * retry mechanism to resend the lookup request which can then be handled. 197 */ 198struct continuation { 199 char **ivec; /* Current mount info */ 200 am_node *mp; /* Node we are trying to mount */ 201 char *key; /* Map key */ 202 char *info; /* Info string */ 203 char **xivec; /* Saved strsplit vector */ 204 char *auto_opts; /* Automount options */ 205 am_opts fs_opts; /* Filesystem options */ 206 char *def_opts; /* Default automount options */ 207 int retry; /* Try again? */ 208 int tried; /* Have we tried any yet? */ 209 time_t start; /* Time we started this mount */ 210 int callout; /* Callout identifier */ 211}; 212 213 214/* 215 * EXTERNALS: 216 */ 217 218/* Amq server global functions */ 219extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp); 220extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp); 221extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp); 222extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp); 223extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp); 224extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp); 225extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp); 226extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp); 227extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp); 228extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp); 229 230/* other external definitions */ 231extern am_nfs_fh *root_fh(char *dir); 232extern am_node *find_ap(char *); 233extern am_node *find_ap2(char *, am_node *); 234extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead); 235extern fserver *find_nfs_srvr(mntfs *mf); 236extern int auto_fmount(am_node *mp); 237extern int auto_fumount(am_node *mp); 238extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *dir, char *fs_name, char *opts, mntfs *mf); 239extern int process_last_regular_map(void); 240extern int set_conf_kv(const char *section, const char *k, const char *v); 241extern int try_mount(voidp mvp); 242extern int yyparse (void); 243extern nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable); 244extern void amfs_auto_cont(int rc, int term, voidp closure); 245extern void amfs_auto_mkcacheref(mntfs *mf); 246extern void amfs_auto_retry(int rc, int term, voidp closure); 247extern void assign_error_mntfs(am_node *mp); 248extern void flush_srvr_nfs_cache(void); 249extern void free_continuation(struct continuation *cp); 250extern void mf_mounted(mntfs *mf); 251extern void quick_reply(am_node *mp, int error); 252extern void root_newmap(const char *, const char *, const char *, const cf_map_t *); 253 254/* amd global variables */ 255extern FILE *yyin; 256extern SVCXPRT *nfs_program_2_transp; /* For quick_reply() */ 257extern char *conf_tag; 258extern char *opt_gid; 259extern char *opt_uid; 260extern int NumChild; 261extern int fwd_sock; 262extern int select_intr_valid; 263extern int usage; 264extern int use_conf_file; /* use amd configuration file */ 265extern jmp_buf select_intr; 266extern qelem mfhead; 267extern struct am_opts fs_static; /* copy of the options to play with */ 268extern struct amu_global_options gopt; /* where global options are stored */ 269 270#ifdef HAVE_SIGACTION 271extern sigset_t masked_sigs; 272#endif /* HAVE_SIGACTION */ 273 274#if defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX) 275extern char *amfs_link_match(am_opts *fo); 276extern int amfs_link_fumount(mntfs *mf); 277#endif /* defined(HAVE_AMU_FS_LINK) || defined(HAVE_AMU_FS_LINKX) */ 278 279#ifdef HAVE_AMU_FS_NFSL 280extern char *nfs_match(am_opts *fo); 281#endif /* HAVE_AMU_FS_NFSL */ 282 283#if defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) 284extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp); 285#endif /* defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) */ 286 287/* Unix file system (irix) */ 288#ifdef HAVE_FS_XFS 289extern am_ops xfs_ops; /* Un*x file system */ 290#endif /* HAVE_FS_XFS */ 291 292/* Unix file system (irix) */ 293#ifdef HAVE_FS_EFS 294extern am_ops efs_ops; /* Un*x file system */ 295#endif /* HAVE_FS_EFS */ 296 297#endif /* not _AMD_H */ 298