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