amd.h revision 38494
1/* 2 * Copyright (c) 1997-1998 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 acknowledgement: 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.1 1996/01/13 23:23:39 ezk Exp ezk $ 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 182 * the entire automounter could be blocked, possibly hanging lots of 183 * processes on the system. Instead we use a continuation scheme to 184 * allow mounts to be attempted in a sub-process. When the sub-process 185 * exits we pick up the exit status (by convention a UN*X error number) 186 * and continue in a notifier. The notifier gets handed a data structure 187 * and can then determine whether the mount was successful or not. If 188 * not, it updates the data structure and tries again until there are no 189 * more ways to try the mount, or some other permanent error occurs. 190 * In the mean time no RPC reply is sent, even after the mount is succesful. 191 * We rely on the RPC retry mechanism to resend the lookup request which 192 * can then be handled. 193 */ 194struct continuation { 195 char **ivec; /* Current mount info */ 196 am_node *mp; /* Node we are trying to mount */ 197 char *key; /* Map key */ 198 char *info; /* Info string */ 199 char **xivec; /* Saved strsplit vector */ 200 char *auto_opts; /* Automount options */ 201 am_opts fs_opts; /* Filesystem options */ 202 char *def_opts; /* Default automount options */ 203 int retry; /* Try again? */ 204 int tried; /* Have we tried any yet? */ 205 time_t start; /* Time we started this mount */ 206 int callout; /* Callout identifier */ 207}; 208 209 210/* 211 * EXTERNALS: 212 */ 213 214/* Amq server global functions */ 215extern amq_mount_info_list *amqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp); 216extern amq_mount_stats *amqproc_stats_1_svc(voidp argp, struct svc_req *rqstp); 217extern amq_mount_tree_list *amqproc_export_1_svc(voidp argp, struct svc_req *rqstp); 218extern amq_mount_tree_p *amqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp); 219extern amq_string *amqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp); 220extern int *amqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp); 221extern int *amqproc_mount_1_svc(voidp argp, struct svc_req *rqstp); 222extern int *amqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp); 223extern voidp amqproc_null_1_svc(voidp argp, struct svc_req *rqstp); 224extern voidp amqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp); 225 226/* other external definitions */ 227extern am_nfs_fh *root_fh(char *dir); 228extern am_node * autofs_lookuppn(am_node *mp, char *fname, int *error_return, int op); 229extern am_node *find_ap(char *); 230extern am_node *find_ap2(char *, am_node *); 231extern bool_t xdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead); 232extern fserver *find_nfs_srvr(mntfs *mf); 233extern int auto_fmount(am_node *mp); 234extern int auto_fumount(am_node *mp); 235extern int mount_nfs_fh(am_nfs_handle_t *fhp, char *dir, char *fs_name, char *opts, mntfs *mf); 236extern int process_last_regular_map(void); 237extern int set_conf_kv(const char *section, const char *k, const char *v); 238extern int try_mount(voidp mvp); 239extern int yyparse (void); 240extern nfsentry *make_entry_chain(am_node *mp, const nfsentry *current_chain, int fully_browsable); 241extern void amfs_auto_cont(int rc, int term, voidp closure); 242extern void amfs_auto_mkcacheref(mntfs *mf); 243extern void amfs_auto_retry(int rc, int term, voidp closure); 244extern void assign_error_mntfs(am_node *mp); 245extern void flush_srvr_nfs_cache(void); 246extern void free_continuation(struct continuation *cp); 247extern void mf_mounted(mntfs *mf); 248extern void quick_reply(am_node *mp, int error); 249extern void root_newmap(const char *, const char *, const char *, const cf_map_t *); 250 251/* amd global variables */ 252extern FILE *yyin; 253extern SVCXPRT *nfs_program_2_transp; /* For quick_reply() */ 254extern char *conf_tag; 255extern int NumChild; 256extern int fwd_sock; 257extern int select_intr_valid; 258extern int usage; 259extern int use_conf_file; /* use amd configuration file */ 260extern jmp_buf select_intr; 261extern qelem mfhead; 262extern struct amu_global_options gopt; /* where global options are stored */ 263 264#ifdef HAVE_SIGACTION 265extern sigset_t masked_sigs; 266#endif /* HAVE_SIGACTION */ 267 268#if defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX) 269extern char *amfs_link_match(am_opts *fo); 270extern int amfs_link_fumount(mntfs *mf); 271#endif /* defined(HAVE_AM_FS_LINK) || defined(HAVE_AM_FS_LINKX) */ 272 273#ifdef HAVE_AM_FS_NFSL 274extern char *nfs_match(am_opts *fo); 275#endif /* HAVE_AM_FS_NFSL */ 276 277#if defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) 278extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp); 279#endif /* defined(HAVE_FS_NFS3) && !defined(HAVE_XDR_MOUNTRES3) */ 280 281#ifdef HAVE_FS_AUTOFS 282extern SVCXPRT *autofsxprt; 283extern u_short autofs_port; 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