Annotation of researchv10dc/vol2/netb/netb.ms, revision 1.1

1.1     ! root        1: .so ../ADM/mac
        !             2: .XX netb 513 "A Look at the Ninth Edition Network File System"
        !             3: .nr dP 2
        !             4: .nr dV 3p
        !             5: .nr tP 1
        !             6: .nr tV 1p
        !             7: .nr Hs 5
        !             8: .TL M10200 40125-100
        !             9: A Look at the Ninth Edition Network File System
        !            10: .AU sar SF XT9112200 x6084 5-121 attunix!sar
        !            11: Stephen Rago
        !            12: .AI
        !            13: .MH
        !            14: .AB
        !            15: The protocol used for the network file system in Research
        !            16: .UX
        !            17: has evolved since its original design and implementation.  This paper describes the
        !            18: current version of the protocol (NETB), including the semantics for both the client
        !            19: and the server.
        !            20: .AE
        !            21: .2C
        !            22: .NH 1 
        !            23: Introduction
        !            24: .PP
        !            25: In Version 8 of the
        !            26: .UX
        !            27: operating system, Peter Weinberger*
        !            28: .FS
        !            29: .nf
        !            30: *
        !            31: .ps 6
        !            32: .ft H
        !            33: .tr x.
        !            34: .tr -
        !            35: .cs H 5
        !            36: .vs 8u
        !            37: -------------------xxxxxx-x---------------------
        !            38: -----------------xxxxxxxxxxxxx------------------
        !            39: ----------------xxxxxxx-xxxxxxxx----------------
        !            40: ---------------xx-xxxxxxx-xxxxxxxx--------------
        !            41: ---------------xxxx-xxxxxxxxx-x-xxx-------------
        !            42: --------------x---------xxxxxxxxxxxxx-----------
        !            43: --------------x----------xxxxxxxxxxxxxxxx-------
        !            44: ---------------------------xxxxx-xxxxxx---------
        !            45: ------------xx-------------xxxxxxxxxxxxxxx------
        !            46: ---------------------------x-x-xxxxxxxxxxx------
        !            47: ----------xx---------------xxxxxxxxxxxxxxxxx----
        !            48: ---------xxx----------------xxxxxxxxxxx-x-xx----
        !            49: --------xx-------------------xxxxxxxxxxxxxxxx---
        !            50: --------xxx------------------xxxxxxxxxxxxxx-x---
        !            51: -------xxxx-------------------xxxxxxxxxxxxxxx---
        !            52: ------xxxx---------------------xxxxxxxxxxxxxx---
        !            53: ------xxxxx--------------------xxxxxxxxxxxxxx---
        !            54: -----xxxxx----x-x---------------xxxxxxxxxxxx----
        !            55: ----xxxxxxxxx-x-xxxxx-----xxxxxxx-xxxxxxxxxxx---
        !            56: ----xxxxxxx------xxxxx---xx--xxxxxxxxxxxxxxxx---
        !            57: ---xxxxxxxxx---xxxx-xxxxxxxxx--x-xxxxxxxxxxxx---
        !            58: ---xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx---
        !            59: ---xxxxxxxxx-x-xx-x--x--xxxxxxxxxxxxxxxxxxxxx---
        !            60: ---xxxxxxx-x------x--x---xxxxxxxxxxxxxxxxxxx----
        !            61: ----xxxxxxx-----x--------x---x-xxxxxxxxxxxxx----
        !            62: ---xxxxxx-x---------x----xxx------xxxxxxxxxx----
        !            63: ------xx--x--------------xx-----xx-xxxxxxxx-----
        !            64: ----x-xxx----------x------xx-------xxxxxx-------
        !            65: -------xx------x-xx--------xxxxxxxxx-xxxx-------
        !            66: --------x----x-x-x-------x-xx-x--x-xxxxx--------
        !            67: --------------------x-xxxxxxx-xxxxxxxxxx--------
        !            68: -------xx----------xxxxxxxx-x---xxx-xxx---------
        !            69: ------xxx------------xxxxxxx--x-x-xxxxx---------
        !            70: -------xx-----x-------xxxx-x-x-xxxx-xxxxxx------
        !            71: --------x----------------xxx-x-x-xxxxxxxx-------
        !            72: -------xxx-----xxx-x-x-xxx-xxx-x-x--xxxxx-------
        !            73: --------xx-----x-x-x-xxxxxxxxxxxxxxxxxxxx-------
        !            74: ---------x----------------xxx--x-xxxxxxx--------
        !            75: ---------xx--------------xx-x-xxxx--xxx---------
        !            76: -------------x-----xxxxxxxx-x-xx-xx-------------
        !            77: ---------------------xxxxxxxxxxxxxxxx-----------
        !            78: --------------x------------x-x-xx-x-------------
        !            79: -------------------------x-x-xxxxx--------------
        !            80: --------------x-----------xxxxxx-x--------------
        !            81: ----------------x--------x--x-xxxx--------------
        !            82: --------------x-x-xxx-xxxxxxxxx-x---------------
        !            83: ----------------x---xxxxxxxxx-xxxx--------------
        !            84: ---------------x-xxxx-x-x-xxxxxxxx--------------
        !            85: .tr --
        !            86: .tr xx
        !            87: .fi
        !            88: .vs
        !            89: .ps
        !            90: .ft
        !            91: .FE
        !            92: wrote a network file system that enabled files to be shared between machines
        !            93: connected by a network.  When I asked someone if there was a paper describing
        !            94: it, they said, "yeah, but it's only an abstract."  I thought they were speaking
        !            95: figuratively.  They were speaking literally |reference(weinberger neta).
        !            96: Hence, as I began studying the
        !            97: Version 9 network file system in preparation for porting it to UNIX System V Release 4.0,
        !            98: it was suggested that I also document what it does.
        !            99: This paper describes the inner workings of Weinberger's network file system.
        !           100: .PP
        !           101: The UNIX Version 8 network file system, known as NETA, provided remote file access
        !           102: for the Computing Science Research Center.  It has evolved over the years and
        !           103: in its current form, runs on UNIX Version 9 and is now called NETB.
        !           104: .NH 1 
        !           105: Architecture
        !           106: .PP
        !           107: The client side is implemented in the kernel as a file system switch entry.  The server
        !           108: side is implemented as a user-level process.  There is one server process
        !           109: per client machine.
        !           110: .PP
        !           111: The server's name is
        !           112: .I zarf .
        !           113: (A zarf is an ornamental metal holder for a hot coffee cup.)
        !           114: .PP
        !           115: By convention, each machine
        !           116: mounts other machines' file systems on mount points under
        !           117: .CW /n .
        !           118: .NH 1 
        !           119: Client Startup
        !           120: .PP
        !           121: The client side of the network file system includes a command/daemon (\fIsetup\fP)
        !           122: to set up
        !           123: connections and a file system (NETB) to translate file system operations into
        !           124: streams messages.  \fISetup\fP makes a connection to the remote machine's server and
        !           125: sends it information about the protocol version, client user ids, and client group ids.
        !           126: Then it mounts the connection in the file system name space using NETB.
        !           127: .PP
        !           128: In the daemon mode, the command is started without any arguments.  It reads the
        !           129: file
        !           130: .CW /usr/netb/friends
        !           131: to decide which systems to mount.  
        !           132: Every 60 seconds the daemon checks the remotely mounted file systems to see if they are
        !           133: still available.  It also checks to see if the friends file has changed.  If any friendly file
        !           134: system is unavailable, then an attempt is made to mount it.
        !           135: The format of the friends file is a list of entries containing a \fInetname\fP,
        !           136: a \fIcall_arg\fP, a \fImount_point\fP,
        !           137: a \fIprotocol\fP, a \fIunique_id\fP, a \fIdebug_flag\fP, and a \fIusername\fP,
        !           138: separated by white space.
        !           139: .PP
        !           140: The \fInetname\fP is the network name (see
        !           141: .I ipc (3))
        !           142: of the server machine.
        !           143: The \fImount_point\fP is the location in the local file system where the remote file
        !           144: system is to be mounted.
        !           145: The \fIprotocol\fP indicates how the connection is to be placed.  Protocol
        !           146: .CW d
        !           147: uses the
        !           148: default network
        !           149: .CW dk
        !           150: (Datakit\(rg), expecting the service to be named
        !           151: .CW fsb
        !           152: and ignoring the
        !           153: \fIcall_arg\fP.  Protocol
        !           154: .CW t
        !           155: uses TCP, starting the service given by the
        !           156: \fIcall_arg\fP using the
        !           157: .I rsh
        !           158: protocol.
        !           159: The \fIunique_id\fP is an integer between 0 and 255 that distinguishes the connections
        !           160: and must be unique among all active remote file systems.
        !           161: The \fIdebug_flag\fP determines how much information gets written to the log files.
        !           162: The \fIusername\fP is an optional field that provides the name of the calling process
        !           163: making the mount.  The default user name is
        !           164: .CW daemon .
        !           165: .PP
        !           166: In command mode, the remote file system is mounted, but no daemon is created.
        !           167: The arguments to the command are the same as the parameters in the friends file.
        !           168: .NH 1 
        !           169: Server Startup
        !           170: .PP
        !           171: The server expects to be started by the remote execution facility.
        !           172: As such, file descriptor zero is attached to the network connection.
        !           173: First, the server tries to identify the client.  The method it uses depends
        !           174: on the environment in which it is running.
        !           175: On 4BSD systems, it does this by calling
        !           176: .I getpeername (2).
        !           177: On Version 9 (and System V)
        !           178: systems, it does this
        !           179: by checking the environment variables
        !           180: .CW CSOURCE
        !           181: and
        !           182: .CW DKSOURCE .*
        !           183: .FS
        !           184: * CSOURCE is set by the remote execution facility when a service is invoked.
        !           185: DKSOURCE is set by an older version of the remote execution facility.
        !           186: .FE
        !           187: The server then changes directory to
        !           188: .CW /usr/netb .
        !           189: If this fails, the server
        !           190: changes directory to
        !           191: .CW /tmp .
        !           192: A log file,
        !           193: .CW zarf.log ,
        !           194: is created.
        !           195: .PP
        !           196: The first network message read by the server is 16 bytes long.
        !           197: The format is:
        !           198: .KS
        !           199: .ps -\n(tP
        !           200: .vs -\n(tVu
        !           201: .TS
        !           202: center,box;
        !           203: a | a .
        !           204: byte   use
        !           205: =      =
        !           206: 0      maximum client message size
        !           207: _      _
        !           208: 1      client device number
        !           209: _      _
        !           210: 2      protocol type
        !           211: _      _
        !           212: 3      debug flag
        !           213: _      _
        !           214: 4-15   unused
        !           215: .TE
        !           216: .ps +\n(tP
        !           217: .vs +\n(tVu
        !           218: .KE
        !           219: The maximum message size is currently set to 5K bytes.  In the message,
        !           220: the size is expressed in units of 1KB.  The client can change the maximum
        !           221: message size via an \fIioctl\fP (see \(sc5.1.2).
        !           222: The device number is the major device number
        !           223: of the client.
        !           224: It is the same as the unique id obtained from the friends file.
        !           225: The server creates device numbers using this major number.  The minor number
        !           226: is created on the fly and is unique among all device numbers the server has seen since
        !           227: it started.
        !           228: .PP
        !           229: The protocol type is expressed as an ASCII character.
        !           230: The currently supported protocols are
        !           231: .CW t
        !           232: (TCP byte streams) and
        !           233: .CW d
        !           234: (Datakit messages).
        !           235: The debug flag determines the detail of the messages that get written to the log file.
        !           236: .PP
        !           237: The server responds to the first message with a one-byte response
        !           238: containing the value 1.
        !           239: .PP
        !           240: The second network message read is \fImax_message_size\fP bytes long.
        !           241: It contains the user ids from the client machine,
        !           242: obtained from the client's password file.  The entries are in ASCII, with the last entry
        !           243: followed by a NULL.
        !           244: The format of each entry in the message is:
        !           245: .P1
        !           246: user_name user_id\n
        !           247: .P2
        !           248: The server responds to this message with a one-byte response containing the value 2.
        !           249: .PP
        !           250: The user id message is parsed and a table is built mapping client user ids to server
        !           251: user ids.  Client and server hash lists map user ids to indices into the mapping table
        !           252: to speed lookup operations.
        !           253: .PP
        !           254: The third network message read is also \fImax_message_size\fP bytes long.
        !           255: It contains the group ids from the client machine,
        !           256: obtained from the client's group file.  The entries are in ASCII, with the last entry
        !           257: followed by a NULL.
        !           258: The format of each entry in the message is:
        !           259: .P1
        !           260: group_name group_id\n
        !           261: .P2
        !           262: The server responds to this message with a one-byte response containing the value 3.
        !           263: .PP
        !           264: The group id message is parsed and a table is built mapping client group ids to server
        !           265: group ids.  Client and server hash lists map group ids to indices into the mapping table
        !           266: to speed lookup operations.
        !           267: .PP
        !           268: If there are too many user or group ids to fit in the message, the client does not
        !           269: attempt to send the message to the server.  Rather, the client closes the connection
        !           270: and the server exits.
        !           271: .PP
        !           272: If everything is successful, the
        !           273: server opens its root and creates an internal file entry mapping
        !           274: its root to the client's mount point.  The rest of the time is spent in a loop
        !           275: servicing client requests.
        !           276: .NH 1 
        !           277: File System Operations
        !           278: .PP
        !           279: The file system operations in Version 9 are:
        !           280: .nr xx \\n(PDu
        !           281: .nr PD 0.1v
        !           282: .IP \fBmount\fP 8
        !           283: mount and unmount the file system
        !           284: .IP \fBput\fP
        !           285: release an inode
        !           286: .IP \fBget\fP
        !           287: get an inode
        !           288: .IP \fBfree\fP
        !           289: free the disk space associated with the inode
        !           290: .IP \fBupdat\fP
        !           291: update the times on the inode
        !           292: .IP \fBread\fP
        !           293: read from the inode's file
        !           294: .IP \fBwrite\fP
        !           295: write to the inode's file
        !           296: .IP \fBstat\fP
        !           297: return the statistics on the inode's file
        !           298: .IP \fBtrunc\fP
        !           299: truncate the inode's file
        !           300: .IP \fBnami\fP
        !           301: parse a pathname
        !           302: .IP \fBioctl\fP
        !           303: file system-specific ioctls and device ioctls
        !           304: .IP \fBopen\fP
        !           305: open a device
        !           306: .IP \fBdirread\fP
        !           307: read a directory
        !           308: .nr PD \\n(xxu
        !           309: .PP
        !           310: In the network file system, file system operations
        !           311: consist of request/response messages.  The client sends a message
        !           312: to the server and blocks until the response comes back.
        !           313: For historical reasons, the messages follow VAX-style byte ordering and
        !           314: all network message structures are multiples of 8 bytes.
        !           315: Messages sent from the client to the server are of the following format:
        !           316: .KS
        !           317: .ps -\n(tP
        !           318: .vs -\n(tVu
        !           319: .TS
        !           320: center,box;
        !           321: a .
        !           322: message header
        !           323: (struct sendb)
        !           324: _
        !           325: optional
        !           326: operation-specific
        !           327: header
        !           328: _
        !           329: optional
        !           330: user data
        !           331: .TE
        !           332: .ps +\n(tP
        !           333: .vs +\n(tVu
        !           334: .KE
        !           335: .PP
        !           336: Throughout the rest of this paper, C structure definitions are used to describe
        !           337: network messages.  Elements of type \f(CWchar\fP are one byte long,  elements of type
        !           338: \f(CWshort\fP are two bytes long, and elements of type \f(CWlong\fP are four bytes long.
        !           339: Fields are included to remove any ambiguity regarding structure padding.
        !           340: .PP
        !           341: The request message header is defined by a \f(CWstruct sendb\fP:
        !           342: .P1
        !           343: struct sendb {
        !           344:        char    version;
        !           345:        char    cmd;
        !           346:        char    flags;
        !           347:        char    rsva;
        !           348:        long    trannum;
        !           349:        long    len;
        !           350:        long    tag;
        !           351:        short   uid;
        !           352:        short   gid;
        !           353:        long    rsvb;
        !           354: }
        !           355: .P2
        !           356: .PP
        !           357: \f(CWversion\fP indicates which version of the protocol is in use.
        !           358: \f(CWcmd\fP indicates the operation requested.
        !           359: \f(CWrsva\fP and \f(CWrsvb\fP are pad fields.
        !           360: \f(CWtrannum\fP is the transaction number for the message.
        !           361: \f(CWlen\fP is the length of the message in bytes, including the headers and data.
        !           362: \f(CWtag\fP is used to identify the file to which the operation pertains.
        !           363: The tags are composed of the device number where the file lives shifted left 16 bits,
        !           364: ORed with the inode number.
        !           365: \f(CWuid\fP and \f(CWgid\fP are the user and group ids of the client generating the operation,
        !           366: respectively.
        !           367: .PP
        !           368: Messages sent from the server to the client are of the following format:
        !           369: .KS
        !           370: .ps -\n(tP
        !           371: .vs -\n(tVu
        !           372: .TS
        !           373: center,box;
        !           374: a .
        !           375: message header
        !           376: (struct recvb)
        !           377: _
        !           378: optional
        !           379: operation-specific
        !           380: header
        !           381: _
        !           382: optional
        !           383: user data
        !           384: .TE
        !           385: .ps +\n(tP
        !           386: .vs +\n(tVu
        !           387: .KE
        !           388: .PP
        !           389: The response message header is defined by a \f(CWstruct recvb\fP:
        !           390: .P1
        !           391: struct recvb {
        !           392:        long    trannum;
        !           393:        short   errno;
        !           394:        char    flags;
        !           395:        char    rsvd;
        !           396:        long    len;
        !           397:        long    fsize;
        !           398: }
        !           399: .P2
        !           400: The server copies \f(CWtrannum\fP from the request message so the client can
        !           401: match up responses with requests.
        !           402: \f(CWerrno\fP is the error number if the operation failed, or 0 on success.
        !           403: The \f(CWflags\fP field is used to indicate special conditions for certain operations.
        !           404: \f(CWrsvd\fP is a pad field.  \f(CWlen\fP is the
        !           405: length of the message, including the headers and data.  \f(CWfsize\fP is the file
        !           406: size and is set only by the read, write, and dirread file system operations.
        !           407: .PP
        !           408: The following sections describe some details of the file system operations
        !           409: for the network file system, including the content of messages exchanged between the client
        !           410: and the server.  There is no
        !           411: .I nbopen ()
        !           412: entry point.
        !           413: Instead, a stub (\fInullopen\fP) is used, which is provided by the system.
        !           414: This is because \fIzarf\fP opens the file as part of parsing the pathname, so no extra
        !           415: protocol is necessary.
        !           416: \fIZarf\fP does not fully support access to devices.
        !           417: .NH 2 
        !           418: nbmount
        !           419: .PP
        !           420: When mounting the file system, the \fIflag\fP argument to
        !           421: .I fmount (2)
        !           422: contains the
        !           423: device number for the remote file system.
        !           424: The file descriptor passed to \fIfmount\fP is the client's end of the network
        !           425: connection to the server.
        !           426: The client side creates an inode for the root of the file system with this information.
        !           427: .PP
        !           428: When unmounting the file system, all active inodes on that file system
        !           429: are converted to inodes in the error file system (errfs).  This will cause all further
        !           430: operations on them to fail, until the inodes are freed.
        !           431: .NH 2 
        !           432: nbget
        !           433: .PP
        !           434: The information
        !           435: in the inode is filled in by \fInbget\fP, called from \fInami\fP.
        !           436: For the root inode, it can be called from \fInbmount\fP, so it
        !           437: constructs the information by hand.  However, for all other inodes, it fills
        !           438: in the information with the cached data obtained from the previous nami message.
        !           439: The nami cache is one entry long.
        !           440: .X "PARM CT 70
        !           441: .NH 2 
        !           442: nbput
        !           443: .PP
        !           444: If the inode is marked ICHG, \fInbupdat\fP is called.
        !           445: Then a NBPUT message is sent
        !           446: to the server.  The format of the message is:
        !           447: .KS
        !           448: .ps -\n(tP
        !           449: .vs -\n(tVu
        !           450: .TS
        !           451: center,box;
        !           452: c s
        !           453: a | a .
        !           454: NBPUT request
        !           455: =
        !           456: sendb  value
        !           457: _      _       
        !           458: version        2
        !           459: cmd    NBPUT
        !           460: flags  0
        !           461: rsva   unused
        !           462: trannum        transaction number
        !           463: len    sizeof(struct sendb)
        !           464:        (24 bytes)
        !           465: tag    tag of inode
        !           466: uid    uid of client
        !           467: gid    gid of client
        !           468: rsvb   unused
        !           469: .TE
        !           470: .ps +\n(tP
        !           471: .vs +\n(tVu
        !           472: .KE
        !           473: .PP
        !           474: For this operation, the server will search through its list of open files, matching on
        !           475: \f(CWtag\fP.
        !           476: If the file is found and it is not the root, then the server closes the file and invalidates
        !           477: its entry in the list.  The response sent back to the client is:
        !           478: .KS
        !           479: .ps -\n(tP
        !           480: .vs -\n(tVu
        !           481: .TS
        !           482: center,box;
        !           483: c s
        !           484: a | a .
        !           485: NBPUT response
        !           486: =
        !           487: recvb  value
        !           488: _      _       
        !           489: trannum        transaction number
        !           490: errno  error number or 0
        !           491: flags  0
        !           492: rsvd   unused
        !           493: len    sizeof(struct recvb)
        !           494:        (16 bytes)
        !           495: fsize  0
        !           496: .TE
        !           497: .ps +\n(tP
        !           498: .vs +\n(tVu
        !           499: .KE
        !           500: .X "PARM CT 50
        !           501: .NH 2 
        !           502: nbfree
        !           503: .PP
        !           504: \fINbfree\fP is just a stub that doesn't do anything.  Since the server removes
        !           505: the disk space associated with a file during the nami NI_DEL and NI_RMDIR
        !           506: operations, there is no need to do anything in \fInbfree\fP.
        !           507: .NH 2 
        !           508: nbupdat
        !           509: .PP
        !           510: This operation invalidates the nami cache.
        !           511: The message sent to the server contains an operation-specific header in the form of
        !           512: a \f(CW struct snbup\fP:
        !           513: .P1
        !           514: struct snbup {
        !           515:        unsigned short  mode;
        !           516:        short           rdvdd;
        !           517:        long            rsvd;
        !           518:        long            ta;
        !           519:        long            tm;
        !           520: }
        !           521: .P2
        !           522: The \f(CWmode\fP is the mode of the file from the inode.  \f(CWrdvdd\fP is currently unused.
        !           523: \f(CWrsvd\fP is a pad field.  \f(CWta\fP
        !           524: is the access time on the client machine and \f(CWtm\fP is
        !           525: the modify time on the client machine.
        !           526: If the inode is not marked IACC, \f(CWta\fP is set to 0.
        !           527: If the inode is not marked IUPD, \f(CWtm\fP is set to 0.
        !           528: The message sent to the server is as follows:
        !           529: .KS
        !           530: .ps -\n(tP
        !           531: .vs -\n(tVu
        !           532: .TS
        !           533: center,box;
        !           534: c s
        !           535: a | a .
        !           536: NBUPD request
        !           537: =
        !           538: sendb  value
        !           539: _      _       
        !           540: version        2
        !           541: cmd    NBUPD
        !           542: flags  0
        !           543: rsva   unused
        !           544: trannum        transaction number
        !           545: len    sizeof(struct sendb)+
        !           546:        sizeof(struct snbup)
        !           547:        (40 bytes)
        !           548: tag    tag of inode
        !           549: uid    uid of client
        !           550: gid    gid of client
        !           551: rsvb   unused
        !           552: _      _
        !           553: snbup  value
        !           554: _      _
        !           555: mode   mode of inode
        !           556: rdvdd  unused
        !           557: rsvd   unused
        !           558: ta     access time or 0
        !           559: tm     modify time or 0
        !           560: .TE
        !           561: .ps +\n(tP
        !           562: .vs +\n(tVu
        !           563: .KE
        !           564: .PP
        !           565: If the times are zero in the client request message, the server obtains the times
        !           566: from the cached
        !           567: .I stat (2)
        !           568: information for the file.  Otherwise the times from the message
        !           569: are adjusted with a time drift correction (see \(sc5.8).
        !           570: The access and modify times are updated via
        !           571: .I utime (2).
        !           572: If the modes
        !           573: are to be changed, and the client process owns the file, they are updated with either
        !           574: .I fchmod (2)
        !           575: or
        !           576: .I chmod (2).
        !           577: The server responds to the client with the following message:
        !           578: .KS
        !           579: .ps -\n(tP
        !           580: .vs -\n(tVu
        !           581: .TS
        !           582: center,box;
        !           583: c s
        !           584: a | a .
        !           585: NBUPD response
        !           586: =
        !           587: recvb  value
        !           588: _      _       
        !           589: trannum        transaction number
        !           590: errno  error number or 0
        !           591: flags  0
        !           592: rsvd   unused
        !           593: len    sizeof(struct recvb)
        !           594:        (16 bytes)
        !           595: fsize  0
        !           596: .TE
        !           597: .ps +\n(tP
        !           598: .vs +\n(tVu
        !           599: .KE
        !           600: ........
        !           601: .NH 2 
        !           602: nbread
        !           603: .PP
        !           604: This operation invalidates the nami cache.
        !           605: The client sends multiple messages to the server, reading at most \fImax_message_size\fP-16
        !           606: bytes at a time (currently 5104 bytes).
        !           607: .PP
        !           608: The message sent to the server includes an operation-specific \f(CWsnbread\fP structure:
        !           609: .P1
        !           610: struct snbread {
        !           611:        long len;
        !           612:        long offset;
        !           613: }
        !           614: .P2
        !           615: \f(CWlen\fP is the number of bytes to be read and \f(CWoffset\fP is the offset in
        !           616: the file at which the read should start.  The message sent to the server is as follows:
        !           617: .KS
        !           618: .ps -\n(tP
        !           619: .vs -\n(tVu
        !           620: .TS
        !           621: center,box;
        !           622: c s
        !           623: a | a .
        !           624: NBREAD request
        !           625: =
        !           626: sendb  value
        !           627: _      _       
        !           628: version        2
        !           629: cmd    NBREAD
        !           630: flags  0
        !           631: rsva   unused
        !           632: trannum        transaction number
        !           633: len    sizeof(struct sendb)+
        !           634:        sizeof(struct snbread)
        !           635:        (32 bytes)
        !           636: tag    tag of inode
        !           637: uid    uid of client
        !           638: gid    gid of client
        !           639: rsvb   unused
        !           640: _      _
        !           641: snbread        value
        !           642: _      _
        !           643: len    number of bytes to read
        !           644: offset byte offset where to start
        !           645:        reading
        !           646: .TE
        !           647: .ps +\n(tP
        !           648: .vs +\n(tVu
        !           649: .KE
        !           650: .PP
        !           651: The server reads the data and sends it back to the client.  When all of
        !           652: the data is read, or
        !           653: .I read (2)
        !           654: returns less than the amount asked for, the \f(CWflags\fP
        !           655: field is set to NBEND.
        !           656: The message sent from the server to the client is:
        !           657: .KS
        !           658: .ps -\n(tP
        !           659: .vs -\n(tVu
        !           660: .TS
        !           661: center,box;
        !           662: c s
        !           663: a | a .
        !           664: NBREAD response
        !           665: =
        !           666: recvb  value
        !           667: _      _       
        !           668: trannum        transaction number
        !           669: errno  error number or 0
        !           670: flags  0 or NBEND
        !           671: rsvd   unused
        !           672: len    sizeof(struct recvb)+
        !           673:        number of bytes read
        !           674: fsize  size of attempted read
        !           675: _      _
        !           676: data   read from file
        !           677: .TE
        !           678: .ps +\n(tP
        !           679: .vs +\n(tVu
        !           680: .KE
        !           681: .NH 2 
        !           682: nbwrite
        !           683: .PP
        !           684: This operation invalidates the nami cache.
        !           685: The client sends multiple messages to the server, writing at most \fImax_message_size\fP-32
        !           686: bytes at a time (currently 5088 bytes).
        !           687: The message sent to the server includes an operation-specific \f(CWsnbwrite\fP structure:
        !           688: .P1
        !           689: struct snbwrite {
        !           690:        long len;
        !           691:        long offset;
        !           692: }
        !           693: .P2
        !           694: \f(CWlen\fP is the number of bytes to be written and \f(CWoffset\fP is the offset in
        !           695: the file at which the write should start.  The message sent to the server is as follows:
        !           696: .KS
        !           697: .ps -\n(tP
        !           698: .vs -\n(tVu
        !           699: .TS
        !           700: center,box;
        !           701: c s
        !           702: a | a .
        !           703: NBWRT request
        !           704: =
        !           705: sendb  value
        !           706: _      _       
        !           707: version        2
        !           708: cmd    NBWRT
        !           709: flags  0
        !           710: rsva   unused
        !           711: trannum        transaction number
        !           712: len    sizeof(struct sendb)+
        !           713:        sizeof(struct snbwrite)+
        !           714:        number of bytes to write
        !           715: tag    tag of inode
        !           716: uid    uid of client
        !           717: gid    gid of client
        !           718: rsvb   unused
        !           719: _      _
        !           720: snbwrite       value
        !           721: _      _
        !           722: len    number of bytes to write
        !           723: offset byte offset where to
        !           724:        start writing
        !           725: _      _
        !           726: data   to be written
        !           727: .TE
        !           728: .ps +\n(tP
        !           729: .vs +\n(tVu
        !           730: .KE
        !           731: The client marks the inode (IUPD|ICHG).  After the write, the server seeks to
        !           732: the end of the file and updates the size of the file.  The message sent back to the client is:
        !           733: .KS
        !           734: .ps -\n(tP
        !           735: .vs -\n(tVu
        !           736: .TS
        !           737: center,box;
        !           738: c s
        !           739: a | a .
        !           740: NBWRT response
        !           741: =
        !           742: recvb  value
        !           743: _      _       
        !           744: trannum        transaction number
        !           745: errno  error number or 0
        !           746: flags  0
        !           747: rsvd   unused
        !           748: len    sizeof(struct recvb)
        !           749:        (16 bytes)
        !           750: fsize  file size
        !           751: .TE
        !           752: .ps +\n(tP
        !           753: .vs +\n(tVu
        !           754: .KE
        !           755: The client updates the size of the file in the inode with \f(CWfsize\fP.
        !           756: .NH 2 
        !           757: nbstat
        !           758: .PP
        !           759: The client maintains a one-entry cache from nami processing to avoid
        !           760: sending a stat message to the server immediately after a nami operation.
        !           761: If the client cache entry is valid, the
        !           762: .I stat (2)
        !           763: is satisfied from the
        !           764: cached data.  Otherwise a message is sent to the server.  The operation-specific
        !           765: part of the message contains a \f(CWsnbstat\fP structure:
        !           766: .P1
        !           767: struct snbstat {
        !           768:        long ta;
        !           769:        long rsvd;
        !           770: }
        !           771: .P2
        !           772: \f(CWta\fP is the current time on the client and is used for synchronization.
        !           773: \f(CWrsvd\fP is a pad field.  The message sent from the client to the server is:
        !           774: .KS
        !           775: .ps -\n(tP
        !           776: .vs -\n(tVu
        !           777: .TS
        !           778: center,box;
        !           779: c s
        !           780: a | a .
        !           781: NBSTAT request
        !           782: =
        !           783: sendb  value
        !           784: _      _       
        !           785: version        2
        !           786: cmd    NBSTAT
        !           787: flags  0
        !           788: rsva   unused
        !           789: trannum        transaction number
        !           790: len    sizeof(struct sendb)+
        !           791:        sizeof(struct snbstat)
        !           792:        (32 bytes)
        !           793: tag    tag of inode
        !           794: uid    uid of client
        !           795: gid    gid of client
        !           796: rsvb   unused
        !           797: _      _
        !           798: snbstat        value
        !           799: _      _
        !           800: ta     current time on client
        !           801: rsvd   unused
        !           802: .TE
        !           803: .ps +\n(tP
        !           804: .vs +\n(tVu
        !           805: .KE
        !           806: .PP
        !           807: After each of the first three stat messages, and
        !           808: after every third stat message thereafter, the server recalculates the time drift between the
        !           809: client machine and the server machine.  The server uses
        !           810: .I fstat (2) to obtain the
        !           811: information about the given file.
        !           812: The response message sent to the client has an operation-specific header
        !           813: that contains a \f(CWrnbstat\fP structure:
        !           814: .P1
        !           815: struct rnbstat {
        !           816:        long    ino;
        !           817:        short   dev;
        !           818:        short   mode;
        !           819:        short   nlink;
        !           820:        short   uid, gid;
        !           821:        short   rdev;
        !           822:        long    size;
        !           823:        long    ta;
        !           824:        long    tm;
        !           825:        long    tc;
        !           826: };
        !           827: .P2
        !           828: The response message is as follows:
        !           829: .KS
        !           830: .ps -\n(tP
        !           831: .vs -\n(tVu
        !           832: .TS
        !           833: center,box;
        !           834: c s
        !           835: a | a .
        !           836: NBSTAT response
        !           837: =
        !           838: recvb  value
        !           839: _      _       
        !           840: trannum        transaction number
        !           841: errno  error number or 0
        !           842: flags  0
        !           843: rsvd   unused
        !           844: len    sizeof(struct recvb)+
        !           845:        sizeof(struct rnbstat)
        !           846:        (48 bytes)
        !           847: fsize  0
        !           848: _      _
        !           849: rnbstat        value
        !           850: _      _
        !           851: ino    inode number
        !           852: dev    device number
        !           853: mode   mode of file
        !           854: nlink  number of links to file
        !           855: uid    owner of file
        !           856: gid    group of file
        !           857: rdev   unused
        !           858: size   size of file
        !           859: ta     access time
        !           860: tm     modify time
        !           861: tc     change time
        !           862: .TE
        !           863: .ps +\n(tP
        !           864: .vs +\n(tVu
        !           865: .KE
        !           866: .NH 2 
        !           867: nbtrunc
        !           868: .PP
        !           869: \fINbtrunc\fP invalidates the nami cache.
        !           870: The message sent to the server is as follows:
        !           871: .KS
        !           872: .ps -\n(tP
        !           873: .vs -\n(tVu
        !           874: .TS
        !           875: center,box;
        !           876: c s
        !           877: a | a .
        !           878: NBTRNC request
        !           879: =
        !           880: sendb  value
        !           881: _      _       
        !           882: version        2
        !           883: cmd    NBTRNC
        !           884: flags  0
        !           885: rsva   unused
        !           886: trannum        transaction number
        !           887: len    sizeof(struct sendb)
        !           888:        (24 bytes)
        !           889: tag    tag of inode
        !           890: uid    uid of client
        !           891: gid    gid of client
        !           892: rsvb   unused
        !           893: .TE
        !           894: .ps +\n(tP
        !           895: .vs +\n(tVu
        !           896: .KE
        !           897: .PP
        !           898: The client must own the file to be allowed to truncate it.  The server uses
        !           899: .I creat (2)
        !           900: to truncate the file.  Since
        !           901: .I creat
        !           902: also opens the file
        !           903: for writing, the server immediately closes it.  The message sent back to the
        !           904: client is:
        !           905: .KS
        !           906: .ps -\n(tP
        !           907: .vs -\n(tVu
        !           908: .TS
        !           909: center,box;
        !           910: c s
        !           911: a | a .
        !           912: NBTRNC response
        !           913: =
        !           914: recvb  value
        !           915: _      _       
        !           916: trannum        transaction number
        !           917: errno  error number or 0
        !           918: flags  nami flags
        !           919: rsvd   unused
        !           920: len    sizeof(struct recvb)
        !           921:        (16 bytes)
        !           922: fsize  0
        !           923: .TE
        !           924: .ps +\n(tP
        !           925: .vs +\n(tVu
        !           926: .KE
        !           927: .NH 2 
        !           928: nbnami
        !           929: .PP
        !           930: The file system-specific nami performs a number of operations.
        !           931: It can parse a pathname, link a file, unlink a file,
        !           932: make a directory, remove a directory, and create a file. 
        !           933: The message sent to the server contains an operation-specific header in the form
        !           934: of a \f(CWsnbnami\fP structure:
        !           935: .P1
        !           936: struct snbnami {
        !           937:        short mode;
        !           938:        short dev;
        !           939:        long ino;
        !           940: }
        !           941: .P2
        !           942: The message sent to the server is as follows:
        !           943: .KS
        !           944: .ps -\n(tP
        !           945: .vs -\n(tVu
        !           946: .TS
        !           947: center,box;
        !           948: c s
        !           949: a | a .
        !           950: NBNAMI request
        !           951: =
        !           952: sendb  value
        !           953: _      _       
        !           954: version        2
        !           955: cmd    NBNAMI
        !           956: flags  nami operation
        !           957: rsva   unused
        !           958: trannum        transaction number
        !           959: len    sizeof(struct sendb)+
        !           960:        sizeof(struct snbnami)+
        !           961:        number of bytes in the
        !           962:        pathname
        !           963: tag    tag of inode
        !           964: uid    uid of client
        !           965: gid    gid of client
        !           966: rsvb   unused
        !           967: _      _
        !           968: snbnami        value
        !           969: _      _
        !           970: mode   mode of inode for
        !           971:        NI_CREAT, NI_NXCREAT,
        !           972:        and NI_MKDIR
        !           973: dev    unused
        !           974: ino    inode number (tag) for
        !           975:        NI_LINK
        !           976: _      _
        !           977: data   full pathname
        !           978: .TE
        !           979: .ps +\n(tP
        !           980: .vs +\n(tVu
        !           981: .KE
        !           982: The \f(CWflags\fP field determines what the server should do.
        !           983: While parsing the pathname, if it goes out of the remote file system, the server
        !           984: sets the \f(CWflags\fP field in the response message to NBROOT and sends the message
        !           985: back to the client so the
        !           986: client can continue with pathname evaluation.  Each nami operation is described in the
        !           987: following sections.
        !           988: .X "PARM CT 60
        !           989: .PP
        !           990: The response message sent back to the client contains a \f(CWrnbnami\fP structure:
        !           991: .P1
        !           992: struct rnbnami {
        !           993:        long    tag;
        !           994:        long    ino;
        !           995:        short   dev;
        !           996:        short   mode;
        !           997:        long    used;
        !           998:        short   nlink;
        !           999:        short   uid, gid;
        !          1000:        short   rdev;
        !          1001:        long    size;
        !          1002:        long    ta;
        !          1003:        long    tm;
        !          1004:        long    tc;
        !          1005: };
        !          1006: .P2
        !          1007: The message is as follows:
        !          1008: .KS
        !          1009: .ps -\n(tP
        !          1010: .vs -\n(tVu
        !          1011: .TS
        !          1012: center,box;
        !          1013: c s
        !          1014: a | a .
        !          1015: NBNAMI response
        !          1016: =
        !          1017: recvb  value
        !          1018: _      _       
        !          1019: trannum        transaction number
        !          1020: errno  error number or 0
        !          1021: flags  0 or NBROOT
        !          1022: rsvd   unused
        !          1023: len    sizeof(struct recvb)+
        !          1024:        sizeof(struct rnbnami)
        !          1025:        (56 bytes)
        !          1026: fsize  0
        !          1027: _      _
        !          1028: rnbnami        value
        !          1029: _      _
        !          1030: tag    tag
        !          1031: ino    inode number
        !          1032: dev    device number
        !          1033: mode   mode of file
        !          1034: used   if NBROOT, number of bytes
        !          1035:        parsed in pathname
        !          1036: nlink  number of links to file
        !          1037: uid    owner of file
        !          1038: gid    group of file
        !          1039: rdev   unused
        !          1040: size   size of file
        !          1041: ta     access time
        !          1042: tm     modify time
        !          1043: tc     change time
        !          1044: .TE
        !          1045: .ps +\n(tP
        !          1046: .vs +\n(tVu
        !          1047: .KE
        !          1048: .PP
        !          1049: If the pathname evaluates to a file on the server's file system, then the server
        !          1050: will perform different tasks based on the value of \f(CWflags\fP in the request message.
        !          1051: .NH 3 
        !          1052: NI_SEARCH
        !          1053: .PP
        !          1054: The server opens the file and sends the response message to the client.
        !          1055: .NH 3 
        !          1056: NI_DEL
        !          1057: .PP
        !          1058: If the client process has write permission in the directory containing the file, and if
        !          1059: the file is a regular file, then the server attempts to
        !          1060: .I unlink (2)
        !          1061: it.
        !          1062: If the file is a directory, the server tries to remove it with
        !          1063: .I rmdir (2)
        !          1064: instead.  Other
        !          1065: file types cannot be deleted.
        !          1066: .NH 3 
        !          1067: NI_CREAT
        !          1068: .PP
        !          1069: The server creates (and truncates) the file with
        !          1070: .I creat (2).
        !          1071: For
        !          1072: new file creation, the server does not allow special files or symbolic links
        !          1073: to be created.
        !          1074: .NH 3 
        !          1075: NI_NXCREAT
        !          1076: .PP
        !          1077: This does the same thing as NI_CREAT, but if the file already exists, it
        !          1078: fails with EEXIST.
        !          1079: .NH 3 
        !          1080: NI_LINK
        !          1081: .PP
        !          1082: If the file already exists, the server fails the operation with EEXIST.
        !          1083: Otherwise, the server uses
        !          1084: .I link (2)
        !          1085: to link the filename to the file
        !          1086: represented by the client inode given by \f(CWino\fP.
        !          1087: .NH 3 
        !          1088: NI_MKDIR
        !          1089: .PP
        !          1090: If the file (directory) already exists, the server fails the operation with EEXIST.
        !          1091: If the server has write permissions in the parent directory, then a new directory
        !          1092: is created with
        !          1093: .I mkdir (2).
        !          1094: .NH 3 
        !          1095: NI_RMDIR
        !          1096: .PP
        !          1097: This does the same thing as NI_DEL, but deals only with removing directories.
        !          1098: .NH 2 
        !          1099: nbdirread
        !          1100: .PP
        !          1101: This operation is used to read a directory and present the contents in a canonical form.
        !          1102: The form is a NULL-terminated character string containing the i-number in decimal, a
        !          1103: tab, and the filename.
        !          1104: .PP
        !          1105: The client sends one message to the server, reading at most \fImax_message_size\fP-24
        !          1106: bytes at a time (5096 bytes).
        !          1107: The message sent to the server contains an operation-specific header in the form
        !          1108: of a \f(CWsnbread\fP structure (see \(sc5.6).
        !          1109: The message is as follows:
        !          1110: .KS
        !          1111: .ps -\n(tP
        !          1112: .vs -\n(tVu
        !          1113: .TS
        !          1114: center,box;
        !          1115: c s
        !          1116: a | a .
        !          1117: NBDIR request
        !          1118: =
        !          1119: sendb  value
        !          1120: _      _       
        !          1121: version        2
        !          1122: cmd    NBDIR
        !          1123: flags  0
        !          1124: rsva   unused
        !          1125: trannum        transaction number
        !          1126: len    sizeof(struct sendb)+
        !          1127:        sizeof(struct snbread)
        !          1128:        (32 bytes)
        !          1129: tag    tag of inode
        !          1130: uid    uid of client
        !          1131: gid    gid of client
        !          1132: rsvb   unused
        !          1133: _      _
        !          1134: snbread        value
        !          1135: _      _
        !          1136: len    number of bytes to read
        !          1137: offset byte offset where to
        !          1138:        start reading
        !          1139: .TE
        !          1140: .ps +\n(tP
        !          1141: .vs +\n(tVu
        !          1142: .KE
        !          1143: .PP
        !          1144: The server reads the directory and responds back with a message containing the directory
        !          1145: contents and an operation-specific header in the form of a \f(CWrnbdir\fP structure:
        !          1146: .P1
        !          1147: struct rnbdir {
        !          1148:        long    used;
        !          1149:        long    rsvd;
        !          1150: };
        !          1151: .P2
        !          1152: The response message is as follows:
        !          1153: .KS
        !          1154: .ps -\n(tP
        !          1155: .vs -\n(tVu
        !          1156: .TS
        !          1157: center,box;
        !          1158: c s
        !          1159: a | a .
        !          1160: NBDIR response
        !          1161: =
        !          1162: recvb  value
        !          1163: _      _       
        !          1164: trannum        transaction number
        !          1165: errno  error number or 0
        !          1166: flags  0
        !          1167: rsvd   unused
        !          1168: len    sizeof(struct recvb)+
        !          1169:        sizeof(struct rnbdir)
        !          1170:        (24 bytes)
        !          1171: fsize  size of attempted read
        !          1172: _      _
        !          1173: rnbdir value
        !          1174: _      _
        !          1175: used   bytes read
        !          1176: rsvd   unused
        !          1177: _      _
        !          1178: data   directory entries
        !          1179: .TE
        !          1180: .ps +\n(tP
        !          1181: .vs +\n(tVu
        !          1182: .KE
        !          1183: .PP
        !          1184: On success, \f(CWused\fP contains the number of bytes read.  It is added to \f(CWu.u_offset\fP
        !          1185: to get the new offset in the directory.
        !          1186: .NH 2 
        !          1187: nbioctl
        !          1188: .PP
        !          1189: The client side supports three
        !          1190: .I ioctl (2)
        !          1191: commands private to
        !          1192: the file system type.  NBIOCON turns debugging on, NBIOCOFF turns
        !          1193: debugging off, and NBIOCBSZ changes the network message size.
        !          1194: All other commands are sent to the server.  It is assumed that all
        !          1195: .I ioctl s
        !          1196: contain a 64-byte buffer of data needed for the operation.
        !          1197: Data are copied in from the buffer to send to the server and any resulting data
        !          1198: are copied out to the buffer if the operation succeeds.
        !          1199: The message sent to the server contains an operation-specific header in the form
        !          1200: of a \f(CWsnbioc\fP structure:
        !          1201: .P1
        !          1202: struct snbioc {
        !          1203:        long    cmd;
        !          1204:        short   flag;
        !          1205:        short   rsvd;
        !          1206: }
        !          1207: .P2
        !          1208: The message sent to the server is:
        !          1209: .KS
        !          1210: .ps -\n(tP
        !          1211: .vs -\n(tVu
        !          1212: .TS
        !          1213: center,box;
        !          1214: c s
        !          1215: a | a .
        !          1216: NBIOCTL request
        !          1217: =
        !          1218: sendb  value
        !          1219: _      _       
        !          1220: version        2
        !          1221: cmd    NBIOCTL
        !          1222: flags  0
        !          1223: rsva   unused
        !          1224: trannum        transaction number
        !          1225: len    sizeof(struct sendb)+
        !          1226:        sizeof(struct snbioc)+
        !          1227:        64 bytes of user data
        !          1228:        (96 bytes)
        !          1229: tag    tag of inode
        !          1230: uid    uid of client
        !          1231: gid    gid of client
        !          1232: rsvb   unused
        !          1233: _      _
        !          1234: snbioc value
        !          1235: _      _
        !          1236: cmd    ioctl command
        !          1237: flag   file table flags
        !          1238: rsvd   unused
        !          1239: _      _
        !          1240: data   from user ioctl buffer
        !          1241: .TE
        !          1242: .ps +\n(tP
        !          1243: .vs +\n(tVu
        !          1244: .KE
        !          1245: The response message sent from the server to the client is:
        !          1246: .KS
        !          1247: .ps -\n(tP
        !          1248: .vs -\n(tVu
        !          1249: .TS
        !          1250: center,box;
        !          1251: c s
        !          1252: a | a .
        !          1253: NBIOCTL response
        !          1254: =
        !          1255: recvb  value
        !          1256: _      _       
        !          1257: trannum        transaction number
        !          1258: errno  error number or 0
        !          1259: flags  0
        !          1260: rsvd   unused
        !          1261: len    sizeof(struct recvb)+
        !          1262:        64 bytes of user data
        !          1263:        (80 bytes)
        !          1264: fsize  0
        !          1265: _      _
        !          1266: data   for user ioctl buffer
        !          1267: .TE
        !          1268: .ps +\n(tP
        !          1269: .vs +\n(tVu
        !          1270: .KE
        !          1271: .PP
        !          1272: Currently, \fIzarf\fP does not support \fIioctl\fP and returns ENOTTY for
        !          1273: this operation.
        !          1274: .X PARM CT 50
        !          1275: .NH 1 
        !          1276: Permissions
        !          1277: .PP
        !          1278: The server determines permissions by matching passwd and group files.
        !          1279: Exceptions to the default permissions can be found in
        !          1280: .CW /usr/netb/except.local
        !          1281: and
        !          1282: .CW /usr/netb/except .
        !          1283: The format of these files are comment lines begin with
        !          1284: .CW # ,
        !          1285: blank lines are ignored, and lines may contain one of four valid directives.
        !          1286: .PP
        !          1287: The
        !          1288: .CW client
        !          1289: directive specifies the client to which the following lines apply:
        !          1290: .P1
        !          1291: client \fICLIENT_NAME
        !          1292: .P2
        !          1293: where \fICLIENT_NAME\fP is the name of the client machine, or
        !          1294: .CW *
        !          1295: for all clients that
        !          1296: do not have an explicit entry.  The client name is separated from the keyword
        !          1297: by spaces or tabs.
        !          1298: .PP
        !          1299: The
        !          1300: .CW uid
        !          1301: directive specifies how to map a given user:
        !          1302: .P1
        !          1303: uid \fICLIENT_USR_NAME\fP=\fISERVER_USR_NAME
        !          1304: .P2
        !          1305: where \fICLIENT_USR_NAME\fP is the name of a user on the client machine and
        !          1306: \fISERVER_USR_NAME\fP is the name of a user on the server machine to which the client
        !          1307: is mapped.  \fISERVER_USR_NAME\fP
        !          1308: may be left out signifying the client is not to be mapped (i.e. disallowed access.)
        !          1309: .PP
        !          1310: The
        !          1311: .CW gid
        !          1312: directive specifies how to map a given group:
        !          1313: .P1
        !          1314: gid \fICLIENT_GRP_NAME\fP=\fISERVER_GRP_NAME
        !          1315: .P2
        !          1316: where \fICLIENT_GRP_NAME\fP is the name of a group on the client machine and
        !          1317: \fISERVER_GRP_NAME\fP
        !          1318: is the name of a group on the server machine to which the client is mapped.
        !          1319: \fISERVER_GRP_NAME\fP
        !          1320: may be left out signifying the client is not to be mapped (i.e. disallowed access.)
        !          1321: .PP
        !          1322: The
        !          1323: .CW param
        !          1324: directive conveys specific parameters to the server:
        !          1325: .P1
        !          1326: param \fINAME\fP=\fIVALUE
        !          1327: .P2
        !          1328: The following parameters
        !          1329: .I NAME ) (
        !          1330: are supported:
        !          1331: .IP \f(CWotherok\fP 10
        !          1332: this may take on a value of either 0 or 1.  A value of 1 gives read
        !          1333: permissions to client ids that are not mapped and a value of 0 denies access.  In either
        !          1334: case, client ids that are not mapped are denied write access.
        !          1335: .IP \f(CWroot\fP
        !          1336: the value for this parameter is the pathname of the root from
        !          1337: which the server will execute.
        !          1338: .NH 1 
        !          1339: Acknowledgements
        !          1340: .PP
        !          1341: Peter Weinberger originally wrote the network file system.
        !          1342: More recently, Norman
        !          1343: Wilson has fixed bugs and rewritten \fIzarf\fP and \fIsetup\fP.
        !          1344: He greatly improved the
        !          1345: portability of \fIzarf\fP.  Thanks to Peter Honeyman, Dennis Ritchie, and Norman
        !          1346: Wilson for reviewing this paper.
        !          1347: .NH 1 
        !          1348: References
        !          1349: .LP
        !          1350: |reference_placement

unix.superglobalmegacorp.com

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