home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume21 / amd / part09 / am.h next >
C/C++ Source or Header  |  1990-04-10  |  18KB  |  578 lines

  1. /*
  2.  * $Id: am.h,v 5.1.1.2 90/01/11 16:59:18 jsp Exp Locker: jsp $
  3.  *
  4.  * Copyright (c) 1990 Jan-Simon Pendry
  5.  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  6.  * Copyright (c) 1990 The Regents of the University of California.
  7.  * All rights reserved.
  8.  *
  9.  * This code is derived from software contributed to Berkeley by
  10.  * Jan-Simon Pendry at Imperial College, London.
  11.  *
  12.  * Redistribution and use in source and binary forms are permitted
  13.  * provided that the above copyright notice and this paragraph are
  14.  * duplicated in all such forms and that any documentation,
  15.  * advertising materials, and other materials related to such
  16.  * distribution and use acknowledge that the software was developed
  17.  * by Imperial College of Science, Technology and Medicine, London, UK.
  18.  * The names of the College and University may not be used to endorse
  19.  * or promote products derived from this software without specific
  20.  * prior written permission.
  21.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  22.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  23.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  24.  *
  25.  *    %W% (Berkeley) %G%
  26.  */
  27.  
  28. /*
  29.  * Get this in now so that OS_HDR can use it
  30.  */
  31. #ifdef __STDC__
  32. #define    P(x) x
  33. #define    P_void void
  34. #else
  35. #define P(x) ()
  36. #define P_void /* as nothing */
  37. #define const /* as nothing */
  38. #endif
  39.  
  40. #ifdef __GNUC__
  41. #define INLINE /* __inline */
  42. #else
  43. #define    INLINE
  44. #endif
  45.  
  46. /*
  47.  * Pick up target dependent definitions
  48.  */
  49. #include "os-defaults.h"
  50. #include OS_HDR
  51.  
  52. #ifdef VOIDP
  53. typedef void *voidp;
  54. #else
  55. typedef char *voidp;
  56. #endif
  57.  
  58. /*
  59.  * Global declarations
  60.  */
  61. #include <stdio.h>
  62. #include <sys/param.h>
  63. #include <sys/errno.h>
  64. extern int errno;
  65. #include <sys/socket.h>
  66. #include <rpc/rpc.h>
  67. #include "nfs_prot.h"
  68. #ifdef MNTENT_HDR
  69. #include MNTENT_HDR
  70. #endif
  71. #include <sys/time.h>
  72. #include <assert.h>
  73.  
  74. #ifdef DEBUG_MEM
  75. #include <malloc.h>
  76. #endif
  77.  
  78. #ifndef MAXHOSTNAMELEN
  79. #define MAXHOSTNAMELEN 64
  80. #endif
  81.  
  82. #ifndef MNTTYPE_AUTO
  83. #define MNTTYPE_AUTO "auto"
  84. #endif
  85.  
  86. #ifndef FALSE
  87. #define FALSE 0
  88. #define TRUE 1
  89. #endif
  90.  
  91. #ifndef ROOT_MAP
  92. #define    ROOT_MAP "\"root\""
  93. #endif
  94.  
  95. /*
  96.  * Flags from command line
  97.  */
  98. extern int print_pid;        /* Print pid to stdout */
  99. extern int normalize_hosts;    /* Normalize host names before use */
  100. extern int restart_existing_mounts;
  101. #ifdef HAS_YP_MAPS
  102. extern char *domain;        /* YP domain to use */
  103. #endif
  104. extern FILE *logfp;        /* Log file */
  105. extern int xlog_level;        /* Logging level */
  106. #ifdef HAS_SYSLOG
  107. extern int syslogging;        /* Really using syslog */
  108. #endif
  109. extern int am_timeo;        /* Cache period */
  110. extern int afs_timeo;        /* AFS timeout */
  111. extern int afs_retrans;        /* AFS retrans */
  112. extern int am_timeo_w;        /* Unmount timeout */
  113. extern char *mtab;        /* Mount table */
  114.  
  115. #define    XLOG_FATAL    0x0001
  116. #define    XLOG_ERROR    0x0002
  117. #define    XLOG_USER    0x0004
  118. #define    XLOG_WARNING    0x0008
  119. #define    XLOG_INFO    0x0010
  120. #define    XLOG_DEBUG    0x0020
  121. #define    XLOG_MAP    0x0040
  122. #define    XLOG_STATS    0x0080
  123.  
  124. #define XLOG_DEFSTR    "all,nomap,nostats"        /* Default log options */
  125. #define XLOG_ALL    (XLOG_FATAL|XLOG_ERROR|XLOG_USER|XLOG_WARNING|XLOG_INFO|XLOG_MAP|XLOG_STATS)
  126.  
  127. #ifdef DEBUG
  128. #ifdef DEBUG_MEM
  129. #define free(x) xfree(__FILE__,__LINE__,x)
  130. #endif
  131.  
  132. #define    DEBUG_MTAB    "./mtab"
  133.  
  134. extern int debug_flags;        /* Debug options */
  135.  
  136. #define    D_DAEMON    0x0001    /* Enter daemon mode */
  137. #define    D_TRACE        0x0002    /* Do protocol trace */
  138. #define    D_FULL        0x0004    /* Do full trace */
  139. #define    D_MTAB        0x0008    /* Use local mtab */
  140. #define    D_AMQ        0x0010    /* Register amq program */
  141. #define    D_STR        0x0020    /* Debug string munging */
  142. #define    D_MEM        0x0040    /* Trace memory allocations */
  143.  
  144. /*
  145.  * Normally, don't enter daemon mode, and don't register amq
  146.  */
  147. #define    D_TEST    (~(D_DAEMON|D_MEM|D_STR))
  148. #define    D_ALL    (~0)
  149.  
  150. #define Debug(x) if (!(debug_flags & (x))) ; else
  151. #define dlog Debug(D_FULL) dplog
  152. #endif
  153.  
  154. typedef enum {
  155.     Start,
  156.     Run,
  157.     Finishing,
  158.     Quit,
  159.     Done
  160. } serv_state;
  161.  
  162. extern serv_state amd_state;    /* Should we go now */
  163. extern int immediate_abort;    /* Should close-down unmounts be retried */
  164. extern time_t do_mapc_reload;    /* Flush & reload mount map cache */
  165.  
  166. /*
  167.  * Useful constants
  168.  */
  169. extern char *progname;        /* "amd" */
  170. extern char pid_fsname[];    /* kiska.southseas.nz:(pid%d) */
  171. extern char hostname[];        /* "kiska" */
  172. extern char hostd[];        /* "kiska.southseas.nz" */
  173. extern char *hostdomain;    /* "southseas.nz" */
  174. extern char *op_sys;        /* "sos4" */
  175. extern char *arch;        /* "sun4" */
  176. extern char *karch;        /* "sun4c" */
  177. extern char *cluster;        /* "r+d-kluster" */
  178. extern char *endian;        /* "big" */
  179. extern char *auto_dir;        /* "/a" */
  180. extern char version[];        /* Version info */
  181.  
  182. typedef struct am_ops am_ops;
  183. typedef struct am_node am_node;
  184. typedef struct am_opts am_opts;
  185. typedef struct mntfs mntfs;
  186. typedef struct fserver fserver;
  187.  
  188. /*
  189.  * Global variables.
  190.  */
  191. extern unsigned short nfs_port;    /* Our NFS service port */
  192. extern int mypid;        /* Current process id */
  193. extern struct in_addr myipaddr;    /* (An) IP address of this host */
  194.  
  195. extern int foreground;        /* Foreground process */
  196. extern int orig_umask;        /* umask() on startup */
  197. #define clocktime() (clock_valid ? clock_valid : time(&clock_valid))
  198. extern time_t time P((time_t *));
  199. extern time_t clock_valid;    /* Clock needs recalculating */
  200. extern time_t next_softclock;    /* Time to call softclock() */
  201. extern int task_notify_todo;    /* Task notifier needs running */
  202. #ifdef HAS_TFS
  203. extern int nfs_server_code_available;
  204. #endif
  205. extern int last_used_map;    /* Last map being used for mounts */
  206. extern AUTH *nfs_auth;        /* Dummy uthorisation for remote servers */
  207. extern am_node *exported_ap[];    /* List of nodes */
  208. extern int first_free_map;    /* First free node */
  209. #define    NEXP_AP    (4 * NMOUNT)
  210.  
  211. typedef int (*task_fun)P((voidp));
  212. typedef void (*cb_fun)P((int, int, voidp));
  213. typedef void (*fwd_fun)P((voidp, int, struct sockaddr_in *,
  214.                 struct sockaddr_in *, voidp, int));
  215.  
  216. /*
  217.  * String comparison macros
  218.  */
  219. #define STREQ(s1, s2) (strcmp((s1), (s2)) == 0)
  220. #define FSTREQ(s1, s2) ((*(s1) == *(s2)) && STREQ((s1),(s2)))
  221.  
  222. /*
  223.  * Linked list
  224.  */
  225. typedef struct qelem qelem;
  226. struct qelem {
  227.     qelem *q_forw;
  228.     qelem *q_back;
  229. };
  230. #define    FIRST(ty, q)    ((ty *) ((q)->q_forw))
  231. #define    LAST(ty, q)    ((ty *) ((q)->q_back))
  232. #define    NEXT(ty, q)    ((ty *) (((qelem *) q)->q_forw))
  233. #define    PREV(ty, q)    ((ty *) (((qelem *) q)->q_back))
  234. #define    HEAD(ty, q)    ((ty *) q)
  235. #define    ITER(v, ty, q) \
  236.     for ((v) = FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
  237.  
  238. /*
  239.  * List of mount table entries
  240.  */
  241. typedef struct mntlist mntlist;
  242. struct mntlist {
  243.     struct mntlist *mnext;
  244.     struct mntent *mnt;
  245. };
  246.  
  247. /*
  248.  * Mount map
  249.  */
  250. typedef struct mnt_map mnt_map;
  251.  
  252. /*
  253.  * Global routines
  254.  */
  255. extern int atoi P((const char *)); /* C */
  256. extern void am_mounted P((am_node*));
  257. extern void am_unmounted P((am_node*));
  258. extern int background(P_void);
  259. extern int bind_resv_port P((int, unsigned short*));
  260. extern int compute_mount_flags P((struct mntent *));
  261. extern int softclock(P_void);
  262. #ifdef DEBUG
  263. extern int debug_option P((char*));
  264. extern void dplog ();
  265. /*extern void dplog P((char*, ...));*/
  266. #endif
  267. /*extern void domain_strip P((char*, char*));*/
  268. extern mntfs* dup_mntfs P((mntfs*));
  269. extern fserver* dup_srvr P((fserver*));
  270. extern int eval_fs_opts P((am_opts*, char*, char*, char*, char*, char*));
  271. extern char* expand_key P((char*));
  272. extern am_node* exported_ap_alloc(P_void);
  273. extern am_node* find_ap P((char*));
  274. extern mntfs* find_mntfs P((am_ops*, am_opts*, char*, char*, char*));
  275. extern void flush_mntfs(P_void);
  276. extern void free P((voidp)); /* C */
  277. extern void free_mntfs P((mntfs*));
  278. extern void free_opts P((am_opts*));
  279. extern void free_map P((am_node*));
  280. extern void free_mntlist P((mntlist*));
  281. extern int fwd_init(P_void);
  282. extern int fwd_packet P((int, voidp, int, struct sockaddr_in *,
  283.         struct sockaddr_in *, voidp, fwd_fun));
  284. extern void fwd_reply(P_void);
  285. extern void get_args P((int, char*[]));
  286. extern void going_down P((int));
  287. #ifdef NEED_MNTOPT_PARSER
  288. extern char *hasmntopt P((struct mntent*, char*));
  289. #endif
  290. extern int hasmntval P((struct mntent*, char*));
  291. extern void host_normalize P((char **));
  292. extern void init_map P((am_node*, char*));
  293. extern void insert_am P((am_node*, am_node*));
  294. extern void ins_que P((qelem*, qelem*));
  295. extern void make_root_node(P_void);
  296. extern int make_rpc_packet P((char*, int, u_long, struct rpc_msg*, voidp, xdrproc_t, AUTH*));
  297. extern void mapc_add_kv P((mnt_map*, char*, char*));
  298. extern mnt_map* mapc_find P((char*, char*));
  299. extern void mapc_free P((mnt_map*));
  300. extern int mapc_search P((mnt_map*, char*, char**));
  301. extern void mapc_reload(P_void);
  302. extern void mapc_showtypes P((FILE*));
  303. extern int mkdirs P((char*, int));
  304. extern void mnt_free P((struct mntent*));
  305. extern int mount_automounter P((int));
  306. extern int mount_exported(P_void);
  307. extern int mount_node P((am_node*));
  308. extern mntfs* new_mntfs(P_void);
  309. extern void new_ttl P((am_node*));
  310. extern am_node* next_map P((int*));
  311. extern int nfs_srvr_port P((fserver*, u_short*, voidp));
  312. extern int pickup_rpc_reply P((voidp, int, voidp, xdrproc_t));
  313. extern void plog ();
  314. /*extern void plog P((int, char*, ...));*/
  315. extern mntlist* read_mtab P((char*));
  316. extern mntfs* realloc_mntfs  P((mntfs*, am_ops*, am_opts*, char*, char*, char*));
  317. extern void rem_que P((qelem*));
  318. extern void reschedule_timeout_mp(P_void);
  319. extern void restart(P_void);
  320. #ifdef UPDATE_MTAB
  321. extern void rewrite_mtab P((mntlist *));
  322. #endif
  323. extern void rmdirs P((char*));
  324. extern am_node* root_ap P((char*, int));
  325. extern void root_newmap P((char*, char*, char*));
  326. extern void rpc_msg_init P((struct rpc_msg*, u_long, u_long, u_long));
  327. extern void run_task P((task_fun, voidp, cb_fun, voidp));
  328. extern void sched_task P((cb_fun, voidp, voidp));
  329. extern void show_rcs_info P((const char*, char*));
  330. extern void sigchld P((int));
  331. extern char* str3cat P((char*, char*, char*, char*));
  332. extern char* strcat P((char*, const char*)); /* C */
  333. extern char* strchr P((const char*, int)); /* C */
  334. extern int strcmp P((const char*, const char*)); /* C */
  335. extern char* strdup P((const char*));
  336. extern int strlen P((const char*)); /* C */
  337. extern char* strnsave P((const char*, int));
  338. extern char* strrchr P((const char*, int)); /* C */
  339. extern char* strealloc P((char*, char *));
  340. extern char** strsplit P((char*, int));
  341. extern int switch_option P((char*));
  342. extern void task_notify(P_void);
  343. extern int timeout P((unsigned int, void (*fn)(), voidp));
  344. extern void timeout_mp(P_void);
  345. extern void umount_exported(P_void);
  346. /*extern int unmount_node P((am_node*));
  347. extern int unmount_node_wrap P((voidp));*/
  348. extern void unregister_amq(P_void);
  349. extern void untimeout P((int));
  350. extern int valid_key P((char*));
  351. extern void wakeup P((voidp));
  352. extern void wakeup_task P((int,int,voidp));
  353. extern void wakeup_srvr P((fserver*));
  354. extern void write_mntent P((struct mntent*));
  355. extern voidp xmalloc P((int));
  356. extern voidp xrealloc P((voidp, int));
  357.  
  358. #define    ALLOC(ty)    ((struct ty *) xmalloc(sizeof(struct ty)))
  359.  
  360. /*
  361.  * Options
  362.  */
  363. struct am_opts {
  364.     char    *fs_glob;        /* Smashed copy of global options */
  365.     char    *fs_local;        /* Expanded copy of local options */
  366.     char    *fs_mtab;        /* Mount table entry */
  367.     /* Other options ... */
  368.     char    *opt_dev;
  369.     char    *opt_delay;
  370.     char    *opt_dir;
  371.     char    *opt_fs;
  372.     char    *opt_group;
  373.     char    *opt_mount;
  374.     char    *opt_opts;
  375.     char    *opt_pref;
  376.     char    *opt_cache;
  377.     char    *opt_rfs;
  378.     char    *opt_rhost;
  379.     char    *opt_sublink;
  380.     char    *opt_type;
  381.     char    *opt_unmount;
  382.     char    *opt_user;
  383. };
  384.  
  385. /*
  386.  * File Handle
  387.  *
  388.  * This is interpreted by indexing the exported array
  389.  * by fhh_id.
  390.  *
  391.  * The whole structure is mapped onto a standard fhandle_t
  392.  * when transmitted.
  393.  */
  394. struct am_fh {
  395.     int    fhh_pid;        /* process id */
  396.     int    fhh_id;            /* map id */
  397.     int    fhh_gen;        /* generation number */
  398. };
  399.  
  400. extern am_node *fh_to_mp P((nfs_fh*));
  401. extern am_node *fh_to_mp3 P((nfs_fh*,int*,int));
  402. extern void mp_to_fh P((am_node*, nfs_fh*));
  403. #define    fh_to_mp2(fhp, rp) fh_to_mp3(fhp, rp, VLOOK_CREATE)
  404.  
  405. typedef int    (*vfs_match)P((am_opts*));
  406. typedef int    (*vfs_init)P((mntfs*));
  407. typedef int    (*vmount_fs)P((am_node*));
  408. typedef int    (*vumount_fs)P((am_node*));
  409. typedef am_node*(*vlookuppn)P((am_node*, char*, int*, int));
  410. typedef int    (*vreaddir)P((am_node*, nfscookie, dirlist*, entry*));
  411. typedef char*    (*vreadlink)P((am_node*, int*));
  412. typedef int    (*vmounted)P((mntfs*));
  413. typedef void    (*vumounted)P((am_node*));
  414. typedef fserver*(*vffserver)P((mntfs*));
  415.  
  416. struct am_ops {
  417.     char        *fs_type;
  418.     vfs_match    fs_match;
  419.     vfs_init    fs_init;
  420.     vmount_fs    mount_fs;
  421.     vumount_fs    umount_fs;
  422.     vlookuppn    lookuppn;
  423.     vreaddir    readdir;
  424.     vreadlink    readlink;
  425.     vmounted    mounted;
  426.     vumounted    umounted;
  427.     vffserver    ffserver;
  428.     int        fs_flags;
  429.     qelem        *srvr_list;
  430. };
  431. extern am_node *efs_lookuppn P((am_node*, char*, int*, int));
  432. extern int efs_readdir P((am_node*, nfscookie, dirlist*, entry*));
  433.  
  434. #define    VLOOK_CREATE    0x1
  435. #define    VLOOK_DELETE    0x2
  436.  
  437. #define    FS_RETRY    0x0001        /* Retry this type of mount */
  438. #define    FS_MBACKGROUND    0x0002        /* Should background this mount */
  439. #define    FS_NOTIMEOUT    0x0004        /* Don't bother with timeouts */
  440. #define FS_MKMNT    0x0008        /* Need to make the mkdir point */
  441. #define FS_UBACKGROUND    0x0010        /* Unmount in background */
  442. #define    FS_BACKGROUND    (FS_MBACKGROUND|FS_UBACKGROUND)
  443. #define    FS_DISCARD    0x0020        /* Discard immediately on last reference */
  444. #define    FS_AMQINFO    0x0040        /* Amq is interested in this fs type */
  445.  
  446. #ifdef SUNOS4_COMPAT
  447. extern am_ops *sunos4_match P((am_opts*, char*, char*, char*, char*, char*));
  448. #endif
  449. extern am_ops *ops_match P((am_opts*, char*, char*, char*, char*, char*));
  450. #include "fs.h"
  451.  
  452. /*
  453.  * Per-mountpoint statistics
  454.  */
  455. struct am_stats {
  456.     time_t    s_mtime;    /* Mount time */
  457.     u_short    s_uid;        /* Uid of mounter */
  458.     int    s_getattr;    /* Count of getattrs */
  459.     int    s_lookup;    /* Count of lookups */
  460.     int    s_readdir;    /* Count of readdirs */
  461.     int    s_readlink;    /* Count of readlinks */
  462.     int    s_statfs;    /* Count of statfs */
  463. };
  464. typedef struct am_stats am_stats;
  465.  
  466. /*
  467.  * System statistics
  468.  */
  469. struct amd_stats {
  470.     int    d_drops;    /* Dropped requests */
  471.     int    d_stale;    /* Stale NFS handles */
  472.     int    d_mok;        /* Succesful mounts */
  473.     int    d_merr;        /* Failed mounts */
  474.     int    d_uerr;        /* Failed unmounts */
  475. };
  476. extern struct amd_stats amd_stats;
  477.  
  478. /*
  479.  * List of fileservers
  480.  */
  481. struct fserver {
  482.     qelem        fs_q;        /* List of fileservers */
  483.     int        fs_refc;    /* Number of references to this node */
  484.     char        *fs_host;    /* Normalized hostname of server */
  485.     struct sockaddr_in *fs_ip;    /* Network address of server */
  486.     int        fs_cid;        /* Callout id */
  487.     int        fs_pinger;    /* Ping (keepalive) interval */
  488.     int        fs_flags;    /* Flags */
  489.     voidp        fs_private;    /* Private data */
  490.     void        (*fs_prfree)();    /* Free private data */
  491. };
  492. #define    FSF_VALID    0x0001        /* Valid information available */
  493. #define    FSF_DOWN    0x0002        /* This fileserver is down */
  494. #define    FSF_ERROR    0x0004        /* Permanent error has occured */
  495. #define    FSF_WANT    0x0008        /* Want a wakeup call */
  496. #define    FSF_PINGING    0x0010        /* Already doing pings */
  497. #define    FSRV_ISDOWN(fs)    (((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_DOWN|FSF_VALID))
  498.  
  499. /*
  500.  * List of mounted filesystems
  501.  */
  502. struct mntfs {
  503.     qelem        mf_q;        /* List of mounted filesystems */
  504.     am_ops        *mf_ops;    /* Operations on this mountpoint */
  505.     am_opts        *mf_fo;        /* File opts */
  506.     struct attrstat    mf_attr;    /* File attributes */
  507. #define mf_fattr    mf_attr.attrstat_u.attributes
  508.     char        *mf_mount;    /* "/a/kiska/home/kiska" */
  509.     char        *mf_info;    /* Mount info */
  510.     char        *mf_opts;    /* Mount opts */
  511.     fserver        *mf_server;    /* File server */
  512.     int        mf_flags;    /* Flags */
  513.     int        mf_error;    /* Error code from background mount */
  514.     int        mf_refc;    /* Number of references to this node */
  515.     int        mf_cid;        /* Callout id */
  516.     void        (*mf_prfree)();    /* Free private space */
  517.     voidp        mf_private;    /* Private - per-fs data */
  518. };
  519.  
  520. #define    MFF_MOUNTED    0x0001        /* Node is mounted */
  521. #define    MFF_MOUNTING    0x0002        /* Mount is in progress */
  522. #define    MFF_UNMOUNTING    0x0004        /* Unmount is in progress */
  523. #define    MFF_RESTART    0x0008        /* Restarted node */
  524. #define MFF_MKMNT    0x0010        /* Delete this node's am_mount */
  525. #define    MFF_ERROR    0x0020        /* This node failed to mount */
  526. #define    MFF_LOGDOWN    0x0040        /* Logged that this mount is down */
  527. #define    MFF_RSTKEEP    0x0080        /* Don't timeout this filesystem - restarted */
  528. #define    MFF_WANTTIMO    0x0100        /* Need a timeout call when not busy */
  529.  
  530. /*
  531.  * Map of auto-mount points.
  532.  */
  533. struct am_node {
  534.     int        am_mapno;    /* Map number */
  535.     mntfs        *am_mnt;    /* Mounted filesystem */
  536.     char        *am_name;    /* "kiska"
  537.                        Name of this node */
  538.     char        *am_path;    /* "/home/kiska"
  539.                        Path of this node's mount point */
  540.     char        *am_link;    /* "/a/kiska/home/kiska/this/that"
  541.                        Link to sub-directory */
  542.     am_node        *am_parent,    /* Parent of this node */
  543.             *am_ysib,    /* Younger sibling of this node */
  544.             *am_osib,    /* Older sibling of this node */
  545.             *am_child;    /* First child of this node */
  546.     int        am_flags;    /* Boolean flags */
  547.     int        am_error;    /* Specific mount error */
  548.     time_t        am_ttl;        /* Time to live */
  549.     int        am_timeo_w;    /* Wait interval */
  550.     int        am_timeo;    /* Timeout interval */
  551.     unsigned int    am_gen;        /* Generation number */
  552.     char        *am_pref;    /* Mount info prefix */
  553.     am_stats    am_stats;    /* Statistics gathering */
  554. };
  555.  
  556. #define    AMF_NOTIMEOUT    0x0001        /* This node never times out */
  557. #define    AMF_ROOT    0x0002        /* This is a root node */
  558. #define AMF_MKPATH    0x0004        /* Delete this node's am_path */
  559.  
  560. #define    ONE_HOUR    (60 * 60)    /* One hour in seconds */
  561.  
  562. /*
  563.  * The following values can be tuned...
  564.  */
  565. #define    ALLOWED_MOUNT_TIME    30        /* 30s for a mount */
  566. #define    AM_TTL            (5 * 60)    /* Default cache period */
  567. #define    AM_TTL_W        (2 * 60)    /* Default unmount interval */
  568. #define    AM_PINGER        3        /* NFS ping interval */
  569. #define    AFS_TIMEO        8        /* Default afs timeout - .8s */
  570. #define    AFS_RETRANS        ((ALLOWED_MOUNT_TIME*10+2*afs_timeo)/afs_timeo)
  571.                         /* Default afs timeout - 1/10th seconds */
  572.  
  573. #define    RPC_XID_PORTMAP        0
  574. #define    RPC_XID_MOUNTD        1
  575. #define    RPC_XID_NFSPING        2
  576. #define    RPC_XID_MASK        (0x0f)        /* 16 id's for now */
  577. #define    MK_RPC_XID(type_id, uniq)    ((type_id) | ((uniq) << 4))
  578.