<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-cel-nfsv4-nfs-acl-02" category="info" submissionType="IETF" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="NFS ACL Protocol">The Network File System Access Control List Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-cel-nfsv4-nfs-acl-02"/>
    <author fullname="Chuck Lever" role="editor">
      <organization abbrev="Oracle">Oracle Corporation</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date year="2025" month="September" day="11"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS</keyword>
    <keyword>ACL</keyword>
    <abstract>
      <?line 90?>

<t>This Informational document describes the NFS_ACL protocol.
NFS_ACL is a legacy member of the Network File System family
of protocols that NFS clients use to view and update Access
Control Lists stored on an NFS version 2 or version 3 server.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chucklever.github.io/i-d-nfs-acl/draft-cel-nfsv4-nfs-acl.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-cel-nfsv4-nfs-acl/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network File System Version 4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chucklever/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 98?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Network File System protocol (NFS) was introduced by Sun
Microsystems in the 1980s. This protocol enabled applications
to access and modify files, via local POSIX system interfaces,
that reside on a remote host <xref target="RFC1094"/>.</t>
      <t>Traditionally, permission to access files stored in NFS file
systems is granted by permission bits, mimicking <xref target="POSIX"/>.
Permission bits provide coarse-grained access control. The
file owner can control only whether members of her group can
read, write, or execute the file contents, or whether anyone
else (without exception) has those rights.</t>
      <t>An Access Control List, or ACL, is a mechanism that enables
file owners to grant specific users fine-grained access
rights to file content <xref target="IEEE"/>.</t>
      <t>Version 2 of NFS is described in <xref target="RFC1094"/>, and version 3
in <xref target="RFC1813"/>. Neither of these protocols include a method
for managing ACLs associated with files shared via the NFS
protocol, even though the local file systems shared via NFS
often implemented ACLs and gave local users mechanisms to
read and update them.</t>
      <t>Sun created the NFS_ACL protocol to provide that mechanism
for files accessed remotely via NFS. Later, other operating
systems, including Linux, implemented NFS_ACL for similar
reasons.</t>
      <t>This document describes the protocol based on the nfs_acl.x
file that is publicly available in the OpenSolaris
code base <xref target="OpenSolaris"/>. The editor has attempted to
introduce no changes to the protocol as it is implemented
in those operating systems and in Linux.</t>
      <t>The document assumes readers are already familiar with the
NFS version 2 or 3 protocols and at least one implementation
of them.</t>
      <t>Issues of compatibility between the protocol described in
this document and NFSv4 ACLs (as described by <xref target="RFC8881"/>)
are considered out of scope. More information on this topic
is available in Section 6 of draft-rmacklem-nfsv4-posix-acls.</t>
      <t>Local file systems on NFSv2 and NFSv3 servers determine the
particular semantics of each Access Control List -- in other
words, how the server uses each Access Control List to
authorize access to file content. This document serves only
as a description of the network protocol used to exchange
ACLs between NFS clients and servers.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>As with most publications by standards bodies, this document
has been published so that people may continue to create
compatible implementations. However, note that, as an
Informational document, this RFC does not make any compliance
mandates on implementations of the protocol described herein.</t>
    </section>
    <section anchor="general-concepts">
      <name>General Concepts</name>
      <section anchor="a-glossary-of-useful-terms">
        <name>A Glossary of Useful Terms</name>
        <t>The following are a set of foundational terms used throughout
this document.</t>
        <dl>
          <dt>application:</dt>
          <dd>
            <t>A program that executes on a client system.</t>
          </dd>
          <dt>client:</dt>
          <dd>
            <t>A computer system that utilizes compute resources provided by one or
more servers.</t>
          </dd>
          <dt>file:</dt>
          <dd>
            <t>A unit of data storage consisting of an ordered stream of
bytes and a set of metadata attributes.</t>
          </dd>
          <dt>gid:</dt>
          <dd>
            <t>A 32-bit unsigned integer that represents a group of users.</t>
          </dd>
          <dt>server:</dt>
          <dd>
            <t>A computer system that provides compute resources to network peers.</t>
          </dd>
          <dt>uid:</dt>
          <dd>
            <t>A 32-bit unsigned integer that represents a specific user.</t>
          </dd>
          <dt>user:</dt>
          <dd>
            <t>A person logged in on a client system.</t>
          </dd>
        </dl>
      </section>
      <section anchor="remote-procedure-call">
        <name>Remote Procedure Call</name>
        <t>The Sun Remote Procedure Call (SunRPC) protocol provides a
procedure-oriented interface to remote services. Each server
supplies a program, which is a set of procedures. The NFS
service is one such program. The combination of host address,
program number, version number, and procedure number specify one
remote service procedure.  Servers can support multiple versions
of a program that are accessed using different protocol version
numbers.</t>
        <t>The NFS and NFS_ACL protocols are both based on SunRPC. The
remainder of this document assumes an NFS environment that is
implemented on top of SunRPC, as it is specified in <xref target="RFC5531"/>.</t>
      </section>
      <section anchor="external-data-representation">
        <name>External Data Representation</name>
        <t>The eXternal Data Representation (XDR) specification provides a
standard way of representing a set of data types on a network.
XDR addresses the problem of communication between network
peers with different byte orders, structure alignment, and data
type representation.</t>
        <t>This document utilizes the RPC Data Description Language to
specify the XDR format arguments and results to each of the RPC
service procedures that an NFS_ACL server provides.</t>
        <t>Readers can find a full guide to XDR and the RPC Data Description
Language in <xref target="RFC4506"/>.</t>
      </section>
      <section anchor="authentication-and-authorization">
        <name>Authentication and Authorization</name>
        <t>The RPC protocol includes fields in every procedure call for
user authentication parameters. The specific content of the
authentication parameters is determined by the type of
authentication used by the server and client. A discussion
of the mechanics of RPC user authentication appears in
<xref target="RFC5531"/>, in particular Sections 9 and 10.</t>
        <t>For NFS ACLs, the user ID carried in RPC calls is used
for two purposes:</t>
        <ul spacing="normal">
          <li>
            <t>When setting an ACL via the SETACL procedure or retrieving
an ACL via the GETACL procedure, the NFS_ACL service verifies
that the calling user has been granted permission to perform
the procedure.</t>
          </li>
          <li>
            <t>Each Access Control Entry (see below) contains an element
that identifies the user to which the ACE applies. That
user is represented by a 32-bit user ID. The value of the
user ID in each ACE has the same meaning and mapping as
the value of incoming RPC calls.</t>
          </li>
        </ul>
        <t>Using user ids and group ids implies that the client and
server either share the same ID list or do local user and
group ID mapping. Servers and clients must agree on the
mapping from user to uid and from group to gid, for those
sites that do not implement a consistent user ID and group
ID number space. In practice, such mapping is typically
performed on the server, following a static mapping scheme
or a mapping established by the user from a client at
mount time.</t>
        <t>RPCSEC_GSS authentication provides stronger
security through the use of cryptographic authentication.
The server and client must agree on the mapping of the
user's GSS principal to a local UID on the server, but
the name to identity mapping is more operating system
independent than the uid and gid mapping in AUTH_UNIX.</t>
      </section>
      <section anchor="file-access-control">
        <name>File Access Control</name>
        <t>This section describes the abstractions that an NFS server
uses to determine whether an access or modification
to a file is permitted. The exact behavior of a server
implementation may vary.</t>
        <section anchor="file-ownership">
          <name>File Ownership</name>
          <t>A file’s "owner" is the designated user that is always granted
permission to update that file’s security attributes. As part of
creating a file, the NFS server assigns the file’s owner. Under
normal circumstances the initial file owner is the RPC user who
issued the NFS CREATE procedure. However, server security policies
can mandate replacement of that user (also known as user squashing)
as part of processing a CREATE procedure.</t>
          <t>An existing file’s designated owner can subsequently be changed by
an NFS SETATTR procedure. After that change, the new owner is
granted permission to update the file’s security attributes and
the old owner is no longer treated specially.</t>
          <t>A file’s "owner group" is a short list of users that have
similar privileges as the file’s owner, but are treated as a
separate category for the purpose of permission checking.</t>
          <t>Any user who is not a file's owner or a member of its owner
group falls into the third category, known as "everyone" or
"other".</t>
          <section anchor="superuser-access">
            <name>Superuser Access</name>
            <t>On most operating systems, there is a category of users known as
privileged users or superusers. These users can bypass most or
all access controls on files.</t>
          </section>
        </section>
        <section anchor="categories-of-access">
          <name>Categories of Access</name>
          <t>In NFS versions 2 and 3, there are three rudimentary categories
of access:</t>
          <dl>
            <dt>Read access:</dt>
            <dd>
              <t>Read access grants permission for a user to read a file or
directory.</t>
            </dd>
            <dt>Write access:</dt>
            <dd>
              <t>Write access grants permission for a user to modify a file
or directory.</t>
            </dd>
            <dt>Execute access:</dt>
            <dd>
              <t>For a file, execute access grants permission for the user to
treat the file content as executable. For a directory object,
execute access grants permission for the user to perform a
lookup in that directory.</t>
            </dd>
          </dl>
        </section>
        <section anchor="traditional-permission-bits">
          <name>Traditional Permission Bits</name>
          <t>Permission bits, or mode bits, are the simplest and perhaps
oldest form of access control. Each file object has a set
of mode bits <xref target="POSIX"/>.</t>
          <t>Each of the user categories is given a set of three access
type bits. Altogether there are then nine bit flags for
every file object.</t>
        </section>
        <section anchor="access-control-lists">
          <name>Access Control Lists</name>
          <t>An Access Control Entry, or ACE, represents a set of access categories
and a specific user or group. An Access Control List is a list of ACEs.</t>
          <t>Mode bits, as explained in the previous section, are essentially an
ACL that always contains exactly three ACEs: one for the file's owner,
one for the file's owner group, and one for everyone else.</t>
          <section anchor="interpreting-access-control-lists">
            <name>Interpreting Access Control Lists</name>
            <t>NFS clients do not perform access checks based on their
interpretation of an ACL read from the server. NFS servers
are solely responsible for authorizing and restricting
access to file content via the NFS protocol.</t>
            <t>An NFS Access Control List is a list of three or more
Access Control Entries (ACEs) associated with one file
system object. Each Access Control Entry in this list
specifies a user and a set of access types granted to
that user.</t>
            <t>Only ACEs that match the requester are considered. Each
ACE is processed until all of the bits of the requester's
access have been ALLOWED. Once a bit has been ALLOWED,
that bit is no longer considered in the processing
of subsequent ACEs in the list.</t>
            <t>When the ACL has been fully processed, if there are bits
in the requester's mask that have not been ALLOWED,
access of that type is denied.</t>
            <t>Note that an ACL might not be the sole determiner of access. For example:</t>
            <ul spacing="normal">
              <li>
                <t>In the case of a file system exported as read-only,
the server may deny write access even though an object's
ACL grants it.</t>
              </li>
              <li>
                <t>Server implementations can grant some limited permission
to update an ACL in order to prevent a situation from
rising in which there is no valid way to ever modify the ACL.</t>
              </li>
              <li>
                <t>All servers will allow a user the ability to read the
data of the file when only the execute permission is granted
(i.e., if the ACL denies the user the NA_READ access and
allows the user NA_EXEC, the server will allow the user to
read the data of the file).</t>
              </li>
              <li>
                <t>Some server implementations have the notion of
owner-override, in which the owner of the object is allowed
to override accesses that are denied by the ACL. This can be
helpful, for example, to allow users continued access to
open files on which the permissions have changed.</t>
              </li>
              <li>
                <t>Some server implementations have the notion of a
"superuser" that has privileges beyond an ordinary user.
The superuser may be able to read or write data or metadata
in ways that would otherwise not be permitted by the object's
ACL.</t>
              </li>
            </ul>
            <t>NFS clients can use either the NFS_ACL version 2 ACCESS
procedure or the NFS version 3 ACCESS procedure to ask the
server to perform an access check based on the requesting
user and the ACL present on a file system object. Clients are
also free to simply try an operation to see what works, then
recover it the server denies access.</t>
          </section>
          <section anchor="acls-in-operation">
            <name>ACLs in Operation</name>
            <t>The SETACL procedure sets two types of Access Control Lists:</t>
            <dl>
              <dt>Access:</dt>
              <dd>
                <t>An NFS access ACL specifies the access permission
for a file object. Access Control Entries in an ACL's
"aclent" field comprise the object's access ACL.</t>
              </dd>
              <dt>Default:</dt>
              <dd>
                <t>An NFS default ACL specifies the default ACL that
is set on objects that are children of a directory.
Access Control Entries in an ACL's "dfaclent" comprise
an object's default ACL. The default ACL does not affect
access to the object on which it is set.</t>
              </dd>
            </dl>
            <t>Each NFS ACL must have one ACE for each of
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ.
An NFS ACL that consists only of these
three ACEs is referred to as a minimal NFS ACL.</t>
            <t>An NFS ACL may zero or more NA_USER and/or NA_GROUP
ACEs.</t>
            <t>When a client presents a SETACL operation that a server
finds is invalid or it cannot process, the server responds
with ACL2ERR_IO or ACL3ERR_INVAL, depending on the version
of NFS_ACL that is in use. ACLs that are not valid include:</t>
            <ul spacing="normal">
              <li>
                <t>The presented ACL does not contain one ACE for each of
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ</t>
              </li>
              <li>
                <t>The presented ACL is a default ACL but the target object
is not a directory</t>
              </li>
              <li>
                <t>The presented ACL contains too many ACEs</t>
              </li>
              <li>
                <t>The presented ACL's type field contains more than one
set bit</t>
              </li>
            </ul>
            <aside>
              <t>cel: What does the NA_ACL_DEFAULT bit do?</t>
            </aside>
            <aside>
              <t>rthurlow: In the Solaris acl(2)/facl(2) system calls, the
equivalently-defined ACL_DEFAULT is used after aclent
sorting to note where regular entries end and where default
entries start in a single list.  So perhaps it would be
normal for the dfaclent entries to all be so marked.</t>
            </aside>
            <t>The "id" field in an Access Control Entry is interpreted as follows:</t>
            <ul spacing="normal">
              <li>
                <t>For an ACE that specifies an NA_USER_OBJ, NA_USER,
NA_GROUP, and NA_GROUP_OBJ, the "id" field contains
a UID or GID value that identifies the user on the
server whose access permission is being set.</t>
              </li>
              <li>
                <t>For an ACE that specifies other types of permission,
the "id" field is ignored.</t>
              </li>
            </ul>
          </section>
          <section anchor="relationship-between-acls-and-other-file-attributes">
            <name>Relationship Between ACLs and Other File Attributes</name>
            <t>When an ACL is present on a file, the ACL controls the
requesting user's access to the file. Typically the NFS
server ignores the file's mode bits.</t>
            <t>Depending on the behavior of the local file system
implementation, changing the file's ACL via the SETACL
procedure may alter the file's mode bits, and changing
the mode bits via the SETATTR procedure may alter the
content of the ACL in any way. NFS clients should
refresh cached ACLs or file modes after one of these
operations.</t>
            <t>When an ACL is present on a file, changing the file's owner
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_USER_OBJ.</t>
            <t>When an ACL is present on a file, changing the file's group
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_GROUP_OBJ.</t>
            <t>If an NFS client observes that a file's ctime attribute
has changed, it should assume that any ACLs that are
present might have been modified.</t>
          </section>
          <section anchor="acl-inheritance">
            <name>ACL Inheritance</name>
            <aside>
              <t>Section needs to explain how default ACLs work and what
impact they may have on the mode bits of the new file.</t>
            </aside>
            <t>A client uses one of the NFS CREATE, MKDIR, or MKNOD procedures
to request instantiatiation of a new file object. The server uses
the default ACL from the parent directory as the initial access
ACL on the new object.</t>
          </section>
          <section anchor="historical-references">
            <name>Historical References</name>
            <t>The section entitled "The POSIX 1003.1e/1003.2c Working Group"
in <xref target="Gruenbacher"/> details the history of POSIX standards efforts
with regard to file access control. The editor recommends that
readers familiarize themselves with the extent to which POSIX
specifies the content and behavior of ACLs.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="protocol-elements-common-to-both-versions">
      <name>Protocol Elements Common to Both Versions</name>
      <section anchor="rpc-authentication">
        <name>RPC Authentication</name>
        <t>The NFS_ACL service uses AUTH_NONE in the NULL procedure.
All RPC authentication flavors may be used for other procedures.</t>
      </section>
      <section anchor="constants">
        <name>Constants</name>
        <t>These are the RPC constants needed to call the NFS Version 3
service.  They are given in decimal.</t>
        <dl>
          <dt>100227</dt>
          <dd>
            <t>The RPC program number for the NFS_ACL protocol</t>
          </dd>
        </dl>
        <t>Only versions 2 and 3 of this RPC program are valid.</t>
      </section>
      <section anchor="transport-address">
        <name>Transport address</name>
        <t>The NFS_ACL protocol can operate over the TCP, UDP, and RDMA
transport protocols.
For TCP and UDP, it uses port 2049, and for RDMA, it uses 20049.
In both cases, this is the same as the base NFS protocol.</t>
      </section>
      <section anchor="sizes">
        <name>Sizes</name>
        <sourcecode type="xdr"><![CDATA[
NFS_ACL_MAX_ENTRIES 1024
]]></sourcecode>
        <t>The maximum number of Access Control Entries allowed in one Access Control List array.</t>
      </section>
      <section anchor="basic-data-types">
        <name>Basic Data Types</name>
        <t>The following XDR definitions are basic scalar types that are used in other structures.</t>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned int uid;
]]></sourcecode>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned short o_mode;
]]></sourcecode>
      </section>
      <section anchor="structured-data-types">
        <name>Structured Data types</name>
        <t>The following XDR definitions are common structured data types
that are used in all versions of the NFS_ACL protocol.</t>
        <section anchor="aclent">
          <name>aclent</name>
          <t>This structure represents a single entry in an Access Control List.</t>
          <sourcecode type="xdr"><![CDATA[
struct aclent {
    int type;
    uid id;
    o_mode perm;
};
]]></sourcecode>
          <t>The "type" element in an Access Control Entry is a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_USER_OBJ = 0x1;        /* object owner */
const NA_USER = 0x2;            /* additional users */
const NA_GROUP_OBJ = 0x4;       /* owning group of the object */
const NA_GROUP = 0x8;           /* additional groups */
const NA_CLASS_OBJ = 0x10;      /* file group class and mask entry */
const NA_OTHER_OBJ = 0x20;      /* other entry for the object */
const NA_ACL_DEFAULT = 0x1000;  /* default flag */
]]></sourcecode>
          <t>The "perm" element in an Access Control Entry is also a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_READ = 0x4;            /* read permission */
const NA_WRITE = 0x2;           /* write permission */
const NA_EXEC = 0x1;            /* exec permission */
]]></sourcecode>
        </section>
        <section anchor="secattr">
          <name>secattr</name>
          <t>The secattr structure represents, on the wire, the full Access Control
List for one file system object. This list contains an array of
Access Control Entries that apply to the object, plus an array of
default Access Control Entries that are inherited by the object's
children.</t>
          <sourcecode type="xdr"><![CDATA[
struct secattr {
    u_int mask;
    int aclcnt;
    aclent aclent<NFS_ACL_MAX_ENTRIES>;
    int dfaclcnt;
    aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
};
]]></sourcecode>
          <t>The "mask" element of the secattr structure is a bit mask. The
bit field vvalues in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_ACL = 0x1;         /* aclent contains a valid list */
const NA_ACLCNT = 0x2;      /* number of entries in the aclent list */
const NA_DFACL = 0x4;       /* dfaclent contains a valid list */
const NA_DFACLCNT = 0x8;    /* number of entries in the dfaclent list */
]]></sourcecode>
          <t>These bit field values are also used in the "mask" element of the
GETACL2args and GETACL3args structures.</t>
        </section>
        <section anchor="interoperability-considerations">
          <name>Interoperability Considerations</name>
          <t>Interoperability between NFS peers that do not implement
the NFS_ACL protocol is what we already have today.
Interoperability between peers that both implement the NFS_ACL
protocol is described in the rest of this document.</t>
          <t>The following subsections briefly discuss three new
interoperability scenarios.</t>
          <section anchor="client-implements-nfsacl-server-does-not">
            <name>Client Implements NFS_ACL, Server Does Not</name>
            <t>Typically an NFS server that implements the NFS_ACL program will
advertise the presence of NFS_ACL via an rpcbind registration.
An NFS client that implements NFS_ACL should perform an rpcbind
query before attempting any NFS_ACL procedure <xref target="RFC1833"/>.</t>
            <t>If the client sends any NFS_ACL procedure without sending an
rpcbind query first, and the server does not implement the
NFS_ACL program, the server responds with an RPC access_stat
of PROG_UNAVAIL.</t>
          </section>
          <section anchor="server-implements-nfsacl-client-does-not">
            <name>Server Implements NFS_ACL, Client Does Not</name>
            <t>An NFS server that implements advanced access control can
deny requests made by a client by responding with
NFS2ERR_ACCESS or NFS3ERR_ACCESS status codes, and an
NFS client has no visibility as to why the denial occurred.
Neither can that client send operations to update
the access control on file objects.</t>
            <t>This is a quality of implementation issue for the client.</t>
          </section>
          <section anchor="client-implements-exported-file-system-does-not">
            <name>Client Implements, Exported File System Does Not</name>
            <t>An NFS server that implements the NFS_ACL protocol might
share both file systems that implement ACLs and
file systems that do not. In this case, NFS clients
detect the presence of an NFS_ACL service on the NFS
server.</t>
            <t>For file objects that do not implement ACL support:</t>
            <ul spacing="normal">
              <li>
                <t>The server responds to a GETACL procedure by returning
a manufactured minimal ACL (ie., only three ACEs) that
reflects the current mode bits of the object.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 3 procedure by
returning ACL3ERR_NOTSUPP.</t>
              </li>
            </ul>
            <aside>
              <t>Linux returns NFS3ERR_NOTSUPP even for NFS_ACLv2. Check Solaris.</t>
            </aside>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-2">
      <name>NFS_ACL Version 2</name>
      <t>Version 2 of the NFS_ACL protocol is used in conjunction only with
version 2 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-2">
        <name>Data types inherited from NFS version 2</name>
        <section anchor="ftype">
          <name>ftype</name>
          <t>The enumeration "ftype" gives the type of an NFS version 3 file.
This definition comes from <xref section="2.3.2" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype {
    NFNON = 0,
    NFREG = 1,
    NFDIR = 2,
    NFBLK = 3,
    NFCHR = 4,
    NFLNK = 5,
};
]]></sourcecode>
        </section>
        <section anchor="fhandlet">
          <name>fhandle_t</name>
          <t>NFS version 2 uses a fixed-size file handle. The following definition
comes from <xref section="2.3.3" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
typedef opaque fhandle[FHSIZE];
]]></sourcecode>
        </section>
        <section anchor="timeval">
          <name>timeval</name>
          <t>NFS version 2's "timeval" structure represents the number of seconds
and microseconds since midnight January 1, 1970, Greenwich Mean Time.
This definition comes from <xref section="2.3.4" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct timeval {
    unsigned int seconds;
    unsigned int useconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr">
          <name>nfsfattr</name>
          <t>This document refers to NFS version 2's file attribute structure
as "nfsfattr". This is the same as the fattr structure described
in <xref section="2.3.5" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr {
    ftype        type;
    unsigned int mode;
    unsigned int nlink;
    unsigned int uid;
    unsigned int gid;
    unsigned int size;
    unsigned int blocksize;
    unsigned int rdev;
    unsigned int blocks;
    unsigned int fsid;
    unsigned int fileid;
    timeval      atime;
    timeval      mtime;
    timeval      ctime;
};
]]></sourcecode>
        </section>
        <section anchor="defined-error-numbers">
          <name>Defined Error Numbers</name>
          <t><xref section="2.3.1" sectionFormat="of" target="RFC1094"/> describes an enumerated type called
"stat" which provides a status code for NFS version 2 results.
A matching type called "aclstat2" is defined in this document
for the similar purpose of returning NFS_ACL version 2 procedure
status codes. The numeric values of these two types match up,
though aclstat2 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
          <sourcecode type="xdr"><![CDATA[
enum aclstat2 {
    ACL2_OK = 0,
    ACL2ERR_PERM = 1,
    ACL2ERR_IO = 5,
    ACL2ERR_ACCES = 13,
    ACL2ERR_NOSPC = 28,
    ACL2ERR_ROFS = 30,
    ACL2ERR_DQUOT = 69,
    ACL2ERR_STALE = 70,
};
]]></sourcecode>
          <t>These status codes carry the following meanings:</t>
          <dl>
            <dt>ACL2ERR_PERM</dt>
            <dd>
              <t>Not owner. The caller does not have correct ownership to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_IO</dt>
            <dd>
              <t>Some sort of hard error occurred when the operation was in progress.  This could be a disk error, for example.</t>
            </dd>
            <dt>ACL2ERR_ACCES</dt>
            <dd>
              <t>Permission denied.  The caller does not have the correct permission to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_NOSPC</dt>
            <dd>
              <t>No space left on device.  The operation caused the server's file system to reach its limit.</t>
            </dd>
            <dt>ACL2ERR_ROFS</dt>
            <dd>
              <t>Read-only file system.  Write attempted on a read-only file system.</t>
            </dd>
            <dt>ACL2ERR_DQUOT</dt>
            <dd>
              <t>Disk quota exceeded.  The client's disk quota on the server has been exceeded.</t>
            </dd>
            <dt>ACL2ERR_STALE</dt>
            <dd>
              <t>The "fhandle" given in the arguments was invalid.  That is, the file referred to by that file handle no longer exists, or access to it has been revoked.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="server-procedures">
        <name>Server Procedures</name>
        <section anchor="procedure-0-null-no-operation">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implementation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors">
            <name>ERRORS</name>
            <t>Since the NULL procedure returns no result, it can not return an
NFS_ACL error status code. However, some server implementations may
return RPC-level errors based on security or authentication policy
settings.</t>
          </section>
        </section>
        <section anchor="procedure-1-getacl-retrieve-an-access-control-list">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-1">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2args {
    fhandle_t fh;
    u_int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-1">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2resok {
    struct nfsfattr attr;
    secattr acl;
};

union GETACL2res switch (enum nfsstat status) {
case ACL2_OK:
    GETACL2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-1">
            <name>DESCRIPTION</name>
            <t>The GETACL procedure retrieves Access Control List
information associated with the file system object
specified by the GETACL2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, or SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.</t>
            <t>The GETACL2args.mask field specifies which information
is to be returned in the response:</t>
            <ul spacing="normal">
              <li>
                <t>If the NA_ACL bit is set, the server fills in the
object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_ACLCNT bit is set, the server fills in
the number of ACEs that are in the object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACL bit is set, the server fills in
the object's default ACL.</t>
              </li>
              <li>
                <t>if the NA_DFACLCNT bit is set, the server fills in
the number of ACEs that are in the object's default ACL.</t>
              </li>
            </ul>
            <t>If the GETACL procedure is successful, the server sets the
GETACL2res.status field to ACL2_OK. It fills in the
GETACL2resok.attr field with the file object's current
file attributes, as detailed in <xref target="RFC1094"/>. Lastly,
it fills in the GETACL2res.acl field with two counted
arrays of Access Control Entries (ACEs).</t>
            <t>Otherwise, GETACL2res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-1">
            <name>IMPLEMENTATION</name>
            <t>When GETACL2args.fh represents a file object that does not currently
have an ACL associated with it or does not implement support
for ACLs, the server responds by returning a manufactured
minimal NFS ACL that reflects the current owner, group, and
mode bits of the object (see <xref target="acls-in-operation"/>).</t>
          </section>
          <section anchor="errors-1">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-2-setacl-set-or-replace-an-access-control-list">
          <name>Procedure 2: SETACL - Set or replace an Access Control List</name>
          <section anchor="arguments-2">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL2args {
    fhandle_t fh;
    secattr acl;
};
]]></sourcecode>
          </section>
          <section anchor="results-2">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL2resok {
    struct nfsfattr attr;
};

union SETACL2res switch (enum nfsstat status) {
case ACL2_OK:
    SETACL2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-2">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL2args.fh field with the ACLs specified by the
SETACL2args.acl field.  The client obtains the file
handle using one of the NFS version 2 LOOKUP, CREATE,
MKDIR, SYMLINK procedures, or the MOUNT service, as
described in <xref target="RFC1094"/>.</t>
            <aside>
              <t>How are ACLs removed?</t>
            </aside>
            <t>If the SETACL procedure is successful, the server sets the
SETACL2res.status field to ACL2_OK and fills in the
SETACL2resok.attr field with the file object's new
file attributes, as detailed in <xref target="RFC1094"/>.</t>
            <t>Otherwise, SETACL2res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-2">
            <name>IMPLEMENTATION</name>
            <t>On success, the server does not send the reply until
the ACL change is durable locally.</t>
            <t>Changing a file object's ACL changes the object's mtime.
The mtime change is reflected in the attributes returned
in the SETACL response.</t>
            <t>A high-quality server implementation ensures that a
GETACL procedure running concurrently with a SETACL
procedure does not return partially updated (torn)
ACL contents. However, a failed SETACL may partially
change a file's ACLs.</t>
            <t>When SETACL2args.fh represents a file object that does
not implement support for ACLs, or the new ACL does not
contain at least the minimal set of ACEs (as described
in <xref target="acls-in-operation"/>), the server responds by
setting SETACL2res.status to ACL2ERR_IO.</t>
          </section>
          <section anchor="errors-2">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getattr-get-file-attributes">
          <name>Procedure 3: GETATTR - Get file attributes</name>
          <section anchor="arguments-3">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2args {
    fhandle_t fh;
};
]]></sourcecode>
          </section>
          <section anchor="results-3">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2resok {
    struct nfsfattr attr;
};

union GETATTR2res switch (enum nfsstat status) {
case ACL2_OK:
    GETATTR2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-3">
            <name>DESCRIPTION</name>
            <t>The GETATTR procedure retrieves the current file
attributes associated with the file system object
specified by the GETATTR2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.</t>
            <t>If the GETATTR procedure is successful, the server
sets the GETATTR2res.status field to ACL2_OK, and
fills in the GETATTR2resok.attr field with the file
object's current file attributes, as detailed in
<xref target="RFC1094"/>.</t>
            <t>Otherwise, GETATTR2res.status contains an error
status on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-3">
            <name>IMPLEMENTATION</name>
            <t>Refer to <xref section="2.3.5" sectionFormat="of" target="RFC1094"/> for details
about the content of the returned file attributes.</t>
          </section>
          <section anchor="errors-3">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-4-access-check-access-permission">
          <name>Procedure 4: ACCESS - Check access permission</name>
          <section anchor="arguments-4">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct ACCESS2args {
    fhandle_t fh;
    uint32 access;
};
]]></sourcecode>
          </section>
          <section anchor="results-4">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
const ACCESS2_READ = 0x1;       /* read data or readdir a directory */
const ACCESS2_LOOKUP = 0x2;     /* lookup a name in a directory */
const ACCESS2_MODIFY = 0x4;     /* rewrite existing file data or */
                                /* modify existing directory entries */
const ACCESS2_EXTEND = 0x8;     /* write new data or add directory entries */
const ACCESS2_DELETE = 0x10;    /* delete existing directory entry */
const ACCESS2_EXECUTE = 0x20;   /* execute file (no meaning for a directory) */

struct ACCESS2resok {
    struct nfsfattr attr;
    uint32 access;
};

union ACCESS2res switch (enum nfsstat status) {
case ACL2_OK:
    ACCESS2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-4">
            <name>DESCRIPTION</name>
            <t>The ACCESS procedure determines the access rights
that a user, as identified by the RPC credentials
in the request, has with respect to the file handle
specified by the ACCESS2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.
The client encodes the set of permissions that are
to be checked in the ACCESS2args.access field.</t>
            <t>The following access permissions may be requested:</t>
            <dl>
              <dt>ACCESS2_READ</dt>
              <dd>
                <t>Read data from file or read a directory.</t>
              </dd>
              <dt>ACCESS2_LOOKUP</dt>
              <dd>
                <t>Look up a name in a directory (no meaning for non-directory objects).</t>
              </dd>
              <dt>ACCESS2_MODIFY</dt>
              <dd>
                <t>Rewrite existing file data or modify existing directory entries.</t>
              </dd>
              <dt>ACCESS2_EXTEND</dt>
              <dd>
                <t>Write new data or add directory entries.</t>
              </dd>
              <dt>ACCESS2_DELETE</dt>
              <dd>
                <t>Delete an existing directory entry (no meaning for non-directory objects).</t>
              </dd>
              <dt>ACCESS2_EXECUTE</dt>
              <dd>
                <t>Execute file (no meaning for a directory).</t>
              </dd>
            </dl>
            <t>If the ACCESS procedure is successful, the server
sets the ACCESS2res.status field to ACL2_OK. It
fills in the ACCESS2resok.attr field with the file
object's current file attributes, as detailed in
<xref target="RFC1094"/>. Lastly, it encodes the set of
permissions that the requesting user is granted
in the ACCESS2resok.access field.</t>
          </section>
          <section anchor="implementation-4">
            <name>IMPLEMENTATION</name>
            <t>In the NFS version 2 protocol, the only reliable way to
determine whether an operation is allowed is to try it
and see if it succeeded or failed. Using the ACCESS
procedure in the NFS_ACL version 2 protocol, a client can
ask the server to indicate whether or not one or more
classes of operations are permitted.</t>
            <t>In general, it is not sufficient for a client to attempt
to deduce access permissions by inspecting the uid, gid,
and mode fields in the file attributes, since the server
may perform uid or gid mapping or enforce additional
access control restrictions. It is also possible that the
NFS version 2 protocol server may not be in the same ID
space as the NFS version 2 protocol client. In these cases,
the NFS version 2 protocol client can not reliably perform
an access check with only current file attributes.</t>
            <t>The information returned by the server in response to an
ACCESS call is advisory only. It was correct at the exact
time that the server performed the checks, but not
necessarily afterwards. The server can revoke access
permission to a file object at any time.</t>
            <t>The NFS_ACL version 2 protocol client should use the
effective credentials of the user to build the
authentication information in the ACCESS request used
to determine access rights. It is the effective user
and group credentials that are used in subsequent read
and write operations.</t>
            <t>Many implementations do not directly support the
ACCESS2_DELETE permission. Operating systems like UNIX
may ignore the ACCESS2_DELETE bit if set on an access
request on a non-directory object. In these systems,
delete permission on a file is determined by the access
permissions on the directory in which the file resides,
instead of being determined by the permissions of the file
itself.  Thus, the bit mask returned for such a request
will have the ACCESS3_DELETE bit set to 0, indicating that
the client does not have this permission.</t>
            <t>The server should return a status of ACL2_OK if no
errors occurred that prevented the server from making
the required access checks.</t>
          </section>
          <section anchor="errors-4">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-5-getxattrdir-get-named-attribute-directory">
          <name>Procedure 5: GETXATTRDIR - Get named attribute directory</name>
          <section anchor="arguments-5">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR2args {
    fhandle_t fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-5">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR2resok {
    fhandle_t fh;
    struct nfsfattr attr;
};

union GETXATTRDIR2res switch (enum nfsstat status) {
case ACL2_OK:
    GETXATTRDIR2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-5">
            <name>DESCRIPTION</name>
            <t><xref section="5.3" sectionFormat="of" target="RFC8881"/> defines a set of generic file attributes known
as "named attributes". The GETXATTRDIR procedure extends this facility
into the NFSv2 protocol.</t>
            <t>The GETXATTRDIR procedure obtains the file handle of the named attribute
directory associated with the file handle in the GETXATTRDIR2args.fh
field. This directory contains only objects of type NFREG.</t>
            <t>If the GETXATTRDIR procedure is successful, the server sets the
GETXATTRDIR2res.status field to ACL2_OK.
It fills in the GETXATTRDIR2resok.fh field with a file handle that
the client may use to look up the target file's named attributes.
It fills in the GETXATTRDIR2resok.attr field with the name attribute
directory's current file attributes, as detailed in <xref target="RFC1094"/>.</t>
            <t>Using the file handle returned in GETXATTRDIR2resok.fh, a client
can utilize the READDIR and LOOKUP procedures to obtain file handles
for the named attributes associated with the target file system object.</t>
            <t>If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to false, the server returns ACL2ERR_NOENT.
If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to true, the server attempts to create the named attribute
directory before returning a result.
If the target file currently has a named attribute directory
associated with it and the GETXATTRDIR2args.create boolean is set
to true, the server returns the file handle of that named attribute
directory.</t>
            <t>If the RPC user does not have read access to the target file, or
if the GETXATTRDIR operation is to create a named attribute directory
and the RPC user does not have permission to do so, the server returns
ACL2_ACCES in the GETXATTRDIR2.status field.</t>
            <t>If the target file handle designates an object not of type NFREG or
NFDIR, the server returns the value ACL2ERR_IO in the GETXATTRDIR2.status
field. Neither named attributes nor named attribute directories have
their own named attributes.</t>
            <t>Note: This operation is equivalent to the NFSv4 OPENATTR operation as
specified in <xref section="16.17" sectionFormat="of" target="RFC7530"/> and <xref section="18.17" sectionFormat="of" target="RFC8881"/>.</t>
          </section>
          <section anchor="implementation-5">
            <name>IMPLEMENTATION</name>
            <t>Server implementers are free to choose not to implement this procedure.
In this case, the server returns the RPC-level error PROC_UNAVAIL.</t>
            <t>If the server implementation does implement the GETXATTRDIR procedure
but the shared file system containing the file object specified by the
file handle in the GETXATTRDIR2args.fh field does not support named
attributes, the server returns ACL2ERR_IO in the GETXATTRDIR2.status
field.</t>
          </section>
          <section anchor="errors-5">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_NOENT</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-3">
      <name>NFS_ACL Version 3</name>
      <t>Version 3 of the NFS_ACL protocol is used in conjunction only with
version 3 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-3">
        <name>Data types inherited from NFS version 3</name>
        <section anchor="scalar-data-types">
          <name>Scalar Data types</name>
          <t>These are defined in <xref section="2.5" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned hyper uint64;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned long uint32;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 fileid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 uid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 gid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 size3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 mode3;
]]></sourcecode>
        </section>
        <section anchor="ftype3">
          <name>ftype3</name>
          <t>The enumeration "ftype3" represents the type of a file object.
This definition is further explained in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype3 {
    NF3REG    = 1,
    NF3DIR    = 2,
    NF3BLK    = 3,
    NF3CHR    = 4,
    NF3LNK    = 5,
    NF3SOCK   = 6,
    NF3FIFO   = 7
};
]]></sourcecode>
        </section>
        <section anchor="specdata3">
          <name>specdata3</name>
          <sourcecode type="xdr"><![CDATA[
struct specdata3 {
    uint32     specdata1;
    uint32     specdata2;
};
]]></sourcecode>
          <t>The interpretation of the two words depends on the type of file
system object. For a block special (NF3BLK) or character special
(NF3CHR) file, specdata1 and specdata2 are the major and minor
device numbers, respectively. For all other file types, these
two elements should either be set to 0 or the values should be
agreed upon by the client and server.</t>
          <t>Further detail is available in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
        </section>
        <section anchor="nfsfh3">
          <name>nfs_fh3</name>
          <t>The nfs_fh3 data type is a variable-length opaque object returned
by the NFS version 3 LOOKUP, CREATE, SYMLINK, MKNOD, LINK,
or READDIRPLUS procedures.
A client uses this handle during subsequent NFS operations
to reference the file. This definition comes from
<xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
NFS3_FHSIZE 64
]]></sourcecode>
          <t>The maximum size in bytes of the opaque file handle.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfs_fh3 {
    opaque       data<NFS3_FHSIZE>;
};
]]></sourcecode>
          <t>To the client, a file handle is opaque. The client stores file
handles for use in a later request and can compare two file
handles from the same server for equality by doing a
byte-by-byte comparison, but cannot otherwise interpret the
contents of file handles. Further, if two file handles from the
same server are equal, they must refer to the same file, but if
they are not equal, no conclusions can be drawn.</t>
          <t>Servers may revoke access provided by a file handle at any
time. If the file handle passed in a call refers to a file
system object that no longer exists on the server or access for
that file handle has been revoked, the error, ACL3ERR_STALE,
is returned.</t>
        </section>
        <section anchor="nfstime3">
          <name>nfstime3</name>
          <t>NFS version 3's "nfstime3" structure represents the number of
seconds and nanoseconds since midnight January 1, 1970 Greenwich
Mean Time. Further details are in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfstime3 {
    uint32   seconds;
    uint32   nseconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr3">
          <name>nfsfattr3</name>
          <t>This document refers to NFS version 3's file attribute structure
as "nfsfattr3". This is the same as the fattr3 structure described
in <xref section="2.6" sectionFormat="of" target="RFC1813"/>. A definition of the bit fields in
the "mode" element, which relate to traditional file system access
permissions, can also be found there.</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr3 {
    ftype3     type;
    mode3      mode;
    uint32     nlink;
    uid3       uid;
    gid3       gid;
    size3      size;
    size3      used;
    specdata3  rdev;
    uint64     fsid;
    fileid3    fileid;
    nfstime3   atime;
    nfstime3   mtime;
    nfstime3   ctime;
};
]]></sourcecode>
        </section>
        <section anchor="postopattr">
          <name>post_op_attr</name>
          <t>The NFS version 3 "post_op_attr" data type returns file
attributes that are not directly involved in the requested
procedure. See <xref section="2.6" sectionFormat="of" target="RFC1813"/> for more
information.</t>
          <sourcecode type="xdr"><![CDATA[
union post_op_attr switch (bool attributes_follow) {
case TRUE:
    fattr3   attributes;
case FALSE:
    void;
};
]]></sourcecode>
          <t>The format of this data type appears to make returning file
attributes optional. However, server implementers are strongly
encouraged to make a best effort to return attributes whenever
possible, even when returning an error.</t>
        </section>
      </section>
      <section anchor="error-values">
        <name>Error Values</name>
        <t><xref section="2.5" sectionFormat="of" target="RFC1813"/> describes an enumerated type called
"nfsstat3" which provides a status code for NFS version 3 procedure
results.
A matching type called "aclstat3" is defined in this document
for the similar purpose of returning NFS_ACL version 3 procedure
status codes. The numeric values of these two types match up,
although aclstat3 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
        <sourcecode type="xdr"><![CDATA[
enum aclstat3 {
    ACL3_OK             = 0,
    ACL3ERR_PERM        = 1,
    ACL3ERR_IO          = 5,
    ACL3ERR_ACCES       = 13,
    ACL3ERR_INVAL       = 22,
    ACL3ERR_NOSPC       = 28,
    ACL3ERR_ROFS        = 30,
    ACL3ERR_DQUOT       = 69,
    ACL3ERR_STALE       = 70,
    ACL3ERR_BADHANDLE   = 10001,
    ACL3ERR_NOTSUPP     = 10004,
    ACL3ERR_SERVERFAULT = 10006,
    ACL3ERR_JUKEBOX     = 10008
};
]]></sourcecode>
        <t>These status codes carry the following meanings:</t>
        <dl>
          <dt>ACL3_OK</dt>
          <dd>
            <t>Indicates the call completed successfully.</t>
          </dd>
          <dt>ACL3ERR_PERM</dt>
          <dd>
            <t>Not owner. The operation was not allowed because the caller is either not a privileged user (root) or not the owner of the target of the operation.</t>
          </dd>
          <dt>ACL3ERR_IO</dt>
          <dd>
            <t>I/O error. A hard error (for example, a disk error) occurred while processing the requested operation.</t>
          </dd>
          <dt>ACL3ERR_ACCES</dt>
          <dd>
            <t>Permission denied. The caller does not have the correct permission to perform the requested operation. Contrast this with NFS3ERR_PERM, which restricts itself to owner or privileged user permission failures.</t>
          </dd>
          <dt>ACL3ERR_INVAL</dt>
          <dd>
            <t>An invalid or unsupported argument was specified for procedure.</t>
          </dd>
          <dt>ACL3ERR_NOSPC</dt>
          <dd>
            <t>No space left on device. The operation would have caused the server's file system to exceed its limit.</t>
          </dd>
          <dt>ACL3ERR_ROFS</dt>
          <dd>
            <t>Read-only file system. A modifying operation was attempted on a read-only file system.</t>
          </dd>
          <dt>ACL3ERR_DQUOT</dt>
          <dd>
            <t>Resource (quota) hard limit exceeded. The user's resource limit on the server has been exceeded.</t>
          </dd>
          <dt>ACL3ERR_STALE</dt>
          <dd>
            <t>Invalid file handle. The file handle given in the arguments was invalid. The file referred to by that file handle no longer exists or access to it has been revoked.</t>
          </dd>
          <dt>ACL3ERR_BADHANDLE</dt>
          <dd>
            <t>Illegal NFS file handle. The file handle failed internal consistency checks.</t>
          </dd>
          <dt>ACL3ERR_NOTSUPP</dt>
          <dd>
            <t>Operation is not supported.</t>
          </dd>
          <dt>ACL3ERR_SERVERFAULT</dt>
          <dd>
            <t>An error occurred on the server which does not map to any of the legal NFS version 3 protocol error values.  The client should translate this into an appropriate error. UNIX clients may choose to translate this to EIO.</t>
          </dd>
          <dt>ACL3ERR_JUKEBOX</dt>
          <dd>
            <t>The server initiated the request, but was not able to complete it in a timely fashion. The client should wait and then try the request with a new RPC transaction ID. For example, this error should be returned from a server that supports hierarchical storage and receives a request to process a file that has been migrated. In this case, the server should start the immigration process and respond to client with this error.</t>
          </dd>
        </dl>
      </section>
      <section anchor="server-procedures-1">
        <name>Server Procedures</name>
        <section anchor="procedure-0-null-no-operation-1">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments-6">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results-6">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description-6">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation-6">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implmentation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors-6">
            <name>ERRORS</name>
            <t>Since the NULL procedure takes no argument and returns no
result, it can not return an NFS or NFS_ACL error status code.
However, some server implementations may return RPC errors
based on security or authentication policy settings.</t>
          </section>
        </section>
        <section anchor="procedure-1-getacl-retrieve-an-access-control-list-1">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-7">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3args {
    nfs_fh3 fh;
    u_int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-7">
            <name>RESULTS</name>
            <sourcecode type="xde"><![CDATA[
struct GETACL3resok {
    post_op_attr attr;
    secattr acl;
};

struct GETACL3resfail {
    post_op_attr attr;
};

union GETACL3res switch (nfsstat3 status) {
case ACL3_OK:
    GETACL3resok resok;
default:
    GETACL3resfail resfail;
};
]]></sourcecode>
          </section>
          <section anchor="description-7">
            <name>DESCRIPTION</name>
            <t>The GETACL procedure retrieves Access Control List
information associated with the file system object
specified by the GETACL3args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD,
or READDIRPLUS procedures, or the MOUNT service,
as described in <xref target="RFC1813"/>.</t>
            <t>The GETACL3args.mask field specifies which information
is to be returned in the response:</t>
            <ul spacing="normal">
              <li>
                <t>If the NA_ACL bit is set, the server fills in the
object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_ACLCNT bit is set, the server fills in
the number of ACEs that are in the object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACL bit is set, the server fills in
the object's default ACL.</t>
              </li>
              <li>
                <t>if the NA_DFACLCNT bit is set, the server fills in
the number of ACEs that are in the object's default ACL.</t>
              </li>
            </ul>
            <t>If the GETACL procedure is successful, the server sets the
GETACL3res.status field to ACL3_OK. It fills in the
GETACL3resok.attr field with the file object's post
operation file attributes, as detailed in <xref target="RFC1813"/>.
Lastly, it fills in the GETACL3res.acl field with two
counted arrays of Access Control Entries (ACEs).</t>
            <t>Otherwise, GETACL3res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-7">
            <name>IMPLEMENTATION</name>
            <t>When GETACL3args.fh represents a file object that does
not currently have an ACL associated with it or does not
implement support for ACLs, the server responds by
returning a manufactured minimal NFS ACL that reflects
the current owner, group, and mode bits of the object
(see <xref target="acls-in-operation"/>).</t>
          </section>
          <section anchor="errors-7">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="setacl-procedure">
          <name>SETACL Procedure</name>
          <section anchor="arguments-8">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL3args {
    nfs_fh3 fh;
    secattr acl;
};
]]></sourcecode>
          </section>
          <section anchor="results-8">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL3resok {
    post_op_attr attr;
};

struct SETACL3resfail {
    post_op_attr attr;
};

union SETACL3res switch (nfsstat3 status) {
case ACL3_OK:
    SETACL3resok resok;
default:
    SETACL3resfail resfail;
};
]]></sourcecode>
          </section>
          <section anchor="description-8">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL3args.fh field with the ACLs specified by the
SETACL3args.acl field.  The client obtains the file
handle using one of the NFS version 3 LOOKUP, CREATE,
MKDIR, MKNOD, SYMLINK, or READDIRPLUS procedures, or
the MOUNT service, as described in <xref target="RFC1813"/>.</t>
            <aside>
              <t>How are ACLs removed?</t>
            </aside>
            <t>If the SETACL procedure is successful, the server sets
the SETACL3res.status field to ACL3_OK and fills in the
SETACL3resok.attr field with the file object's post
operation file attributes, as detailed in <xref target="RFC1813"/>.</t>
            <t>Otherwise, SETACL3res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-8">
            <name>IMPLEMENTATION</name>
            <t>On success, the server does not send the reply until
the ACL change is durable locally.</t>
            <t>Changing a file object's ACL changes the object's mtime.
The mtime change is reflected in the attributes returned
in the SETACL response.</t>
            <t>A high-quality server implementation ensures that a
GETACL procedure running concurrently with a SETACL
procedure does not return partially updated (torn)
ACL contents. However, a failed SETACL may partially
change a file's ACLs.</t>
            <t>When SETACL3args.fh represents a file object that does
not implement support for ACLs, the server responds
by setting SETACL3res.status to ACL3ERR_NOTSUPP.</t>
            <t>When SETACL3args.acl does not contain at least the
minimal set of ACEs (as described in
<xref target="acls-in-operation"/>), the server responds by setting
SETACL3res.status to ACL3ERR_INVAL.</t>
          </section>
          <section anchor="errors-8">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_PERM</t>
              </li>
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL3ERR_ROFS</t>
              </li>
              <li>
                <t>ACL3ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getxattrdir-get-named-attribute-directory">
          <name>Procedure 3: GETXATTRDIR - Get named attribute directory</name>
          <section anchor="arguments-9">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3args {
    nfs_fh3 fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-9">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3resok {
    nfs_fh3 fh;
    post_op_attr attr;
};

union GETXATTRDIR3res switch (nfsstat3 status) {
case ACL3_OK:
    GETXATTRDIR3resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-9">
            <name>DESCRIPTION</name>
            <t><xref section="5.3" sectionFormat="of" target="RFC8881"/> defines a set of generic file attributes known
as "named attributes". The GETXATTRDIR procedure extends this facility
into the NFSv3 protocol.</t>
            <t>The GETXATTRDIR procedure obtains the file handle of the named attribute
directory associated with the file handle in the GETXATTRDIR3args.fh
field. This directory contains only objects of type NF3REG.</t>
            <t>If the GETXATTRDIR procedure is successful, the server sets the
GETXATTRDIR3res.status field to ACL3_OK.
It fills in the GETXATTRDIR3resok.fh field with a file handle that
the client may use to look up the target file's named attributes.
It fills in the GETXATTRDIR3resok.attr field with the name attribute
directory's current file attributes, as detailed in <xref target="RFC1813"/>.</t>
            <t>Using the file handle returned in GETXATTRDIR3resok.fh, a client
can utilize the READDIR and LOOKUP procedures to obtain file handles
for the named attributes associated with the target file system object.</t>
            <t>If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR3args.create boolean
field is set to false, the server returns ACL3ERR_NOENT.
If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR3args.create boolean
field is set to true, the server attempts to create the named attribute
directory before returning a result.
If the target file currently has a named attribute directory
associated with it and the GETXATTRDIR3args.create boolean is set
to true, the server returns the file handle of that named attribute
directory.</t>
            <t>If the RPC user does not have read access to the target file, or
if the GETXATTRDIR operation is to create a named attribute directory
and the RPC user does not have permission to do so, the server returns
ACL3_ACCES in the GETXATTRDIR3.status field.</t>
            <t>If the target file handle designates an object not of type NF3REG or
NF3DIR, the server returns the value ACL3ERR_INVAL in the
GETXATTRDIR3.status field. Neither named attributes nor named attribute
directories have their own named attributes.</t>
            <t>Note: This operation is equivalent to the NFSv4 OPENATTR operation as
specified in <xref section="16.17" sectionFormat="of" target="RFC7530"/> and <xref section="18.17" sectionFormat="of" target="RFC8881"/>.</t>
          </section>
          <section anchor="implementation-9">
            <name>IMPLEMENTATION</name>
            <t>Server implementers are free to choose not to implement this procedure.
In this case, the server returns the RPC-level error PROC_UNAVAIL.</t>
            <t>If the server implementation does implement the GETXATTRDIR procedure
but the shared file system containing the file object specified by the
file handle in the GETXATTRDIR3args.fh field does not support named
attributes, the server returns ACL3ERR_NOTSUPP in the GETXATTRDIR3.status
field.</t>
          </section>
          <section anchor="errors-9">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_PERM</t>
              </li>
              <li>
                <t>ACL3ERR_NOENT</t>
              </li>
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL3ERR_ROFS</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_NOTSUPP</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="implementation-issues">
      <name>Implementation Issues</name>
      <section anchor="permission-issues">
        <name>Permission issues</name>
        <t>The NFS protocol, strictly speaking, does not
define the permission checking used by NFS servers. However, it
is expected that an NFS server will do normal operating system
permission checking using AUTH_UNIX style authentication as
the basis of its protection mechanism, or another stronger
form of authentication such as RPCSEC_GSS. With
AUTH_UNIX authentication, the server gets the client's
effective uid, effective gid, and groups on each call and
uses them to check permission. These are the so-called UNIX
credentials.</t>
        <t>Using uid and gid implies that the client and server share
the same uid list. Every server and client pair must have the
same mapping from user to uid and from group to gid. Since
every client can also be a server, this tends to imply that
the whole network shares the same uid/gid space. If this is
not the case, then it usually falls upon the server to
perform some custom mapping of credentials from one
authentication domain into another. A discussion of
techniques for managing a shared user space or for providing
mechanisms for user ID mapping is beyond the scope of this
specification.</t>
        <t>In POSIX-based operating systems, a particular user (on UNIX, the
uid 0) has access to all files, no matter what permission and
ownership they have. This superuser permission may not be
allowed on the server, since anyone who can become superuser
on their client could gain access to all remote files. A
POSIX-based NFS server by default maps uid 0 to a distinguished
value (for instance, UID_NOBODY), as well as mapping the groups
list, before doing its access checking. A server implementation
may provide a mechanism to change this mapping.</t>
      </section>
      <section anchor="duplicate-request-cache">
        <name>Duplicate Request Cache</name>
        <t>The typical NFS protocol failure recovery model
uses client time-out and retry to handle server crashes,
network partitions, and lost server replies. A retried
request is referred to as a duplicate of the original.</t>
        <t>When used in a file server context, the term idempotent can
be used to distinguish between operation types. An idempotent
request is one that a server can perform more than once with
equivalent results (though it may in fact change, as a side
effect, the access time on a file, say for READ). Some NFS
operations are obviously non-idempotent. They cannot be
reprocessed without special attention simply because they may
fail if tried a second time. A CREATE request, for example,
can be used to create a file for which the owner does not
have write permission. A duplicate of this request cannot
succeed if the original succeeded. Likewise, a file can be
removed only once.</t>
        <t>The side effects caused by performing a duplicate
non-idempotent request can be destructive. A duplicate
file truncation can result in lost writes. It is the
inherent stateless design of the NFS protocol on top
of an unreliable RPC transport that yields the
possibility of destructive replays of non-idempotent
requests. Even in an implementation of the NFS protocol
over a reliable connection-oriented transport,
a connection break with automatic reestablishment
requires duplicate request processing: the client
retransmits requests that were pending before the
connection loss, and the server needs to recognize
and deal with potential duplicate non-idempotent requests.</t>
        <t>Most NFS server implementations maintain a cache of
recent requests, called the duplicate request cache,
for recognizing duplicate non-idempotent requests. If
the server receives a request and recognizes it as a
duplicate of a recently completed request, the server
returns the original completion status instead of
processing the duplicate request again.</t>
        <t>A description of an early implementation of a
duplicate request cache can be found in <xref target="Juszczak"/>.</t>
        <t>For all versions of the NFS_ACL protocol, the SETACL
procedure is considered to be non-idempotent.</t>
      </section>
      <section anchor="caching-policies">
        <name>Caching Policies</name>
        <t>The NFS protocol does not define a policy for
caching on the client or server. In particular, there is no
support for strict cache consistency between a client and
server, nor between different clients.</t>
        <t>The NFS_ACL protocol does not mandate a specific caching
policy for ACLs or information retrieved via the ACCESS
procedure. However, a high-quality client implementation
that seeks good performance might choose to revalidate
cached access control information with the same regularity
that it invalidates normal file attributes.</t>
      </section>
    </section>
    <section anchor="xdr-protocol-definition">
      <name>XDR Protocol Definition</name>
      <t>This section contains a description of the core features of the
NFS_ACL protocol, version 2 and 3, expressed in the XDR language
<xref target="RFC4506"/>.</t>
      <t>This description is provided in a way that makes it simple to
extract into ready-to-compile form.  The reader can apply the
following shell script to this document to produce a
machine-readable XDR description of the NFS_ACL protocol.</t>
      <sourcecode type="sh"><![CDATA[
#!/bin/sh
grep '^ *///' | sed 's?^ /// ??' | sed 's?^ *///$??'
]]></sourcecode>
      <t>That is, if the above script is stored in a file called
"extract.sh" and this document is in a file called "spec.txt",
then the reader can do the following to extract an XDR
description file:</t>
      <sourcecode type="sh"><![CDATA[
sh extract.sh < spec.txt > nfs_acl.x
]]></sourcecode>
      <section anchor="code-component-license">
        <name>Code Component License</name>
        <t>Code components extracted from this document must include
the following license text.  When the extracted XDR code
is combined with other complementary XDR code which itself
has an identical license, only a single copy of the license
text need be preserved.</t>
        <sourcecode type="xdr"><![CDATA[
/// /*
///  * Copyright (c) 2024 IETF Trust and the persons
///  * identified as authors of the code.  All rights reserved.
///  *
///  * The authors of the code are:
///  * Oracle
///  *
///  * Redistribution and use in source and binary forms, with
///  * or without modification, are permitted provided that the
///  * following conditions are met:
///  *
///  * - Redistributions of source code must retain the above
///  *   copyright notice, this list of conditions and the
///  *   following disclaimer.
///  *
///  * - Redistributions in binary form must reproduce the above
///  *   copyright notice, this list of conditions and the
///  *   following disclaimer in the documentation and/or other
///  *   materials provided with the distribution.
///  *
///  * - Neither the name of Internet Society, IETF or IETF
///  *   Trust, nor the names of specific contributors, may be
///  *   used to endorse or promote products derived from this
///  *   software without specific prior written permission.
///  *
///  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
///  *   AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
///  *   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
///  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
///  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
///  *   EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
///  *   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
///  *   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
///  *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
///  *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
///  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
///  *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
///  *   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
///  *   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
///  *   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
///  */
///
/// const NFS_ACL_MAX_ENTRIES = 1024;
///
/// typedef unsigned int uid;
/// typedef unsigned short o_mode;
///
/// /*
///  * This is the format of an ACL which is passed over the network.
///  */
/// struct aclent {
///     int type;
///     uid id;
///     o_mode perm;
/// };
///
/// /*
///  * The values for the type element of the aclent structure.
///  */
/// const NA_USER_OBJ = 0x1;            /* object owner */
/// const NA_USER = 0x2;                /* additional users */
/// const NA_GROUP_OBJ = 0x4;           /* owning group of the object */
/// const NA_GROUP = 0x8;               /* additional groups */
/// const NA_CLASS_OBJ = 0x10;          /* file group class and mask entry */
/// const NA_OTHER_OBJ = 0x20;          /* other entry for the object */
/// const NA_ACL_DEFAULT = 0x1000;      /* default flag */
///
/// /*
///  * The bit field values for the perm element of the aclent
///  * structure.  The three values can be combined to form any
///  * of the 8 combinations.
///  */
/// const NA_READ = 0x4;                /* read permission */
/// const NA_WRITE = 0x2;               /* write permission */
/// const NA_EXEC = 0x1;                /* exec permission */
///
/// /*
///  * This is the structure which contains the ACL entries for a
///  * particular entity.  It contains the ACL entries which apply
///  * to this object plus any default ACL entries which are
///  * inherited by its children.
///  *
///  * The values for the mask field are defined below.
///  */
/// struct secattr {
///     u_int mask;
///     int aclcnt;
///     aclent aclent<NFS_ACL_MAX_ENTRIES>;
///     int dfaclcnt;
///     aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
/// };
///
/// /*
///  * The values for the mask element of the secattr struct as well
///  * as for the mask element in the arguments in the GETACL2 and
///  * GETACL3 procedures.
///  */
/// const NA_ACL = 0x1;                 /* aclent contains a valid list */
/// const NA_ACLCNT = 0x2;              /* number of entries in the aclent list */
/// const NA_DFACL = 0x4;               /* dfaclent contains a valid list */
/// const NA_DFACLCNT = 0x8;            /* number of entries in the dfaclent list */
///
/// /*
///  * XDR data types inherited from the NFS version 2 protocol
///  */
///
/// enum ftype {
///     NFNON = 0,
///     NFREG = 1,
///     NFDIR = 2,
///     NFBLK = 3,
///     NFCHR = 4,
///     NFLNK = 5,
/// };
///
/// typedef opaque fhandle[FHSIZE];
///
/// struct timeval {
///     unsigned int seconds;
///     unsigned int useconds;
/// };
///
/// struct fattr {
///     ftype        type;
///     unsigned int mode;
///     unsigned int nlink;
///     unsigned int uid;
///     unsigned int gid;
///     unsigned int size;
///     unsigned int blocksize;
///     unsigned int rdev;
///     unsigned int blocks;
///     unsigned int fsid;
///     unsigned int fileid;
///     timeval      atime;
///     timeval      mtime;
///     timeval      ctime;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 2.
///  */
/// enum aclstat2 {
///     ACL2_OK = 0,
///     ACL2ERR_PERM = 1,
///     ACL2ERR_NOENT = 2,
///     ACL2ERR_IO = 5,
///     ACL2ERR_ACCES = 13,
///     ACL2ERR_NOSPC = 28,
///     ACL2ERR_ROFS = 30,
///     ACL2ERR_DQUOT = 69,
///     ACL2ERR_STALE = 70,
/// };
///
/// /*
///  * NFS_ACL version 2 procedure arguments and results
///  */
///
/// struct GETACL2args {
///     fhandle_t fh;
///     u_int mask;
/// };
///
/// struct GETACL2resok {
///     struct nfsfattr attr;
///     secattr acl;
/// };
///
/// union GETACL2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     GETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct SETACL2args {
///     fhandle_t fh;
///     secattr acl;
/// };
///
/// struct SETACL2resok {
///     struct nfsfattr attr;
/// };
///
/// union SETACL2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     SETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct GETATTR2args {
///     fhandle_t fh;
/// };
///
/// struct GETATTR2resok {
///     struct nfsfattr attr;
/// };
///
/// union GETATTR2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     GETATTR2resok resok;
/// default:
///     void;
/// };
///
/// struct ACCESS2args {
///     fhandle_t fh;
///     uint32 access;
/// };
///
/// const ACCESS2_READ = 0x1;           /* read data or readdir a directory */
/// const ACCESS2_LOOKUP = 0x2;         /* lookup a name in a directory */
/// const ACCESS2_MODIFY = 0x4;         /* rewrite existing file data or */
///                                     /* modify existing directory entries */
/// const ACCESS2_EXTEND = 0x8;         /* write new data or add directory entries */
/// const ACCESS2_DELETE = 0x10;        /* delete existing directory entry */
/// const ACCESS2_EXECUTE = 0x20;       /* execute file (no meaning for a directory) */
///
/// struct ACCESS2resok {
///     struct nfsfattr attr;
///     uint32 access;
/// };
///
/// union ACCESS2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     ACCESS2resok resok;
/// default:
///     void;
/// };
///
/// /*
///  * This is the definition for the GETXATTRDIR procedure which applies
///  * to NFS Version 2 files.
///  */
/// struct GETXATTRDIR2args {
///     fhandle_t fh;
///     bool create;
/// };
///
/// struct GETXATTRDIR2resok {
///     fhandle_t fh;
///     struct nfsfattr attr;
/// };
///
/// union GETXATTRDIR2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     GETXATTRDIR2resok resok;
/// default:
///     void;
/// };
///
/// /*
///  * XDR data types inherited from the NFS version 3 protocol
///  */
///
/// typedef unsigned hyper uint64;
/// typedef unsigned long uint32;
/// typedef uint64 fileid3;
/// typedef uint32 uid3;
/// typedef uint32 gid3;
/// typedef uint64 size3;
/// typedef uint32 mode3;
///
/// enum ftype3 {
///     NF3REG    = 1,
///     NF3DIR    = 2,
///     NF3BLK    = 3,
///     NF3CHR    = 4,
///     NF3LNK    = 5,
///     NF3SOCK   = 6,
///     NF3FIFO   = 7
/// };
///
/// struct specdata3 {
///     uint32     specdata1;
///     uint32     specdata2;
/// };
///
/// const NFS3_FHSIZE = 64;
///
/// struct nfs_fh3 {
///     opaque       data<NFS3_FHSIZE>;
/// };
///
/// struct nfstime3 {
///     uint32   seconds;
///     uint32   nseconds;
/// };
///
/// struct fattr3 {
///     ftype3     type;
///     mode3      mode;
///     uint32     nlink;
///     uid3       uid;
///     gid3       gid;
///     size3      size;
///     size3      used;
///     specdata3  rdev;
///     uint64     fsid;
///     fileid3    fileid;
///     nfstime3   atime;
///     nfstime3   mtime;
///     nfstime3   ctime;
/// };
///
/// union post_op_attr switch (bool attributes_follow) {
/// case TRUE:
///     fattr3   attributes;
/// case FALSE:
///     void;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 3.
///  */
/// enum aclstat3 {
///     ACL3_OK = 0,
///     ACL3ERR_PERM = 1,
///     ACL33ERR_NOENT = 2,
///     ACL3ERR_IO = 5,
///     ACL3ERR_ACCES = 13,
///     ACL3ERR_INVAL = 22,
///     ACL3ERR_NOSPC = 28,
///     ACL3ERR_ROFS = 30,
///     ACL3ERR_DQUOT = 69,
///     ACL3ERR_STALE = 70,
///     ACL3ERR_BADHANDLE = 10001,
///     ACL3ERR_NOTSUPP = 10004,
///     ACL3ERR_SERVERFAULT = 10006,
///     ACL3ERR_JUKEBOX = 10008,
/// };
///
/// /*
///  * NFS_ACL version 3 procedure arguments and results
///  */
///
/// struct GETACL3args {
///     nfs_fh3 fh;
///     u_int mask;
/// };
///
/// struct GETACL3resok {
///     post_op_attr attr;
///     secattr acl;
/// };
///
/// struct GETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union GETACL3res switch (nfsstat3 status) {
/// case ACL3_OK:
///     GETACL3resok resok;
/// default:
///     GETACL3resfail resfail;
/// };
///
/// struct SETACL3args {
///     nfs_fh3 fh;
///     secattr acl;
/// };
///
/// struct SETACL3resok {
///     post_op_attr attr;
/// };
///
/// struct SETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union SETACL3res switch (nfsstat3 status) {
/// case ACL3_OK:
///     SETACL3resok resok;
/// default:
///     SETACL3resfail resfail;
/// };
///
/// /*
///  * This is the definition for the GETXATTRDIR procedure which
///  * applies to NFS Version 3 files.
///  */
/// struct GETXATTRDIR3args {
///     nfs_fh3 fh;
///     bool create;
/// };
///
/// struct GETXATTRDIR3resok {
///     nfs_fh3 fh;
///     post_op_attr attr;
/// };
///
/// union GETXATTRDIR3res switch (nfsstat3 status) {
/// case ACL3_OK:
///     GETXATTRDIR3resok resok;
/// default:
///     void;
/// };
///
/// /*
///  * Share the port with the NFS service.
///  */
/// const NFS_ACL_PORT = 2049;
///
/// program NFS_ACL_PROGRAM {
///     version NFS_ACL_V2 {
///         void
///             ACLPROC2_NULL(void) = 0;
///         GETACL2res
///             ACLPROC2_GETACL(GETACL2args) = 1;
///         SETACL2res
///             ACLPROC2_SETACL(SETACL2args) = 2;
///         GETATTR2res
///             ACLPROC2_GETATTR(GETATTR2args) = 3;
///         ACCESS2res
///             ACLPROC2_ACCESS(ACCESS2args) = 4;
///         GETXATTRDIR2res
///             ACLPROC2_GETXATTRDIR(GETXATTRDIR2args) = 5;
///     } = 2;
///     version NFS_ACL_V3 {
///         void
///             ACLPROC3_NULL(void) = 0;
///         GETACL3res
///             ACLPROC3_GETACL(GETACL3args) = 1;
///         SETACL3res
///             ACLPROC3_SETACL(SETACL3args) = 2;
///         GETXATTRDIR3res
///             ACLPROC3_GETXATTRDIR(GETXATTRDIR3args) = 3;
///     } = 3;
/// } = 100227;
]]></sourcecode>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <aside>
        <t>This section is to be removed before publishing this document as an RFC.</t>
      </aside>
      <t>This section records the status of known implementations of the
protocol defined by this specification at the time of posting of this
Internet-Draft, and is based on a proposal described in
<xref target="RFC7942"/>. The description of implementations in this section is
intended to assist the IETF in its decision processes in progressing
drafts to RFCs.</t>
      <t>Please note that the listing of any individual implementation here
does not imply endorsement by the IETF. Furthermore, no effort has
been spent to verify the information presented here that was supplied
by IETF contributors. This is not intended as, and must not be
construed to be, a catalog of available implementations or their
features. Readers are advised to note that other implementations may
exist.</t>
      <section anchor="solaris-nfs-server-and-client">
        <name>Solaris NFS server and client</name>
        <t>Organization: Oracle</t>
        <t>URL:       <eref target="https://www.oracle.com">https://www.oracle.com</eref></t>
        <t>Maturity:  Complete.</t>
        <t>Coverage:  All procedures are implemented.</t>
        <t>Licensing: CDDL</t>
        <t>Implementation experience:</t>
      </section>
      <section anchor="linux-nfs-server-and-client">
        <name>Linux NFS server and client</name>
        <t>Organization:  The Linux Foundation</t>
        <t>URL:       <eref target="https://www.kernel.org">https://www.kernel.org</eref></t>
        <t>Maturity:  Complete.</t>
        <t>Coverage:  All procedures except GETXATTRDIR are implemented in
           both versions of the protocol.</t>
        <t>Licensing: GPLv2</t>
        <t>Implementation experience:  The initial Linux implementation
of the NFS_ACL protocol is described in <xref target="Gruenbacher"/>, and
subsequent modifications can be found in the Linux kernel
source code repository <xref target="Linux"/>.</t>
        <t><xref target="Gruenbacher"/> notes several minor differences between the
Linux and Solaris implementations of ACLs, and remarks that:
&gt; Solaris ACLs are based on an earlier draft of POSIX 1003.1e,
&gt; so its handling of the mask ACL entry is slightly different
&gt; than in draft 17 for ACLs with only four ACL entries. This
&gt; is a corner case that occurs only rarely, so the semantic
&gt; differences may not be noticeable.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>An attacker can alter the content of an ACL as it transits
an open network, giving the attacker access to file content
that the ACL is supposed to protect.</t>
      <t>Therefore, implementations of NFS_ACL should protect the
integrity of ACL content when it transits a network. The
use of an integrity-preserving transport layer security
service, such as the GSS Kerberos integrity service, is
strongly recommended.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>In accordance with <xref section="13" sectionFormat="of" target="RFC5531"/>, the editor
requests that IANA update the entry for the NFS ACL
service in the RPC Program Numbers registry to add
the current document as a Reference.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4506">
          <front>
            <title>XDR: External Data Representation Standard</title>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <date month="May" year="2006"/>
            <abstract>
              <t>This document describes the External Data Representation Standard (XDR) protocol as it is currently deployed and accepted. This document obsoletes RFC 1832. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="67"/>
          <seriesInfo name="RFC" value="4506"/>
          <seriesInfo name="DOI" value="10.17487/RFC4506"/>
        </reference>
        <reference anchor="RFC5531">
          <front>
            <title>RPC: Remote Procedure Call Protocol Specification Version 2</title>
            <author fullname="R. Thurlow" initials="R." surname="Thurlow"/>
            <date month="May" year="2009"/>
            <abstract>
              <t>This document describes the Open Network Computing (ONC) Remote Procedure Call (RPC) version 2 protocol as it is currently deployed and accepted. This document obsoletes RFC 1831. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5531"/>
          <seriesInfo name="DOI" value="10.17487/RFC5531"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC1094">
          <front>
            <title>NFS: Network File System Protocol specification</title>
            <author fullname="B. Nowicki" initials="B." surname="Nowicki"/>
            <date month="March" year="1989"/>
            <abstract>
              <t>This RFC describes a protocol that Sun Microsystems, Inc., and others are using. A new version of the protocol is under development, but others may benefit from the descriptions of the current protocol, and discussion of some of the design issues.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1094"/>
          <seriesInfo name="DOI" value="10.17487/RFC1094"/>
        </reference>
        <reference anchor="RFC1813">
          <front>
            <title>NFS Version 3 Protocol Specification</title>
            <author fullname="B. Callaghan" initials="B." surname="Callaghan"/>
            <author fullname="B. Pawlowski" initials="B." surname="Pawlowski"/>
            <author fullname="P. Staubach" initials="P." surname="Staubach"/>
            <date month="June" year="1995"/>
            <abstract>
              <t>This paper describes the NFS version 3 protocol. This paper is provided so that people can write compatible implementations. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1813"/>
          <seriesInfo name="DOI" value="10.17487/RFC1813"/>
        </reference>
        <reference anchor="RFC7530">
          <front>
            <title>Network File System (NFS) Version 4 Protocol</title>
            <author fullname="T. Haynes" initials="T." role="editor" surname="Haynes"/>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>The Network File System (NFS) version 4 protocol is a distributed file system protocol that builds on the heritage of NFS protocol version 2 (RFC 1094) and version 3 (RFC 1813). Unlike earlier versions, the NFS version 4 protocol supports traditional file access while integrating support for file locking and the MOUNT protocol. In addition, support for strong security (and its negotiation), COMPOUND operations, client caching, and internationalization has been added. Of course, attention has been applied to making NFS version 4 operate well in an Internet environment.</t>
              <t>This document, together with the companion External Data Representation (XDR) description document, RFC 7531, obsoletes RFC 3530 as the definition of the NFS version 4 protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7530"/>
          <seriesInfo name="DOI" value="10.17487/RFC7530"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="Gruenbacher">
          <front>
            <title>POSIX Access Control Lists on Linux</title>
            <author initials="A." surname="Grünbacher" fullname="Andreas Grünbacher">
              <organization>SuSE Labs</organization>
            </author>
            <date year="2003" month="January"/>
          </front>
          <seriesInfo name="Proceedings" value="of the FREENIX Track: 2003 USENIX Annual Technical Conference, pp. 259-272"/>
          <seriesInfo name="ISBN" value="1-931971-11-0"/>
        </reference>
        <reference anchor="Juszczak">
          <front>
            <title>Improving the Performance and Correctness of an NFS Server</title>
            <author initials="C." surname="Juszcak" fullname="Chet Juszcak">
              <organization>Digital Equipment Corporation</organization>
            </author>
            <date year="1989" month="January"/>
          </front>
          <seriesInfo name="USENIX" value="Conference Proceedings, USENIX Association, Berkeley, CA, pp. 53-63"/>
        </reference>
        <reference anchor="IEEE">
          <front>
            <title>IEEE 1003.1e and 1003.2c: Draft Standard for Information Technology-- Portable Operating System Interface (POSIX)-- Part 1: System Application Program Interface (API) and Part 2: Shell and Utilities, draft 17</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="1997" month="January"/>
          </front>
        </reference>
        <reference anchor="POSIX">
          <front>
            <title>IEEE Std 1003.1-2001 (Open Group Technical Standard, Issue 6), Standard for Information Technology-- Portable Operating System Interface (POSIX)</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="ISBN" value="0-7381-3010-9"/>
        </reference>
        <reference anchor="Linux" target="https://www.kernel.org">
          <front>
            <title>Linux kernel source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OpenSolaris" target="https://github.com/kofemann/opensolaris">
          <front>
            <title>Archived OpenSolaris source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC1833">
          <front>
            <title>Binding Protocols for ONC RPC Version 2</title>
            <author fullname="R. Srinivasan" initials="R." surname="Srinivasan"/>
            <date month="August" year="1995"/>
            <abstract>
              <t>This document describes the binding protocols used in conjunction with the ONC Remote Procedure Call (ONC RPC Version 2) protocols. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1833"/>
          <seriesInfo name="DOI" value="10.17487/RFC1833"/>
        </reference>
      </references>
    </references>
    <?line 2442?>

<section anchor="source-material">
      <name>Source Material</name>
      <t>The on-the-wire protocol described here is intended to
match existing de factor implementations of NFS_ACL.</t>
      <t>The source for the XDR specification provided in this
document is the nfs_acl.x file as found in published
versions of the OpenSolaris source code base <xref target="OpenSolaris"/>,
an open source descendant of Solaris.</t>
      <t>However, there are a few changes to the protocol as it
was originally described in the OpenSolaris source code
base.</t>
      <section anchor="redaction-of-nfsacl-version-4">
        <name>Redaction of NFS_ACL Version 4</name>
        <t>Version 4 of NFS_ACL is described in the original nfs_acl.x source
file is described this way:</t>
        <ul empty="true">
          <li>
            <t>This is a transitional interface to enable Solaris NFSv4
clients to manipulate ACLs on Solaris servers until the
spec is complete enough to implement this inside the
NFSv4 protocol itself.  NFSv4 does handle extended
attributes in-band.</t>
          </li>
        </ul>
        <t>Because the two non-NULL procedures in this version of the NFS_ACL
protocol were used only as part of a Solaris a prototype and there
are no other implementations of NFS_ACL version 4, it is not included
in the protocol description appearing in this document.</t>
      </section>
      <section anchor="extension-of-nfsacl">
        <name>Extension of NFS_ACL</name>
        <aside>
          <t>Perhaps this document should provide rules for extending the
NFS_ACL protocol, in case some other implementation wishes to
provide additional operations.</t>
        </aside>
      </section>
      <section anchor="code-compilation-requirements">
        <name>Code Compilation Requirements</name>
        <t>The original nfs_acl.x file that appears in the OpenSolaris code
base did not compile using the widely-available rpcgen tool).</t>
        <ul spacing="normal">
          <li>
            <t>The file does not include a definition of the ACL2_OK or
ACL3_OK constants used in definitions of result unions.</t>
          </li>
          <li>
            <t>The file does not include definitions of NFS protocol elements
that are shared with the NFS_ACL protocol, such as fhandle_t and
post_op_attr.</t>
          </li>
        </ul>
        <t>The XDR specification provided in this document rectifies those
omissions to provide a complete and compilable XDR language
description of the NFS_ACL protocol.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor is grateful to
Bill Baker,
Wim Coekaerts,
Andreas Gruenbacher,
Rick Macklem,
Greg Marsden,
Martin Thomson,
Rob Thurlow,
and
Jim Wright
for their input and support.</t>
      <t>Special thanks to
Area Director
Gorry Fairhurst,
NFSV4 Working Group Chairs
Brian Pawlowski
and
Christopher Inacio,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their patience, guidance, and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
lPqR3Nnelo96+2g0vOeLq+1fwECYAnxPJ2jc7Pnp9vi+t6nYQG+nnrZuSw4E
9WgbWeeov6wLIrvBzWv+rny9aVdc1YGeLTvQQ+4A/7xaAz2kCPTI1hvoYcEB
emRrDvSw6AA9snUHelh4gB69tI/Go8O/0qOv7aM3wzcjevRNkK2MNAS9PL1m
pTF9oznzDHLSfeXV3qtNb/bD2mDNSs0E/VtKIJuWcoOCNfbotrTdYsb3KlLC
t150Gj1hWD1Fw/QESGg8wVrR8tY8YbA9FZnETp74j52wrQC7jP8955tglmmG
d1RSlqZkHpQddcamwBLuZDp4QRlhB2ERneMO28IMrjHRKi9iuxEOfplY45DG
0EkutHx3mRi6F3oKmhje28gWLHenuF5jZ8wbwU7WjshOfAN/kPvlPjxFLMhm
5cfZXA6O/HClPLlQzk1ckD8HuGF2hQZvrichvMgGWV7aavFeBY+671icxh0u
Ht2J6Ae6jUXnOj2+8Hx2lL3u16Qmrq2i2Lqw5bbYyIpDO8sql6OWOs+Whapi
31ZZwjzoWGPJlo9cRCP6uqXGLNX0SHHXqsSF8ksNDq/UR+PcKfj51EkL/oc7
8idvYL8CX+4hR6em6JNAh/34gQARVqROSj+smy7K5JxNNC0u4kpyKvVGUFSR
8WYbOiu3ea2tvV0xdomElIutgbWAG9Oc1CWDYNm9vNvF/0uXaYmJligKybUs
7sIpSz9IzNF4WCURqnzDaeRzwJegyfyi+vyMPz+6JhPnRwf2jq/PKTTKy66G
SQfOLZ2ZSks94ySlcZZT4O9izaZlvlgsmhbxLdpvx3ITHFpYAueJFnKYcuUt
f9PYdUJenK6mXvnv8V5gqavL3iFXfiRuoZyi6tWyn2tZ2i4VGm9MbeRO1zOj
WUKUrHstd0QSWMekLvDaERlcTC8sMNP7kkug0KuHVJgxWlCGgvji7IEFZlx9
GePqy0Qh4Sw1l+xBFMCdV5p7nU2GZWX0adZaUkatyL2HlZTpPbSkTO++mjK9
hxSVqUEg6vt0093M6bzMfNkJCme2pmRHnDYF3nKSsBXGXVfsKzxNH1CHjhP5
ji8xhGfNxoCihXjKorzyNj2inK64DYmMTE690jZOgvEL24CIKpTXlrW5cs9s
URsSVPmZK1vjPUSVQh5amcqvZMPiLs3YlqsRKdv9yY8tsgWlaryny9anLWVq
VnlZfcxXH13t3ZBl7/gf7HjCgGqC9fDqoASLdVim2U2+uPGTYCW4ygVpdKMx
ZbZtQjjiIRRn4Tlzva1nf4s/XetsIQeQm+NHDv+y/pbzs4sBu1EEbyLv41f8
zZv+8XjQ5ms5p3AynI4rBmqBFK9WScwHdxlf+5bCOtjyFZ8BPxF/g30DcBxo
9+LOYPTPuoivuMoFDQAiMTJpvkyCS4Swg9CNhHVVcACjARgdrjNH9VY8U6aE
TbM2y1WMfiC5NCxiFKqhDythJH6v3iPLGHkl9sxDCxr1/oCCRv48fltBo3gR
ljTq/TEljXqupFEPXcP+P7+8Uc+WN7Iv98KXw5Hf8mX4ki2qtmWv1hRvybNv
9/fDt1wSyb79NnxLhZHs215txlwfSd96VZKcIGLfflNr+7p/9K5/ckRf/DPe
7vJ8rz4xrsUY2Q9e1PofnP0wONPC8PjB1+EHf7n46+D16Eevh29/W7km3EOD
N9VxSJqku6DshxL0gm5dc77FBcehus1tFnkKKyzRVX4Sg3eZUBkiOwLHDqrt
me78s1fQTtkk/6TI8+qpxseRuuPf2at3B6omFBRK6tnyUMNnI6E/IGd45aGe
BHfz+gWfnvqlo1CQ8ErKBCynddAtZaHO5797VSjO9uVkuFSiu7X4J26RE5M4
eA6v8MPAFHI3MjSLBuC9KUiCS+lDFY8f35LqXX65zsTsm3jlgRAJnFF5lhe+
tdwEJ3ZbPasaZpEtg8uH3V/ZistD1UtbWVqwubRVX2KdKT4xQOuHV7tyRIXG
kUI9T6ie1VNGRpqUV/7qXILQvixdZR/+5kH1rxyhonPN29OsBOrpYA8pi2Xb
PLYY1kNqYTUIKM4cDsmV1DvYOvuZOu9BqEHBX66UBYHmzsUZ1Sgw9D/y3VGe
zyIEo6PHjO61unLhhvA5s+d6Ga844FIvto3cigL2z44C7po5fZgxL7Y7ui+J
VZ0534tJ5Z5ALixyOL/4QqgcBuXZiwPDYlS1TuDJgNJYawxGSqfZEFK8C01j
vGwyCdouLJGXO8CVa1A4Mp4NVBPwYMTlnKhVc123sfNJZxSj7Y2iQSaYOoCe
Wpp/zALj8IiNpe56dVySpKurvdMLtUNjjV7fy4gre15G8xSwoQDRD+9wQytW
fMUpfUCQEyonbOPziCYzO1Dzir1CnS/iS69ITq1Xx/bDcnh2fN8qPk+X3IrU
Du2chqecZIIsA00iPXSh/6gk91+vktx/kUJyFSiRVEYu2GFXXs5sKy/HJndb
rbylypx5aJU57RTJB4ewmofXl4v+jvXlel7kqZrsH1tdLql16UecBvaMLaXl
Gj0gi93cR70aXc+PTVX1vCUutVerRNfbHJJam4r8/z9tbbre3ztVUr1em/1d
G6rimPYMSrVLn9eW9I96df/T1qvrbYga7m2pV9d7aPUipCruluoHRukKknop
jC1l63rtZeuMlK2LfkPZOh8if6+ydb1HFtmpR8M+pGyd2VaZJ4jfcvVyNpWt
i7aWreNI8U1l6zZdpWIeW7ZOLUG7oR3P++0Uz902W5z3VPUjDrXi02RlggfW
sdvG5z+3it19jN7j6+NH8/XxZ/L18X18ffxZfP3vXgOv9xk18Hq/ew28RsyL
1sCTiBcrC2wVAkxTCNhQRkGFgD+qNJ5xbbYxl02l8f4uzKVZJe/vRvX/USXv
v2KVvMcy8EfyYoyVC2vX+fgqhyq8QawxOaRZLp2mpeKeubfiHteZeEzFPZ21
2Tprcjxs5vEuCLzJ8r2gb8+HsesBxAaBO9eA++kV4fs9JYh6Ab8/IqF1m7jx
m9JZA5mj3vN9hgK/k0dbC2oz+K+Xxdrz3fCbe/o7ZrH2flsWa+93T2PdqpBu
yyDt/WdIY90ivfxuaawqwzwqjdVC5x9prA3s/y1prL3/n9NYH7SC/9HTWNsW
+Y801gemsfY2prH2ftc01p7NY+09KJHVi/hy1sUNU3tULqup57Ji5//IZf2f
NJe19zvlsgaRfpvP0paE1jZdxkto/d11m7ouo0EyD9dk3K3lvLNDvOecghD8
ILhUnp7PwyTXTsSRaViMapVQ1aCOs0azNE5g9IgZRfZIDULaYHcTuq+upxU6
o5KfV2yjYBNCcG06VVuieIECVdq8VubKtI9Jl3FfnL/7SKE2ZXWH8ljoP47Z
wHUZlykJwmjHxhXLeV4maCxIyyXfFpixgYjjsZPCUMgfOuXDTrlUVInHbjw4
/Ph2PO5GHzCL2E0mbBFg6ZWWo9TLFb1KaFTiz/3EYn+RrUZGST10QSTHEWRT
I1lzHGLHRev8cmHnNuWYxs93JZaa6oV5tc2seIo1AWk8+D/ShFQtPp4Y7hIU
mRQQgCkBBVsv0rLqRgN4ay1JlGDGbVcxUHZKxVJKz0lbWoCQooO09ptOhh5y
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
gJpuQUGBmgb0VVt3kipWE+OgO8ypAy2X01zYnXVPV+9HR8M3P9XlN5oZq11U
2UyLY9upSl8P+Qd9cfVP15WbkwpyrXMb/Hg+ODmqy4JWIcRKhjofANxDe5X7
f2uGAtLHqd7ihllugB+qnhequ9ruROtcS2ho9CTLtVyw3CRvO3/aQtel88dR
4u34yEfNdfz5Jy2Y3KMPWrvG7d1ZoGpVe2arU5oxAER6khsYfrDslMNxA0lk
8/XE2095kNe9kQQ27iW+h7s8ijg+5qrirQSy/criz9m7x2lTvc3a1D3XorV+
EtyGFnxRuwSt/s7efdby4qr1hbvprKWJXHD2rKEY9gLNMLhPzHvs3ynmPfbv
FfMe+3eLeY/9+8W8x/4dY95j756xdlT27xWr0RXCW3e32Ja3+xuYoX8rE8zs
RWN0d7uS9n7fDUvtq/BufWlMs6niNm9/ae/VXl9iz3b9ChN90bjGpAVYdc22
dp2JPq9faWIpSP1ak5YXfLWJfVG/3sSfVHDFiV1f85oTfdW86qTlzXLjm3Yd
9bPuCrEEj+8LsXNvuzPEfiv3hjyQ2P2xGnNvs8bcCzXmXpvG3NuoMfd6m1Xm
3gaVubdFZfayh/mmiPq7Dep0b7M63duiTvfa1Gn/nbskwl4R0ZwRJ4/aKyIa
/bddE1H/SK+KkGsiHqHY936bYt+rSSh+ZRh7eh+o1vfqkklLWRlLKu5Xfhsl
be/pdoNV4L6aNb4402uxCPTul2Q2VbxtX9f4wYB/sIXgoZDf1v4zgfywcoOb
gdxWdrAVyJvKD248KZ8v/GsPogPUhf/ew4T/h+zw40T/xja3dfmI0/HQsk5b
j0h7eafWLbyHCY7nmoJMcfCWx2kCB14uEsA8jAM5xTgWYA3PX3zneoedvSri
pfvobPT2rP/eg6ESUv3iB9+IrLMOHgjhxtCg/Y9YR/0JfvIU+ear4ENnUtzc
nr954plZsaO9sKPxAzrib56Mw472mzMSE9b2KcFHT3yTHfbVC/tySvrmrvib
J57NCzt60ZiUrzZunZh++KSuZWO/L12/n8K1Nza594hN7j1gk3tbJt4LN7m3
dZO3dxRscm/zJvuHcuu02uDZa9nwT+7nJ5ZS9ve/0Xpt9YoSYy6a4RcjDdIi
vJLjnFYoGWKrNWWjccqRH1POEd1nbw67tQQLzI8qphpSQSlM+YxLvTWSvSTB
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
hykBAA==

-->

</rfc>
