<?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.39 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-nfsv4-nfs-acl-04" category="info" submissionType="IETF" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="NFS ACL Protocol">The Network File System Access Control List Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-nfs-acl-04"/>
    <author fullname="Chuck Lever" role="editor">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>cel-ietf@chucklever.net</email>
      </address>
    </author>
    <date year="2026" month="August" day="21"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS</keyword>
    <keyword>ACL</keyword>
    <abstract>
      <?line 93?>

<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://ietf-wg-nfsv4.github.io/i-d-nfs-acl/draft-ietf-nfsv4-nfs-acl.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-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/ietf-wg-nfsv4/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 101?>

<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 <xref target="I-D.ietf-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 anchor="xdr-types-not-defined-in-rfc-4506">
          <name>XDR Types Not Defined in RFC 4506</name>
          <t>The original NFS_ACL RPC language specification uses the "unsigned short" and
"unsigned long" types. <xref target="RFC4506"/> describes neither, though most current
implementations of the rpcgen program accept both. This section describes the
"unsigned short" and "unsigned long" integer types as used in this document,
based on those implementations, so that the NFS_ACL RPC language specification
appearing here accurately reflects the wire behavior of existing
implementations. It does not add these types to the RPC Data Description
Language.</t>
          <t>The XDR wire representation of each of these types is a network-endian 32-bit
integer. This maintains XDR's consistent 4-octet alignment for all basic
integer types while allowing applications to use narrower types internally.
The subsections below describe how a value of each type occupies that 32-bit
field.</t>
          <section anchor="unsigned-short">
            <name>unsigned short</name>
            <t>The unsigned short type is zero-extended, with the high-order two octets each
containing zeroes on the wire. The value range of this type is zero to 65,535,
inclusive.</t>
            <t>Example: 0xFFFF (65535) appears as 0x0000FFFF on the wire.</t>
          </section>
          <section anchor="unsigned-long">
            <name>unsigned long</name>
            <t>The unsigned long type occupies all four octets of the 32-bit field and
requires no extension. Its wire representation is identical to that of the
"unsigned int" type described in <xref section="4.2" sectionFormat="of" target="RFC4506"/>. The value range
of this type is zero to 4,294,967,295, inclusive.</t>
            <t>The NFS version 3 protocol specification <xref target="RFC1813"/> uses this type name for
32-bit unsigned quantities, and this document retains it in the data types
that it inherits from that protocol.</t>
          </section>
        </section>
      </section>
      <section anchor="auth-and-authz">
        <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, the NFS_ACL
service verifies that the calling user has been granted
permission to perform the procedure. The GETACL procedure
carries no such check of its own. The server passes the
calling user's credential to the local file system, which
may or may not restrict who can read an object's ACL.</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-acls">
            <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 have zero or more NA_USER and/or NA_GROUP
ACEs.</t>
            <t>On the wire, a minimal NFS ACL is represented as either
three Access Control Entries or four. A sender that uses
four adds an NA_CLASS_OBJ entry to the NA_USER_OBJ,
NA_GROUP_OBJ, and NA_OTHER_OBJ entries, and derives that
entry's "perm" element from the permission bits of the
object's owning group. The Linux NFS server expands a
three-entry list this way in both the "aclent" and the
"dfaclent" array.</t>
            <t>The Solaris NFS_ACL server performs no such expansion, and
what it sends depends on the file system it exports. A
Solaris server exporting a ZFS file system sends the
manufactured ACL described in <xref target="no-acl-support"/>, which
always occupies four entries in the "aclent" array and none
in the "dfaclent" array. A Solaris server exporting a UFS
file system sends three entries for an object whose ACL has
no mask entry. A receiver accepts either representation in
either array.</t>
            <t>The Access Control Entries in each of the "aclent" and
"dfaclent" arrays appear in ascending order of their "type"
element value. Some receivers depend on this ordering. The
manufactured ACL described in <xref target="no-acl-support"/> is the one
exception among the implementations this document surveys.</t>
            <t><cref anchor="open-fabricated-acl" source="editor">
The Solaris entry order and class permission are described
in <xref target="no-acl-support"/> as behavior, not
identified as defects. If the working group reads either as
a bug to report rather than a variation to document, this
text and <xref target="no-acl-support"/> should say so. See
repository issue #2.
</cref></t>
            <t>When a client presents a SETACL operation that a server
finds is invalid or it cannot process, the server responds
with ACL2ERR_INVAL 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 contains an ACE whose "type" field
sets more than one of the base type values NA_USER_OBJ,
NA_USER, NA_GROUP_OBJ, NA_GROUP, NA_CLASS_OBJ, and
NA_OTHER_OBJ (the NA_ACL_DEFAULT flag may accompany
exactly one such value)</t>
              </li>
              <li>
                <t>The presented ACL contains an ACE whose type or perm
field has a bit set that is not defined by this protocol</t>
              </li>
            </ul>
            <t>The NA_ACL_DEFAULT bit is a flag that a sender combines with
one of the base type values (for example, NA_ACL_DEFAULT |
NA_USER_OBJ) to mark an Access Control Entry as a default
entry: one that a directory contributes to its newly created
children rather than one that controls access to the directory
itself. Every entry in the "dfaclent" array has the
NA_ACL_DEFAULT bit set in its "type" field, and no entry in the
"aclent" array has it set. Segregating default entries into the
separate "dfaclent" array makes the flag redundant on the wire;
a sender nonetheless sets it on every "dfaclent" entry so that a
receiver can reconstruct the single, flag-tagged Access Control
list that some file access APIs present to applications.</t>
            <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 (for
example, NA_CLASS_OBJ or NA_OTHER_OBJ), the "id" field is
undefined. A sender sets this field to zero, and a receiver
ignores its value.</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>
            <t>A client uses one of the NFS CREATE, MKDIR, or MKNOD procedures
to request instantiation of a new file object. When the parent
directory carries a default ACL (that is, a non-empty "dfaclent"
array), the server forms the new object's access ACL from that
default ACL, copying each default entry into the new object's
access ACL with the NA_ACL_DEFAULT flag cleared so that the
entry governs access to the new object.</t>
            <t>The default ACL also constrains the new object's mode bits. The
server derives the owner permission bits from the default
NA_USER_OBJ entry, the other permission bits from the default
NA_OTHER_OBJ entry, and the group permission bits from the
default NA_CLASS_OBJ (mask) entry when one is present or else
from the default NA_GROUP_OBJ entry. The server first reduces
each of these three permission sets to its intersection with the
corresponding permission the client requested in the creation
operation. The reduced permissions become both the new object's
mode bits and the permissions of the corresponding entries in
its access ACL. Through this intersection a default ACL takes
the place of a umask in limiting the permissions of a newly
created object; see <xref target="Gruenbacher"/> for the relationship between
default ACLs and the umask.</t>
            <t>When the newly created object is itself a directory, the server
also copies the parent's default ACL into the new directory's
own default ACL, so that the default ACL propagates to
subsequent descendants.</t>
            <t>When the parent directory has no default ACL, the server assigns
no ACL to the new object, and the object's mode bits are those
the client requested in the creation operation.</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 {
    unsigned 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 values 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 anchor="setacl-mask">
            <name>The "mask" Element in a SETACL Request</name>
            <t>In a GETACL request the "mask" element selects which fields
the server fills in, as described in <xref target="getacl2"/> and
<xref target="getacl3"/>. Implementations do not agree on what the
element means in a SETACL request.</t>
            <t>The Linux NFS server treats it as selective there as well.
It replaces the object's access ACL only when NA_ACL is set,
and the object's default ACL only when NA_DFACL is set,
leaving an unselected list as it found it.</t>
            <t>The Solaris NFS_ACL server does not consult the element on
SETACL, and the outcome depends on the file system it
exports. When that file system is UFS, the server stores
exactly the entries the request carries, so the entries of a
list the sender leaves empty are dropped from the object
rather than preserved. When it is ZFS, the server returns
ACL2ERR_NOTSUPP or ACL3ERR_NOTSUPP as described in
<xref target="no-acl-support"/>.</t>
            <t>A SETACL that sets one of the two bits and clears the other
therefore has no single meaning. Sent to a directory that
holds both an access ACL and a default ACL, it preserves the
unselected list on a Linux server and drops that list's
entries on a Solaris server exporting UFS.</t>
            <t>A client avoids the divergence by setting both bits and
sending both lists on every SETACL, reading back the list it
does not intend to change so that it can send that list
unaltered. The Linux NFS client does this: it sets NA_ACL on
every SETACL, adds NA_DFACL for a directory, and fetches the
sibling list before sending.</t>
            <t><cref anchor="open-setacl-mask" source="editor">
This section records the divergence rather than recommending
one behavior. A client that follows the last paragraph is
safe against either server, but a server implementer is left
without an answer. Does the working group want to choose
one? See repository issue #1.
</cref></t>
          </section>
        </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="no-acl-support">
            <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>This is not an unusual case. A Solaris server exporting a
ZFS file system behaves as this section describes for every
object it shares: GETACL returns a manufactured ACL, and
SETACL fails. The behavior described here is therefore the
ordinary one for a Solaris server on its default file
system, not a fallback reserved for file systems without
access control.</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 that reflects the current mode
bits of the object. Both surveyed servers manufacture four
Access Control Entries in the "aclent" array and leave the
"dfaclent" array empty; neither manufactures a default ACL.
The Solaris server departs from the rules given in
<xref target="acls-in-operation"/> on this path. It sets the
NA_CLASS_OBJ entry's "perm" element to the constant value 7
rather than deriving it from the owning group's permission
bits, and it emits the entries in the order NA_USER_OBJ,
NA_GROUP_OBJ, NA_OTHER_OBJ, NA_CLASS_OBJ, which is not
ascending order of "type" value.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 3 procedure by
returning ACL3ERR_NOTSUPP.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 2 procedure by
returning ACL2ERR_NOTSUPP.</t>
              </li>
            </ul>
            <t>The Linux NFS server deviates from the protocol specified in the
current document by returning the value 10004 (the NFS version 3
NFS3ERR_NOTSUPP value) rather than the value 45 that this document
assigns to ACL2ERR_NOTSUPP, in response to a SETACL version 2
procedure on a file system that does not support ACLs.</t>
          </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 2 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="fhandle">
          <name>fhandle</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[
const FHSIZE = 32;

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>
          <t>The "stat" type in <xref section="2.3.1" sectionFormat="of" target="RFC1094"/> does not define a
status code corresponding to the POSIX EINVAL error. However,
existing NFS_ACL version 2 server implementations return the value
22 (the numeric value of EINVAL) when a client presents an invalid
argument to a procedure. The aclstat2 type therefore defines
ACL2ERR_INVAL with that value, even though the NFS version 2 "stat"
type has no matching code.</t>
          <t>Similarly, the "stat" type does not define a status code that
reports that a requested operation is not supported. The Solaris
NFS_ACL version 2 server returns the value 45 (its NFSERR_OPNOTSUPP
status code) when a client directs an operation at a file object
whose file system does not support ACLs. The aclstat2 type therefore
defines ACL2ERR_NOTSUPP with that value. This value matches the one
that the sole existing NFS_ACL version 2 client (the Solaris
implementation) decodes to the POSIX EOPNOTSUPP error; the numeric
value 10004 that NFS version 3 assigns to NFS3ERR_NOTSUPP is not used
in NFS_ACL version 2 results.</t>
          <sourcecode type="xdr"><![CDATA[
enum aclstat2 {
    ACL2_OK = 0,
    ACL2ERR_PERM = 1,
    ACL2ERR_NOENT = 2,
    ACL2ERR_IO = 5,
    ACL2ERR_ACCES = 13,
    ACL2ERR_INVAL = 22,
    ACL2ERR_NOSPC = 28,
    ACL2ERR_ROFS = 30,
    ACL2ERR_NOTSUPP = 45,
    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_NOENT</dt>
            <dd>
              <t>No such file or directory. The file or directory name specified does not exist.</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_INVAL</dt>
            <dd>
              <t>An invalid or unsupported argument was specified for procedure.</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_NOTSUPP</dt>
            <dd>
              <t>Operation is not supported.</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="getacl2">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-1">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2args {
    fhandle fh;
    unsigned int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-1">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2resok {
    fattr attr;
    secattr acl;
};

union GETACL2res switch (aclstat2 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>
            <t>A default ACL applies only to a directory object. When
GETACL2args.fh represents an object that is not a directory,
that object has no default ACL. If the request's NA_DFACL or
NA_DFACLCNT bit is set, the server returns an empty dfaclent
array and a dfaclcnt of zero rather than reporting an error.</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 fh;
    secattr acl;
};
]]></sourcecode>
          </section>
          <section anchor="results-2">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL2resok {
    fattr attr;
};

union SETACL2res switch (aclstat2 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>
            <t>To remove extended access control from a file object, a client
uses SETACL to replace the object's ACL with a minimal NFS ACL
(see <xref target="acls-in-operation"/>).</t>
            <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, the server responds by
setting SETACL2res.status to ACL2ERR_NOTSUPP.</t>
            <t>When 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_INVAL.</t>
            <t>Servers differ in how they treat the "mask" element of
SETACL2args.acl. <xref target="setacl-mask"/> describes the divergence
and how a client avoids it.</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_INVAL</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_NOTSUPP</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 fh;
};
]]></sourcecode>
          </section>
          <section anchor="results-3">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2resok {
    fattr attr;
};

union GETATTR2res switch (aclstat2 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 fh;
    unsigned int 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 {
    fattr attr;
    unsigned int access;
};

union ACCESS2res switch (aclstat2 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 ACCESS2_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 fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-5">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR2resok {
    fhandle fh;
    fattr attr;
};

union GETXATTRDIR2res switch (aclstat2 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
ACL2ERR_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_INVAL 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_INVAL</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_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
};
]]></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_NOENT</dt>
          <dd>
            <t>No such file or directory. The file or directory name specified does not exist.</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 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-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="getacl3">
          <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;
    unsigned int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-7">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3resok {
    post_op_attr attr;
    secattr acl;
};

struct GETACL3resfail {
    post_op_attr attr;
};

union GETACL3res switch (aclstat3 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 GETACL3resok.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>
            <t>A default ACL applies only to a directory object. When
GETACL3args.fh represents an object that is not a directory,
that object has no default ACL. If the request's NA_DFACL or
NA_DFACLCNT bit is set, the server returns an empty dfaclent
array and a dfaclcnt of zero rather than reporting an error.</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="procedure-2-setacl-set-or-replace-an-access-control-list-1">
          <name>Procedure 2: SETACL - Set or replace an Access Control List</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 (aclstat3 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>
            <t>To remove extended access control from a file object, a client
uses SETACL to replace the object's ACL with a minimal NFS ACL
(see <xref target="acls-in-operation"/>).</t>
            <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>
            <t>Servers differ in how they treat the "mask" element of
SETACL3args.acl. <xref target="setacl-mask"/> describes the divergence
and how a client avoids it.</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_NOTSUPP</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 (aclstat3 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="dup-req-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 version 3, expressed in the XDR
language <xref target="RFC4506"/>.</t>
      <t>NFS_ACL version 2 and NFS_ACL version 3 are independent versions of
a single RPC program.  Their XDR definitions are given here as two
separate specifications, one in <xref target="nfs-acl-v2-xdr"/> and one in
<xref target="nfs-acl-v3-xdr"/>, and each version is intended to form its own XDR
file.  Presenting the two versions as separate files lets an
implementer extract and compile only the protocol version of
interest.  The code component license and the data types common to both
versions appear once, in <xref target="code-component-license"/>.  Prepending
those common definitions to the definitions of a single version
yields a complete, independently compilable XDR file for that
version: nfs_acl2.x for version 2, and nfs_acl3.x for version 3.</t>
      <t>This description is provided in a way that makes it simple to
extract into ready-to-compile form.  In the sections that follow,
each line of XDR text is preceded by the marker "///".  A line of
the form "/// @@FILE name" marks the start of the version-specific
definitions belonging to the file "name"; the XDR text preceding
the first such marker, in <xref target="code-component-license"/>, is common to
both files.  The reader can apply the following shell script to this
document to extract the two XDR files.</t>
      <sourcecode type="sh"><![CDATA[
#!/bin/sh
awk '
  /^ *\/\/\// {
    line = $0
    sub(/^ *\/\/\/ ?/, "", line)
    if (line ~ /^@@FILE /) { split(line, a, " "); f = a[2]; next }
    if (f == "") common = common line "\n"
    else         part[f] = part[f] line "\n"
    next
  }
  END { for (f in part) printf "%s%s", common, part[f] > f }
'
]]></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</t>
      <sourcecode type="sh"><![CDATA[
sh extract.sh < spec.txt
]]></sourcecode>
      <t>writes two files into the current directory: nfs_acl2.x, containing
the common definitions followed by the NFS_ACL version 2 definitions
of <xref target="nfs-acl-v2-xdr"/>, and nfs_acl3.x, containing the common
definitions followed by the NFS_ACL version 3 definitions of
<xref target="nfs-acl-v3-xdr"/>.  Each file is a complete and independently
compilable XDR description of one protocol version.</t>
      <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 {
///     unsigned 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 */
///
/// /*
///  * Share the port with the NFS service.
///  */
/// const NFS_ACL_PORT = 2049;
]]></sourcecode>
      </section>
      <section anchor="nfs-acl-v2-xdr">
        <name>NFS_ACL Version 2</name>
        <t>The following definitions, together with the common definitions in
<xref target="code-component-license"/>, form the file nfs_acl2.x.</t>
        <sourcecode type="xdr"><![CDATA[
/// @@FILE nfs_acl2.x
///
/// /*
///  * XDR data types inherited from the NFS version 2 protocol
///  */
///
/// enum ftype {
///     NFNON = 0,
///     NFREG = 1,
///     NFDIR = 2,
///     NFBLK = 3,
///     NFCHR = 4,
///     NFLNK = 5
/// };
///
/// const FHSIZE = 32;
/// 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_INVAL = 22,
///     ACL2ERR_NOSPC = 28,
///     ACL2ERR_ROFS = 30,
///     ACL2ERR_NOTSUPP = 45,
///     ACL2ERR_DQUOT = 69,
///     ACL2ERR_STALE = 70
/// };
///
/// /*
///  * NFS_ACL version 2 procedure arguments and results
///  */
///
/// struct GETACL2args {
///     fhandle fh;
///     unsigned int mask;
/// };
///
/// struct GETACL2resok {
///     fattr attr;
///     secattr acl;
/// };
///
/// union GETACL2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct SETACL2args {
///     fhandle fh;
///     secattr acl;
/// };
///
/// struct SETACL2resok {
///     fattr attr;
/// };
///
/// union SETACL2res switch (aclstat2 status) {
/// case ACL2_OK:
///     SETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct GETATTR2args {
///     fhandle fh;
/// };
///
/// struct GETATTR2resok {
///     fattr attr;
/// };
///
/// union GETATTR2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETATTR2resok resok;
/// default:
///     void;
/// };
///
/// struct ACCESS2args {
///     fhandle fh;
///     unsigned int 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 {
///     fattr attr;
///     unsigned int access;
/// };
///
/// union ACCESS2res switch (aclstat2 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 fh;
///     bool create;
/// };
///
/// struct GETXATTRDIR2resok {
///     fhandle fh;
///     fattr attr;
/// };
///
/// union GETXATTRDIR2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETXATTRDIR2resok resok;
/// default:
///     void;
/// };
///
/// 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;
/// } = 100227;
]]></sourcecode>
      </section>
      <section anchor="nfs-acl-v3-xdr">
        <name>NFS_ACL Version 3</name>
        <t>The following definitions, together with the common definitions in
<xref target="code-component-license"/>, form the file nfs_acl3.x.</t>
        <sourcecode type="xdr"><![CDATA[
/// @@FILE nfs_acl3.x
///
/// /*
///  * 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,
///     ACL3ERR_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;
///     unsigned int mask;
/// };
///
/// struct GETACL3resok {
///     post_op_attr attr;
///     secattr acl;
/// };
///
/// struct GETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union GETACL3res switch (aclstat3 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 (aclstat3 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 (aclstat3 status) {
/// case ACL3_OK:
///     GETXATTRDIR3resok resok;
/// default:
///     void;
/// };
///
/// program NFS_ACL_PROGRAM {
///     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:  The Linux NFS server implements all procedures except
           GETXATTRDIR in both versions of the protocol. The Linux
           NFS client implements the NFS_ACL protocol only for
           version 3; it does not implement NFS_ACL version 2.</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>
        <t>The Linux NFS_ACL implementation already builds the version 2 and
version 3 protocols from two separate source files, presently
maintained by hand.  Work is underway to generate those files from
the separate XDR descriptions in <xref target="nfs-acl-v2-xdr"/> and
<xref target="nfs-acl-v3-xdr"/> instead.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>NFS_ACL was designed for a single administrative domain on
a physically protected network. This section considers a
broader environment: deployment across the global Internet,
spanning administrative boundaries, with no firewall assumed
between a client and its server.</t>
      <t>NFS_ACL carries no security mechanism of its own. It
inherits what the RPC layer provides, and it names the users
and groups in an Access Control Entry using the identities
that layer supplies (see <xref target="auth-and-authz"/>). What follows
therefore turns on the choice of RPC authentication flavor
and transport.</t>
      <t>Attacks on the NFS version 2 and version 3 protocols
themselves are out of scope. An attacker who can read or
alter file content directly through NFS gains nothing by
attacking the ACL that governs it, and <xref target="RFC2623"/> covers
those protocols. Attacks on the local file system that
stores an ACL, and on the mechanism by which a site maps
users to uid and gid values, are out of scope as well.</t>
      <section anchor="attacks-on-an-unprotected-exchange">
        <name>Attacks on an Unprotected Exchange</name>
        <t>Running NFS_ACL over AUTH_SYS on an unprotected transport
defends against none of the following.</t>
        <dl>
          <dt>Eavesdropping:</dt>
          <dd>
            <t>A GETACL reply carries an object's full Access Control
List. An observer learns which users and groups hold access
to the object, and the uid and gid values that name them.
The list is worth reading even when the file content is not.</t>
          </dd>
          <dt>Modification and man-in-the-middle:</dt>
          <dd>
            <t>Altering a SETACL argument changes the access control the
server installs. Altering a GETACL reply gives the client a
false view of it. Altering an ACCESS reply misleads a client
that uses the result to decide whether to attempt an
operation.</t>
          </dd>
          <dt>Message insertion:</dt>
          <dd>
            <t>AUTH_SYS supplies no verifier by which a credential can be
validated (<xref section="14" sectionFormat="of" target="RFC5531"/>). An attacker who can
reach the server and holds a file handle for an object can
forge a SETACL request bearing the file owner's uid.</t>
          </dd>
          <dt>Replay:</dt>
          <dd>
            <t>SETACL is not idempotent. A replayed SETACL reinstates an
ACL that the file owner has since replaced. The duplicate
request cache (<xref target="dup-req-cache"/>) recognizes a
retransmission, but it is finite: a replay delayed beyond
its reach is processed as a new request.</t>
          </dd>
          <dt>Message deletion and denial of service:</dt>
          <dd>
            <t>Discarding NFS_ACL messages denies a client the ability to
read or change an ACL. An attacker positioned to do this can
discard the NFS traffic alongside it, so NFS_ACL neither
adds to nor reduces the exposure.</t>
          </dd>
        </dl>
        <t><xref section="14" sectionFormat="of" target="RFC5531"/> states that AUTH_SYS should not be
used for services that permit clients to modify data. SETACL
modifies the data that governs every other access to the
object. <xref target="rpc-authentication"/> reports that implementations
permit any authentication flavor on procedures other than
NULL. That records what implementations accept; it does not
recommend AUTH_SYS for SETACL.</t>
        <t><cref anchor="open-authsys-setacl" source="editor">
This paragraph stops short of a recommendation. The
alternative is to state that a server should refuse SETACL
under AUTH_SYS, which no surveyed implementation does. Does
the working group want a recommendation here? See repository
issue #3.
</cref></t>
      </section>
      <section anchor="protecting-an-exchange">
        <name>Protecting an Exchange</name>
        <t>Two mechanisms available to an NFS version 2 or version 3
deployment apply unchanged to NFS_ACL, which shares the
transport and port of the NFS service it accompanies.</t>
        <t>RPCSEC_GSS <xref target="RFC2203"/> <xref target="RFC7861"/> replaces AUTH_SYS with a
GSS-API mechanism. Its integrity service authenticates the
RPC peer and detects alteration of each call and reply,
addressing insertion, modification, and man-in-the-middle.
Per-request sequence numbers detect replay within a window
the server sizes. Integrity leaves ACL content readable on
the wire; the privacy service encrypts arguments and results
and closes that gap. <xref target="RFC2623"/> describes how the NFS
version 2 and version 3 protocols use RPCSEC_GSS and
Kerberos V5.</t>
        <t>RPC-over-TLS <xref target="RFC9289"/> protects the transport connection
rather than the individual RPC message. It supplies
confidentiality and integrity for everything on the
connection and can authenticate the peer host. It does not
authenticate the RPC user, so a server relying on it alone
still takes on trust the uid and gid each request carries.</t>
      </section>
      <section anchor="residual-risk">
        <name>Residual Risk</name>
        <t>Neither mechanism changes what an authenticated caller may
do. GETACL carries no permission check of its own (see
<xref target="auth-and-authz"/>), so a caller holding a file handle can
often read the object's ACL and the user and group IDs it
names. A deployment that treats ACL membership as sensitive
cannot rely on the protocol to withhold it.</t>
        <t>A server that maps a privileged caller to a less privileged
identity (see <xref target="permission-issues"/>) decides on the strength
of the uid the request carries. Under AUTH_SYS the client
supplies that value, so the mapping deters accident rather
than attack.</t>
        <t>An ACL a client has read, and the result of an ACCESS
procedure, describe the server's decision at the moment it
was made. The server alone authorizes access (see
<xref target="interpreting-acls"/>) and can revoke it at any time. A
client that caches either and relies on it later may be
relying on information that no longer holds.</t>
      </section>
    </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="RFC2203">
          <front>
            <title>RPCSEC_GSS Protocol Specification</title>
            <author fullname="M. Eisler" initials="M." surname="Eisler"/>
            <author fullname="A. Chiu" initials="A." surname="Chiu"/>
            <author fullname="L. Ling" initials="L." surname="Ling"/>
            <date month="September" year="1997"/>
            <abstract>
              <t>This memo describes an ONC/RPC security flavor that allows RPC protocols to access the Generic Security Services Application Programming Interface (referred to henceforth as GSS-API). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2203"/>
          <seriesInfo name="DOI" value="10.17487/RFC2203"/>
        </reference>
        <reference anchor="RFC2623">
          <front>
            <title>NFS Version 2 and Version 3 Security Issues and the NFS Protocol's Use of RPCSEC_GSS and Kerberos V5</title>
            <author fullname="M. Eisler" initials="M." surname="Eisler"/>
            <date month="June" year="1999"/>
            <abstract>
              <t>This memorandum clarifies various security issues involving the NFS protocol (Version 2 and Version 3 only) and then describes how the Version 2 and Version 3 of the NFS protocol use the RPCSEC_GSS security flavor protocol and Kerberos V5. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2623"/>
          <seriesInfo name="DOI" value="10.17487/RFC2623"/>
        </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="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </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="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </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="I-D.ietf-nfsv4-posix-acls">
          <front>
            <title>POSIX Draft ACL support for Network File System Version 4, Minor Version 2</title>
            <author fullname="Rick Macklem" initials="R." surname="Macklem">
              <organization>FreeBSD Project</organization>
            </author>
            <date day="8" month="January" year="2026"/>
            <abstract>
              <t>   This document proposes four new optional file attributes for NFSv4.2
   to support POSIX ACLs conforming to the withdrawn POSIX 1003.1e draft
   17.  Although never ratified, POSIX ACLs are implemented in widely
   deployed operating systems.  Existing attempts to map between NFSv4
   and POSIX ACL models have been unsuccessful due to semantic
   incompatibilities.  These new attributes allow servers to expose
   POSIX ACLs directly, avoiding lossy mapping.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-posix-acls-01"/>
        </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 2854?>

<section anchor="source-material">
      <name>Source Material</name>
      <t>The on-the-wire protocol described here is intended to
match existing de facto 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 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>
        <t>Extension of this legacy protocol is out of scope for an
Informational document whose purpose is to describe existing
implementations.</t>
      </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 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,
Frank Batschulat,
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 Chair
Brian Pawlowski,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their patience, guidance, and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
lkWBIhJrMKqe+f8BuFBroYpxAQA=

-->

</rfc>
