Annotation of 43BSDReno/usr.sbin/amd/include/am.h, revision 1.1

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))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.