BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.sbin / amd / include / am.h
index e53a9d5..16cbe12 100644 (file)
@@ -1,6 +1,4 @@
 /*
 /*
- * $Id: am.h,v 5.2 90/06/23 22:20:28 jsp Rel $
- *
  * Copyright (c) 1990 Jan-Simon Pendry
  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  * Copyright (c) 1990 The Regents of the University of California.
  * Copyright (c) 1990 Jan-Simon Pendry
  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  * Copyright (c) 1990 The Regents of the University of California.
@@ -9,71 +7,52 @@
  * This code is derived from software contributed to Berkeley by
  * Jan-Simon Pendry at Imperial College, London.
  *
  * This code is derived from software contributed to Berkeley by
  * Jan-Simon Pendry at Imperial College, London.
  *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement:  ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)am.h        5.3 (Berkeley) 5/12/91
+ *
+ * $Id: am.h,v 5.2.1.8 91/05/07 22:19:18 jsp Alpha $
  *
  *
- *     @(#)am.h        5.1 (Berkeley) 7/19/90
- */
-
-/*
- * Get this in now so that OS_HDR can use it
- */
-#ifdef __STDC__
-#define        P(x) x
-#define        P_void void
-#else
-#define P(x) ()
-#define P_void /* as nothing */
-#define const /* as nothing */
-#endif /* __STDC__ */
-
-#ifdef __GNUC__
-#define INLINE /* __inline */
-#else
-#define        INLINE
-#endif /* __GNUC__ */
-
-/*
- * Pick up target dependent definitions
  */
  */
-#include "os-defaults.h"
-#include OS_HDR
 
 
-#ifndef UPDATE_MTAB
-#define        unlock_mntlist()
-#endif /* UPDATE_MTAB */
-
-#ifdef VOIDP
-typedef void *voidp;
-#else
-typedef char *voidp;
-#endif /* VOIDP */
+#include "config.h"
 
 /*
  * Global declarations
  */
 
 /*
  * Global declarations
  */
-#include <stdio.h>
 #include <sys/param.h>
 #include <sys/param.h>
-#include <sys/errno.h>
-extern int errno;
 #include <sys/socket.h>
 #include <rpc/rpc.h>
 #include "nfs_prot.h"
 #ifdef MNTENT_HDR
 #include MNTENT_HDR
 #endif /* MNTENT_HDR */
 #include <sys/socket.h>
 #include <rpc/rpc.h>
 #include "nfs_prot.h"
 #ifdef MNTENT_HDR
 #include MNTENT_HDR
 #endif /* MNTENT_HDR */
-#include <sys/time.h>
 #include <assert.h>
 
 #ifdef DEBUG_MEM
 #include <assert.h>
 
 #ifdef DEBUG_MEM
@@ -106,64 +85,12 @@ extern int restart_existing_mounts;
 #ifdef HAS_NIS_MAPS
 extern char *domain;           /* NIS domain to use */
 #endif /* HAS_NIS_MAPS */
 #ifdef HAS_NIS_MAPS
 extern char *domain;           /* NIS domain to use */
 #endif /* HAS_NIS_MAPS */
-extern FILE *logfp;            /* Log file */
-extern int xlog_level;         /* Logging level */
-#ifdef HAS_SYSLOG
-extern int syslogging;         /* Really using syslog */
-#endif /* HAS_SYSLOG */
 extern int am_timeo;           /* Cache period */
 extern int afs_timeo;          /* AFS timeout */
 extern int afs_retrans;                /* AFS retrans */
 extern int am_timeo_w;         /* Unmount timeout */
 extern char *mtab;             /* Mount table */
 
 extern int am_timeo;           /* Cache period */
 extern int afs_timeo;          /* AFS timeout */
 extern int afs_retrans;                /* AFS retrans */
 extern int am_timeo_w;         /* Unmount timeout */
 extern char *mtab;             /* Mount table */
 
-#define        XLOG_FATAL      0x0001
-#define        XLOG_ERROR      0x0002
-#define        XLOG_USER       0x0004
-#define        XLOG_WARNING    0x0008
-#define        XLOG_INFO       0x0010
-#define        XLOG_DEBUG      0x0020
-#define        XLOG_MAP        0x0040
-#define        XLOG_STATS      0x0080
-
-#define XLOG_DEFSTR    "all,nomap,nostats"             /* Default log options */
-#define XLOG_ALL       (XLOG_FATAL|XLOG_ERROR|XLOG_USER|XLOG_WARNING|XLOG_INFO|XLOG_MAP|XLOG_STATS)
-
-#ifdef DEBUG
-#ifdef DEBUG_MEM
-#define free(x) xfree(__FILE__,__LINE__,x)
-#endif /* DEBUG_MEM */
-
-#define        DEBUG_MTAB      "./mtab"
-
-extern int debug_flags;                /* Debug options */
-
-#define        D_DAEMON        0x0001  /* Enter daemon mode */
-#define        D_TRACE         0x0002  /* Do protocol trace */
-#define        D_FULL          0x0004  /* Do full trace */
-#define        D_MTAB          0x0008  /* Use local mtab */
-#define        D_AMQ           0x0010  /* Register amq program */
-#define        D_STR           0x0020  /* Debug string munging */
-#define        D_MEM           0x0040  /* Trace memory allocations */
-
-/*
- * Normally, don't enter daemon mode, and don't register amq
- */
-#define        D_TEST  (~(D_DAEMON|D_MEM|D_STR))
-#define        D_ALL   (~0)
-
-#define Debug(x) if (!(debug_flags & (x))) ; else
-#define dlog Debug(D_FULL) dplog
-#endif /* DEBUG */
-
-/*
- * Option tables
- */
-struct opt_tab {
-       char *opt;
-       int flag;
-};
-
 typedef enum {
        Start,
        Run,
 typedef enum {
        Start,
        Run,
@@ -179,9 +106,7 @@ extern time_t do_mapc_reload;       /* Flush & reload mount map cache */
 /*
  * Useful constants
  */
 /*
  * Useful constants
  */
-extern char *progname;         /* "amd" */
 extern char pid_fsname[];      /* kiska.southseas.nz:(pid%d) */
 extern char pid_fsname[];      /* kiska.southseas.nz:(pid%d) */
-extern char hostname[];                /* "kiska" */
 extern char hostd[];           /* "kiska.southseas.nz" */
 extern char *hostdomain;       /* "southseas.nz" */
 extern char *op_sys;           /* "sos4" */
 extern char hostd[];           /* "kiska.southseas.nz" */
 extern char *hostdomain;       /* "southseas.nz" */
 extern char *op_sys;           /* "sos4" */
@@ -190,6 +115,7 @@ extern char *karch;         /* "sun4c" */
 extern char *cluster;          /* "r+d-kluster" */
 extern char *endian;           /* "big" */
 extern char *auto_dir;         /* "/a" */
 extern char *cluster;          /* "r+d-kluster" */
 extern char *endian;           /* "big" */
 extern char *auto_dir;         /* "/a" */
+extern char copyright[];       /* Copyright info */
 extern char version[];         /* Version info */
 
 typedef struct am_ops am_ops;
 extern char version[];         /* Version info */
 
 typedef struct am_ops am_ops;
@@ -199,18 +125,35 @@ typedef struct mntfs mntfs;
 typedef struct fserver fserver;
 typedef struct fsrvinfo fsrvinfo;
 
 typedef struct fserver fserver;
 typedef struct fsrvinfo fsrvinfo;
 
+/*
+ * Debug defns.
+ */
+#ifdef DEBUG
+#define        DEBUG_MTAB      "./mtab"
+
+extern int debug_flags;                /* Debug options */
+
+#define        D_DAEMON        0x0001  /* Enter daemon mode */
+#define        D_TRACE         0x0002  /* Do protocol trace */
+#define        D_FULL          0x0004  /* Do full trace */
+#define        D_MTAB          0x0008  /* Use local mtab */
+#define        D_AMQ           0x0010  /* Register amq program */
+#define        D_STR           0x0020  /* Debug string munging */
+#define        D_MEM           0x0040  /* Trace memory allocations */
+
+/*
+ * Normally, don't enter daemon mode, and don't register amq
+ */
+#define        D_TEST  (~(D_DAEMON|D_MEM|D_STR))
+#endif /* DEBUG */
+
 /*
  * Global variables.
  */
 extern unsigned short nfs_port;        /* Our NFS service port */
 /*
  * Global variables.
  */
 extern unsigned short nfs_port;        /* Our NFS service port */
-extern int mypid;              /* Current process id */
 extern struct in_addr myipaddr;        /* (An) IP address of this host */
 
 extern int foreground;         /* Foreground process */
 extern struct in_addr myipaddr;        /* (An) IP address of this host */
 
 extern int foreground;         /* Foreground process */
-extern int orig_umask;         /* umask() on startup */
-#define clocktime() (clock_valid ? clock_valid : time(&clock_valid))
-extern time_t time P((time_t *));
-extern time_t clock_valid;     /* Clock needs recalculating */
 extern time_t next_softclock;  /* Time to call softclock() */
 extern int task_notify_todo;   /* Task notifier needs running */
 #ifdef HAS_TFS
 extern time_t next_softclock;  /* Time to call softclock() */
 extern int task_notify_todo;   /* Task notifier needs running */
 #ifdef HAS_TFS
@@ -218,9 +161,12 @@ extern int nfs_server_code_available;
 #endif /* HAS_TFS */
 extern int last_used_map;      /* Last map being used for mounts */
 extern AUTH *nfs_auth;         /* Dummy uthorisation for remote servers */
 #endif /* HAS_TFS */
 extern int last_used_map;      /* Last map being used for mounts */
 extern AUTH *nfs_auth;         /* Dummy uthorisation for remote servers */
-extern am_node *exported_ap[]; /* List of nodes */
+extern am_node **exported_ap;  /* List of nodes */
 extern int first_free_map;     /* First free node */
 extern int first_free_map;     /* First free node */
-#define        NEXP_AP (256)
+extern am_node *root_node;     /* Node for "root" */
+extern char *wire;             /* Name of primary connected network */
+#define        NEXP_AP (254)
+#define NEXP_AP_MARGIN (128)
 
 typedef int (*task_fun)P((voidp));
 typedef void (*cb_fun)P((int, int, voidp));
 
 typedef int (*task_fun)P((voidp));
 typedef void (*cb_fun)P((int, int, voidp));
@@ -266,7 +212,7 @@ typedef struct mnt_map mnt_map;
 /*
  * Global routines
  */
 /*
  * Global routines
  */
-extern int atoi P((const char *)); /* C */
+extern int atoi P((Const char *)); /* C */
 extern void am_mounted P((am_node*));
 extern void am_unmounted P((am_node*));
 extern int background(P_void);
 extern void am_mounted P((am_node*));
 extern void am_unmounted P((am_node*));
 extern int background(P_void);
@@ -275,9 +221,8 @@ extern int compute_mount_flags P((struct mntent *));
 extern int softclock(P_void);
 #ifdef DEBUG
 extern int debug_option P((char*));
 extern int softclock(P_void);
 #ifdef DEBUG
 extern int debug_option P((char*));
-extern void dplog ();
-/*extern void dplog P((char*, ...));*/
 #endif /* DEBUG */
 #endif /* DEBUG */
+extern void deslashify P((char*));
 /*extern void domain_strip P((char*, char*));*/
 extern mntfs* dup_mntfs P((mntfs*));
 extern fserver* dup_srvr P((fserver*));
 /*extern void domain_strip P((char*, char*));*/
 extern mntfs* dup_mntfs P((mntfs*));
 extern fserver* dup_srvr P((fserver*));
@@ -285,49 +230,60 @@ extern int eval_fs_opts P((am_opts*, char*, char*, char*, char*, char*));
 extern char* expand_key P((char*));
 extern am_node* exported_ap_alloc(P_void);
 extern am_node* find_ap P((char*));
 extern char* expand_key P((char*));
 extern am_node* exported_ap_alloc(P_void);
 extern am_node* find_ap P((char*));
-extern mntfs* find_mntfs P((am_ops*, am_opts*, char*, char*, char*));
+extern am_node* find_mf P((mntfs*));
+extern mntfs* find_mntfs P((am_ops*, am_opts*, char*, char*, char*, char*));
 extern void flush_mntfs(P_void);
 extern void flush_mntfs(P_void);
+extern void flush_nfs_fhandle_cache P((fserver*));
+extern void forcibly_timeout_mp P((am_node*));
 extern FREE_RETURN_TYPE free P((voidp)); /* C */
 extern void free_mntfs P((mntfs*));
 extern void free_opts P((am_opts*));
 extern void free_map P((am_node*));
 extern void free_mntlist P((mntlist*));
 extern FREE_RETURN_TYPE free P((voidp)); /* C */
 extern void free_mntfs P((mntfs*));
 extern void free_opts P((am_opts*));
 extern void free_map P((am_node*));
 extern void free_mntlist P((mntlist*));
+extern void free_srvr P((fserver*));
 extern int fwd_init(P_void);
 extern int fwd_packet P((int, voidp, int, struct sockaddr_in *,
                struct sockaddr_in *, voidp, fwd_fun));
 extern void fwd_reply(P_void);
 extern void get_args P((int, char*[]));
 extern int fwd_init(P_void);
 extern int fwd_packet P((int, voidp, int, struct sockaddr_in *,
                struct sockaddr_in *, voidp, fwd_fun));
 extern void fwd_reply(P_void);
 extern void get_args P((int, char*[]));
-extern void going_down P((int));
+extern char *getwire P((void));
 #ifdef NEED_MNTOPT_PARSER
 extern char *hasmntopt P((struct mntent*, char*));
 #endif /* NEED_MNTOPT_PARSER */
 extern int hasmntval P((struct mntent*, char*));
 extern void host_normalize P((char **));
 #ifdef NEED_MNTOPT_PARSER
 extern char *hasmntopt P((struct mntent*, char*));
 #endif /* NEED_MNTOPT_PARSER */
 extern int hasmntval P((struct mntent*, char*));
 extern void host_normalize P((char **));
+extern char *inet_dquad P((char*, unsigned long));
 extern void init_map P((am_node*, char*));
 extern void insert_am P((am_node*, am_node*));
 extern void ins_que P((qelem*, qelem*));
 extern void init_map P((am_node*, char*));
 extern void insert_am P((am_node*, am_node*));
 extern void ins_que P((qelem*, qelem*));
+extern int make_nfs_auth P((void));
 extern void make_root_node(P_void);
 extern int make_rpc_packet P((char*, int, u_long, struct rpc_msg*, voidp, xdrproc_t, AUTH*));
 extern void make_root_node(P_void);
 extern int make_rpc_packet P((char*, int, u_long, struct rpc_msg*, voidp, xdrproc_t, AUTH*));
+extern void map_flush_srvr P((fserver*));
 extern void mapc_add_kv P((mnt_map*, char*, char*));
 extern mnt_map* mapc_find P((char*, char*));
 extern void mapc_free P((mnt_map*));
 extern void mapc_add_kv P((mnt_map*, char*, char*));
 extern mnt_map* mapc_find P((char*, char*));
 extern void mapc_free P((mnt_map*));
+extern int mapc_keyiter P((mnt_map*, void (*)(char*,voidp), voidp));
 extern int mapc_search P((mnt_map*, char*, char**));
 extern void mapc_reload(P_void);
 extern void mapc_showtypes P((FILE*));
 extern int mkdirs P((char*, int));
 extern int mapc_search P((mnt_map*, char*, char**));
 extern void mapc_reload(P_void);
 extern void mapc_showtypes P((FILE*));
 extern int mkdirs P((char*, int));
+extern void mk_fattr P((am_node*, enum ftype));
 extern void mnt_free P((struct mntent*));
 extern void mnt_free P((struct mntent*));
+extern int mount_auto_node P((char*, voidp));
 extern int mount_automounter P((int));
 extern int mount_exported(P_void);
 extern int mount_automounter P((int));
 extern int mount_exported(P_void);
+extern int mount_fs P((struct mntent*, int, caddr_t, int, MTYPE_TYPE));
 extern int mount_node P((am_node*));
 extern mntfs* new_mntfs(P_void);
 extern void new_ttl P((am_node*));
 extern am_node* next_map P((int*));
 extern int nfs_srvr_port P((fserver*, u_short*, voidp));
 extern int mount_node P((am_node*));
 extern mntfs* new_mntfs(P_void);
 extern void new_ttl P((am_node*));
 extern am_node* next_map P((int*));
 extern int nfs_srvr_port P((fserver*, u_short*, voidp));
+extern void normalize_slash P((char*));
+extern void ops_showfstypes P((FILE*));
 extern int pickup_rpc_reply P((voidp, int, voidp, xdrproc_t));
 extern int pickup_rpc_reply P((voidp, int, voidp, xdrproc_t));
-extern void plog ();
-/*extern void plog P((int, char*, ...));*/
 extern mntlist* read_mtab P((char*));
 extern mntlist* read_mtab P((char*));
-extern mntfs* realloc_mntfs  P((mntfs*, am_ops*, am_opts*, char*, char*, char*));
+extern mntfs* realloc_mntfs  P((mntfs*, am_ops*, am_opts*, char*, char*, char*, char*));
 extern void rem_que P((qelem*));
 extern void reschedule_timeout_mp(P_void);
 extern void restart(P_void);
 extern void rem_que P((qelem*));
 extern void reschedule_timeout_mp(P_void);
 extern void restart(P_void);
@@ -336,28 +292,30 @@ extern void rewrite_mtab P((mntlist *));
 #endif /* UPDATE_MTAB */
 extern void rmdirs P((char*));
 extern am_node* root_ap P((char*, int));
 #endif /* UPDATE_MTAB */
 extern void rmdirs P((char*));
 extern am_node* root_ap P((char*, int));
+extern int root_keyiter P((void (*)(char*,voidp), voidp));
 extern void root_newmap P((char*, char*, char*));
 extern void rpc_msg_init P((struct rpc_msg*, u_long, u_long, u_long));
 extern void run_task P((task_fun, voidp, cb_fun, voidp));
 extern void sched_task P((cb_fun, voidp, voidp));
 extern void root_newmap P((char*, char*, char*));
 extern void rpc_msg_init P((struct rpc_msg*, u_long, u_long, u_long));
 extern void run_task P((task_fun, voidp, cb_fun, voidp));
 extern void sched_task P((cb_fun, voidp, voidp));
-extern void show_rcs_info P((const char*, char*));
+extern void show_rcs_info P((Const char*, char*));
 extern void sigchld P((int));
 extern void srvrlog P((fserver*, char*));
 extern char* str3cat P((char*, char*, char*, char*));
 extern void sigchld P((int));
 extern void srvrlog P((fserver*, char*));
 extern char* str3cat P((char*, char*, char*, char*));
-extern char* strcat P((char*, const char*)); /* C */
-extern char* strchr P((const char*, int)); /* C */
-extern int strcmp P((const char*, const char*)); /* C */
-extern char* strdup P((const char*));
-extern int strlen P((const char*)); /* C */
-extern char* strnsave P((const char*, int));
-extern char* strrchr P((const char*, int)); /* C */
+extern char* strcat P((char*, Const char*)); /* C */
+extern int strcmp P((Const char*, Const char*)); /* C */
+extern char* strdup P((Const char*));
+extern int strlen P((Const char*)); /* C */
+extern char* strnsave P((Const char*, int));
+extern char* strrchr P((Const char*, int)); /* C */
 extern char* strealloc P((char*, char *));
 extern char* strealloc P((char*, char *));
-extern char** strsplit P((char*, int));
+extern char** strsplit P((char*, int, int));
 extern int switch_option P((char*));
 extern int switch_option P((char*));
-extern void task_notify(P_void);
+extern int switch_to_logfile P((char*));
+extern void do_task_notify(P_void);
 extern int timeout P((unsigned int, void (*fn)(), voidp));
 extern void timeout_mp(P_void);
 extern void umount_exported(P_void);
 extern int timeout P((unsigned int, void (*fn)(), voidp));
 extern void timeout_mp(P_void);
 extern void umount_exported(P_void);
+extern int umount_fs P((char*));
 /*extern int unmount_node P((am_node*));
 extern int unmount_node_wrap P((voidp));*/
 extern void unregister_amq(P_void);
 /*extern int unmount_node P((am_node*));
 extern int unmount_node_wrap P((voidp));*/
 extern void unregister_amq(P_void);
@@ -367,8 +325,12 @@ extern void wakeup P((voidp));
 extern void wakeup_task P((int,int,voidp));
 extern void wakeup_srvr P((fserver*));
 extern void write_mntent P((struct mntent*));
 extern void wakeup_task P((int,int,voidp));
 extern void wakeup_srvr P((fserver*));
 extern void write_mntent P((struct mntent*));
-extern voidp xmalloc P((int));
-extern voidp xrealloc P((voidp, int));
+#ifdef UPDATE_MTAB
+extern void unlock_mntlist P((void));
+#else
+#define        unlock_mntlist()
+#endif /* UPDATE_MTAB */
+
 
 #define        ALLOC(ty)       ((struct ty *) xmalloc(sizeof(struct ty)))
 
 
 #define        ALLOC(ty)       ((struct ty *) xmalloc(sizeof(struct ty)))
 
@@ -416,15 +378,21 @@ extern am_node *fh_to_mp P((nfs_fh*));
 extern am_node *fh_to_mp3 P((nfs_fh*,int*,int));
 extern void mp_to_fh P((am_node*, nfs_fh*));
 #define        fh_to_mp2(fhp, rp) fh_to_mp3(fhp, rp, VLOOK_CREATE)
 extern am_node *fh_to_mp3 P((nfs_fh*,int*,int));
 extern void mp_to_fh P((am_node*, nfs_fh*));
 #define        fh_to_mp2(fhp, rp) fh_to_mp3(fhp, rp, VLOOK_CREATE)
+extern int auto_fmount P((am_node *mp));
+extern int auto_fumount P((am_node *mp));
+
+#define        MAX_READDIR_ENTRIES     16
 
 
-typedef int    (*vfs_match)P((am_opts*));
+typedef char*  (*vfs_match)P((am_opts*));
 typedef int    (*vfs_init)P((mntfs*));
 typedef int    (*vmount_fs)P((am_node*));
 typedef int    (*vfs_init)P((mntfs*));
 typedef int    (*vmount_fs)P((am_node*));
+typedef int    (*vfmount_fs)P((mntfs*));
 typedef int    (*vumount_fs)P((am_node*));
 typedef int    (*vumount_fs)P((am_node*));
+typedef int    (*vfumount_fs)P((mntfs*));
 typedef am_node*(*vlookuppn)P((am_node*, char*, int*, int));
 typedef am_node*(*vlookuppn)P((am_node*, char*, int*, int));
-typedef int    (*vreaddir)P((am_node*, nfscookie, dirlist*, entry*));
+typedef int    (*vreaddir)P((am_node*, nfscookie, dirlist*, entry*, int));
 typedef am_node*(*vreadlink)P((am_node*, int*));
 typedef am_node*(*vreadlink)P((am_node*, int*));
-typedef int    (*vmounted)P((mntfs*));
+typedef void   (*vmounted)P((mntfs*));
 typedef void   (*vumounted)P((am_node*));
 typedef fserver*(*vffserver)P((mntfs*));
 
 typedef void   (*vumounted)P((am_node*));
 typedef fserver*(*vffserver)P((mntfs*));
 
@@ -433,7 +401,9 @@ struct am_ops {
        vfs_match       fs_match;
        vfs_init        fs_init;
        vmount_fs       mount_fs;
        vfs_match       fs_match;
        vfs_init        fs_init;
        vmount_fs       mount_fs;
+       vfmount_fs      fmount_fs;
        vumount_fs      umount_fs;
        vumount_fs      umount_fs;
+       vfumount_fs     fumount_fs;
        vlookuppn       lookuppn;
        vreaddir        readdir;
        vreadlink       readlink;
        vlookuppn       lookuppn;
        vreaddir        readdir;
        vreadlink       readlink;
@@ -443,15 +413,15 @@ struct am_ops {
        int             fs_flags;
 };
 extern am_node *efs_lookuppn P((am_node*, char*, int*, int));
        int             fs_flags;
 };
 extern am_node *efs_lookuppn P((am_node*, char*, int*, int));
-extern int efs_readdir P((am_node*, nfscookie, dirlist*, entry*));
+extern int efs_readdir P((am_node*, nfscookie, dirlist*, entry*, int));
 
 #define        VLOOK_CREATE    0x1
 #define        VLOOK_DELETE    0x2
 
 
 #define        VLOOK_CREATE    0x1
 #define        VLOOK_DELETE    0x2
 
-#define        FS_RETRY        0x0001          /* Retry this type of mount */
+#define FS_DIRECTORY   0x0001          /* This looks like a dir, not a link */
 #define        FS_MBACKGROUND  0x0002          /* Should background this mount */
 #define        FS_NOTIMEOUT    0x0004          /* Don't bother with timeouts */
 #define        FS_MBACKGROUND  0x0002          /* Should background this mount */
 #define        FS_NOTIMEOUT    0x0004          /* Don't bother with timeouts */
-#define FS_MKMNT       0x0008          /* Need to make the mkdir point */
+#define FS_MKMNT       0x0008          /* Need to make the mount point */
 #define FS_UBACKGROUND 0x0010          /* Unmount in background */
 #define        FS_BACKGROUND   (FS_MBACKGROUND|FS_UBACKGROUND)
 #define        FS_DISCARD      0x0020          /* Discard immediately on last reference */
 #define FS_UBACKGROUND 0x0010          /* Unmount in background */
 #define        FS_BACKGROUND   (FS_MBACKGROUND|FS_UBACKGROUND)
 #define        FS_DISCARD      0x0020          /* Discard immediately on last reference */
@@ -519,11 +489,10 @@ struct mntfs {
        qelem           mf_q;           /* List of mounted filesystems */
        am_ops          *mf_ops;        /* Operations on this mountpoint */
        am_opts         *mf_fo;         /* File opts */
        qelem           mf_q;           /* List of mounted filesystems */
        am_ops          *mf_ops;        /* Operations on this mountpoint */
        am_opts         *mf_fo;         /* File opts */
-       struct attrstat mf_attr;        /* File attributes */
-#define mf_fattr       mf_attr.attrstat_u.attributes
        char            *mf_mount;      /* "/a/kiska/home/kiska" */
        char            *mf_info;       /* Mount info */
        char            *mf_mount;      /* "/a/kiska/home/kiska" */
        char            *mf_info;       /* Mount info */
-       char            *mf_opts;       /* Mount opts */
+       char            *mf_auto;       /* Automount opts */
+       char            *mf_mopts;      /* FS mount opts */
        fserver         *mf_server;     /* File server */
        int             mf_flags;       /* Flags */
        int             mf_error;       /* Error code from background mount */
        fserver         *mf_server;     /* File server */
        int             mf_flags;       /* Flags */
        int             mf_error;       /* Error code from background mount */
@@ -559,6 +528,8 @@ struct am_node {
                        *am_ysib,       /* Younger sibling of this node */
                        *am_osib,       /* Older sibling of this node */
                        *am_child;      /* First child of this node */
                        *am_ysib,       /* Younger sibling of this node */
                        *am_osib,       /* Older sibling of this node */
                        *am_child;      /* First child of this node */
+       struct attrstat am_attr;        /* File attributes */
+#define am_fattr       am_attr.attrstat_u.attributes
        int             am_flags;       /* Boolean flags */
        int             am_error;       /* Specific mount error */
        time_t          am_ttl;         /* Time to live */
        int             am_flags;       /* Boolean flags */
        int             am_error;       /* Specific mount error */
        time_t          am_ttl;         /* Time to live */
@@ -571,7 +542,6 @@ struct am_node {
 
 #define        AMF_NOTIMEOUT   0x0001          /* This node never times out */
 #define        AMF_ROOT        0x0002          /* This is a root node */
 
 #define        AMF_NOTIMEOUT   0x0001          /* This node never times out */
 #define        AMF_ROOT        0x0002          /* This is a root node */
-#define AMF_MKPATH     0x0004          /* Delete this node's am_path */
 
 #define        ONE_HOUR        (60 * 60)       /* One hour in seconds */
 
 
 #define        ONE_HOUR        (60 * 60)       /* One hour in seconds */
 
@@ -583,8 +553,8 @@ struct am_node {
 #define        AM_TTL_W                (2 * 60)        /* Default unmount interval */
 #define        AM_PINGER               30              /* NFS ping interval for live systems */
 #define        AFS_TIMEO               8               /* Default afs timeout - .8s */
 #define        AM_TTL_W                (2 * 60)        /* Default unmount interval */
 #define        AM_PINGER               30              /* NFS ping interval for live systems */
 #define        AFS_TIMEO               8               /* Default afs timeout - .8s */
-#define        AFS_RETRANS             ((ALLOWED_MOUNT_TIME*10+2*afs_timeo)/afs_timeo)
-                                               /* Default afs timeout - 1/10th seconds */
+#define        AFS_RETRANS             ((ALLOWED_MOUNT_TIME*10+5*afs_timeo)/afs_timeo * 2)
+                                               /* Default afs retrans - 1/10th seconds */
 
 #define        RPC_XID_PORTMAP         0
 #define        RPC_XID_MOUNTD          1
 
 #define        RPC_XID_PORTMAP         0
 #define        RPC_XID_MOUNTD          1