amd.h revision 51292
1/* 2 * Copyright (c) 1997-1999 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.3 1999/02/04 07:24:14 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_ENABLE_DEFAULT_SELECTORS 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 */ 110 char *op_sys_ver; /* OS version */ 111 char *pid_file; /* PID file */ 112 char *sub_domain; /* local domain */ 113 char *map_options; /* global map options */ 114 char *map_type; /* global map type */ 115 char *search_path; /* search path for maps */ 116 char *mount_type; /* mount type for map */ 117 u_int flags; /* various CFM_* flags */ 118 int amfs_auto_retrans; /* NFS retransmit counter */ 119 int amfs_auto_timeo; /* NFS retry interval */ 120 int am_timeo; /* cache duration */ 121 int am_timeo_w; /* dismount interval */ 122 int portmap_program; /* amd RPC program number */ 123#ifdef HAVE_MAP_HESIOD 124 char *hesiod_base; /* Hesiod rhs */ 125#endif /* HAVE_MAP_HESIOD */ 126#ifdef HAVE_MAP_LDAP 127 char *ldap_base; /* LDAP base */ 128 char *ldap_hostports; /* LDAP host ports */ 129 long ldap_cache_seconds; /* LDAP internal cache - keep seconds */ 130 long ldap_cache_maxmem; /* LDAP internal cache - max memory (bytes) */ 131#endif /* HAVE_MAP_LDAP */ 132#ifdef HAVE_MAP_NIS 133 char *nis_domain; /* YP domain name */ 134#endif /* HAVE_MAP_NIS */ 135}; 136 137/* if you add anything here, update conf.c:reset_cf_map() */ 138struct cf_map { 139 char *cfm_dir; /* /home, /u, /src */ 140 char *cfm_name; /* amd.home, /etc/amd.home ... */ 141 char *cfm_type; /* file, hesiod, ndbm, nis ... */ 142 char *cfm_opts; /* -cache:=all, etc. */ 143 char *cfm_search_path; /* /etc/local:/etc/amdmaps:/misc/yp */ 144 char *cfm_tag; /* optional map tag for amd -T */ 145 u_int cfm_flags; /* browsable_dirs? mount_type? */ 146}; 147 148/* 149 * Key-value pair 150 */ 151struct kv { 152 kv *next; 153 char *key; 154#ifdef HAVE_REGEXEC 155 regex_t re; /* store the regexp from regcomp() */ 156#endif /* HAVE_REGEXEC */ 157 char *val; 158}; 159 160struct mnt_map { 161 qelem hdr; 162 int refc; /* Reference count */ 163 short flags; /* Allocation flags */ 164 short alloc; /* Allocation mode */ 165 time_t modify; /* Modify time of map */ 166 char *map_name; /* Name of this map */ 167 char *wildcard; /* Wildcard value */ 168 reload_fn *reload; /* Function to be used for reloads */ 169 isup_fn *isup; /* Is service up or not? (1=up, 0=down) */ 170 search_fn *search; /* Function to be used for searching */ 171 mtime_fn *mtime; /* Modify time function */ 172 kv *kvhash[NKVHASH]; /* Cached data */ 173 /* options available via amd conf file */ 174 char *cf_map_type; /* file, hesiod, ndbm, nis, etc. */ 175 char *cf_search_path; /* /etc/local:/etc/amdmaps:/misc/yp */ 176 void *map_data; /* Map data black box */ 177}; 178 179/* 180 * Mounting a file system may take a significant period of time. The 181 * problem is that if this is done in the main process thread then the 182 * entire automounter could be blocked, possibly hanging lots of processes 183 * on the system. Instead we use a continuation scheme to allow mounts to 184 * be attempted in a sub-process. When the sub-process exits we pick up the 185 * exit status (by convention a UN*X error number) and continue in a 186 * notifier. The notifier gets handed a data structure and can then 187 * determine whether the mount was successful or not. If not, it updates 188 * the data structure and tries again until there are no more ways to try 189 * the mount, or some other permanent error occurs. In the mean time no RPC 190 * reply is sent, even after the mount is successful. We rely on the RPC 191 * retry mechanism to resend the lookup request which can then be handled. 192 */ 193struct continuation { 194 char **ivec; /* Current mount info */ 195 am_node *mp; /* Node we are trying to mount */ 196 char *key; /* Map key */ 197 char *info; /* Info string */ 198 char **xivec; /* Saved strsplit vector */ 199 char *auto_opts; /* Automount options */ 200 am_opts fs_opts; /* Filesystem options */ 201 char *def_opts; /* Default automount options */ 202 int retry; /* Try again? */ 203 int tried; /* Have we tried any yet? */ 204 time_t start; /* Time we started this mount */ 205 int callout; /* Callout identifier */ 206}; 207 208 209/* 210 * EXTERNALS: 211 */ 212 213/* Amq server global functions */ 214extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp); 215extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp); 216extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp); 217extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp); 218extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp); 219extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp); 220extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp); 221extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp); 222extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp); 223extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp); 224 225/* other external definitions */ 226extern am_nfs_fh *root_fh(char *dir); 227extern am_node * autofs_lookuppn(am_node *mp, char *fname, int *error_return, int op); 228extern am_node *find_ap(char *); 229extern am_node *find_ap2(char *, am_node *); 230extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead); 231extern fserver *find_nfs_srvr(mntfs *mf); 232extern int auto_fmount(am_node *mp); 233extern int auto_fumount(am_node *mp); 234extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *dir, char *fs_name, char *opts, mntfs *mf); 235extern int process_last_regular_map(void); 236extern int set_conf_kv(const char *section, const char *k, const char *v); 237extern int try_mount(voidp mvp); 238extern int yyparse (void); 239extern nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable); 240extern void amfs_auto_cont(int rc, int term, voidp closure); 241extern void amfs_auto_mkcacheref(mntfs *mf); 242extern void amfs_auto_retry(int rc, int term, voidp closure); 243extern void assign_error_mntfs(am_node *mp); 244extern void flush_srvr_nfs_cache(void); 245extern void free_continuation(struct continuation *cp); 246extern void mf_mounted(mntfs *mf); 247extern void quick_reply(am_node *mp, int error); 248extern void root_newmap(const char *, const char *, const char *, const cf_map_t *); 249 250/* amd global variables */ 251extern FILE *yyin; 252extern SVCXPRT *nfs_program_2_transp; /* For quick_reply() */ 253extern char *conf_tag; 254extern int NumChild; 255extern int fwd_sock; 256extern int select_intr_valid; 257extern int usage; 258extern int use_conf_file; /* use amd configuration file */ 259extern jmp_buf select_intr; 260extern qelem mfhead; 261extern struct amu_global_options gopt; /* where global options are stored */ 262 263#ifdef HAVE_SIGACTION 264extern sigset_t masked_sigs; 265#endif /* HAVE_SIGACTION */ 266 267#if defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX) 268extern char *amfs_link_match(am_opts *fo); 269extern int amfs_link_fumount(mntfs *mf); 270#endif /* defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX) */ 271 272#ifdef HAVE_AM_FS_NFSL 273extern char *nfs_match(am_opts *fo); 274#endif /* HAVE_AM_FS_NFSL */ 275 276#if defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) 277extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp); 278#endif /* defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) */ 279 280#ifdef HAVE_FS_AUTOFS 281extern SVCXPRT *autofsxprt; 282extern u_short autofs_port; 283extern int amd_use_autofs; 284 285extern int autofs_mount(am_node *mp); 286extern int autofs_umount(am_node *mp); 287extern int create_autofs_service(int *soAUTOFSp, u_short *autofs_portp, SVCXPRT **autofs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp)); 288extern int svc_create_local_service(void (*dispatch) (), u_long prognum, u_long versnum, char *nettype, char *servname); 289extern void autofs_mounted(mntfs *mf); 290extern void autofs_program_1(struct svc_req *rqstp, SVCXPRT *transp); 291#endif /* HAVE_FS_AUTOFS */ 292 293/* Unix file system (irix) */ 294#ifdef HAVE_FS_XFS 295extern am_ops xfs_ops; /* Un*x file system */ 296#endif /* HAVE_FS_XFS */ 297 298/* Unix file system (irix) */ 299#ifdef HAVE_FS_EFS 300extern am_ops efs_ops; /* Un*x file system */ 301#endif /* HAVE_FS_EFS */ 302 303#endif /* not _AMD_H */ 304