<?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-01" category="info" submissionType="IETF" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.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-01"/>
    <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="May" day="19"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS</keyword>
    <keyword>ACL</keyword>
    <abstract>
      <?line 89?>

<t>This Informational document describes the NFS_ACL protocol.
NFS_ACL is a legacy member of the Network File System family
of protocols that NFS clients use to view and update Access
Control Lists stored on an NFS version 2 or version 3 server.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chucklever.github.io/i-d-nfs-acl/draft-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/chucklever/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<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="extensions-to-rfc-4506">
          <name>Extensions to RFC 4506</name>
          <t>The original NFS_ACL version 2 RPC language specification includes the use of
the "unsigned short" type. This type is not described in <xref target="RFC4506"/>. However,
most current implementations of the rpcgen program implement support for
this type. This section provides a proper specification for "short" and
"unsigned short" integer types for the RPC language, based on those
implementations. This is so that the NFS_ACL version 2 RPC language
specification appearing in this document accurately reflects the wire behavior
of existing implementations.</t>
          <t>The XDR wire representation of both types is a network-endian 32-bit integer,
sign-extended. This maintains XDR's consistent 4-octet alignment for all basic
integer types while allowing applications to use narrower types internally.</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="signed-short">
            <name>signed short</name>
            <t>The short type is sign-extended, with the high-order two octets replicating
the sign bit. The value range of this type is -32768 to 32767, inclusive.</t>
            <t>When a signed short contains a positive or zero value, its high-order octets
each contain 0x00. For example: 0x7FFF (32767) appears as 0x00007FFF on the
wire.</t>
            <t>When a signed short contains a negative value, its high-order octets each
contain 0xFF. For example: 0xFFFF (-1) appears as 0xFFFFFFFF on the wire,
and 0x8000 (-32768) appears as 0xFFFF8000 on the wire.</t>
          </section>
        </section>
      </section>
      <section anchor="authentication-and-authorization">
        <name>Authentication and Authorization</name>
        <t>The RPC protocol includes fields in every procedure call for
user authentication parameters. The specific content of the
authentication parameters is determined by the type of
authentication used by the server and client. A discussion
of the mechanics of RPC user authentication appears in
<xref target="RFC5531"/>, in particular Sections 9 and 10.</t>
        <t>For NFS ACLs, the user ID carried in RPC calls is used
for two purposes:</t>
        <ul spacing="normal">
          <li>
            <t>When setting an ACL via the SETACL procedure or retrieving
an ACL via the GETACL procedure, the NFS_ACL service verifies
that the calling user has been granted permission to perform
the procedure.</t>
          </li>
          <li>
            <t>Each Access Control Entry (see below) contains an element
that identifies the user to which the ACE applies. That
user is represented by a 32-bit user ID. The value of the
user ID in each ACE has the same meaning and mapping as
the value of incoming RPC calls.</t>
          </li>
        </ul>
        <t>Using user ids and group ids implies that the client and
server either share the same ID list or do local user and
group ID mapping. Servers and clients must agree on the
mapping from user to uid and from group to gid, for those
sites that do not implement a consistent user ID and group
ID number space. In practice, such mapping is typically
performed on the server, following a static mapping scheme
or a mapping established by the user from a client at
mount time.</t>
        <t>RPCSEC_GSS authentication provides stronger
security through the use of cryptographic authentication.
The server and client must agree on the mapping of the
user's GSS principal to a local UID on the server, but
the name to identity mapping is more operating system
independent than the uid and gid mapping in AUTH_UNIX.</t>
      </section>
      <section anchor="file-access-control">
        <name>File Access Control</name>
        <t>This section describes the abstractions that an NFS server
uses to determine whether an access or modification
to a file is permitted. The exact behavior of a server
implementation may vary.</t>
        <section anchor="file-ownership">
          <name>File Ownership</name>
          <t>A file’s "owner" is the designated user that is always granted
permission to update that file’s security attributes. As part of
creating a file, the NFS server assigns the file’s owner. Under
normal circumstances the initial file owner is the RPC user who
issued the NFS CREATE procedure. However, server security policies
can mandate replacement of that user (also known as user squashing)
as part of processing a CREATE procedure.</t>
          <t>An existing file’s designated owner can subsequently be changed by
an NFS SETATTR procedure. After that change, the new owner is
granted permission to update the file’s security attributes and
the old owner is no longer treated specially.</t>
          <t>A file’s "owner group" is a short list of users that have
similar privileges as the file’s owner, but are treated as a
separate category for the purpose of permission checking.</t>
          <t>Any user who is not a file's owner or a member of its owner
group falls into the third category, known as "everyone" or
"other".</t>
          <section anchor="superuser-access">
            <name>Superuser Access</name>
            <t>On most operating systems, there is a category of users known as
privileged users or superusers. These users can bypass most or
all access controls on files.</t>
          </section>
        </section>
        <section anchor="categories-of-access">
          <name>Categories of Access</name>
          <t>In NFS versions 2 and 3, there are three rudimentary categories
of access:</t>
          <dl>
            <dt>Read access:</dt>
            <dd>
              <t>Read access grants permission for a user to read a file or
directory.</t>
            </dd>
            <dt>Write access:</dt>
            <dd>
              <t>Write access grants permission for a user to modify a file
or directory.</t>
            </dd>
            <dt>Execute access:</dt>
            <dd>
              <t>For a file, execute access grants permission for the user to
treat the file content as executable. For a directory object,
execute access grants permission for the user to perform a
lookup in that directory.</t>
            </dd>
          </dl>
        </section>
        <section anchor="traditional-permission-bits">
          <name>Traditional Permission Bits</name>
          <t>Permission bits, or mode bits, are the simplest and perhaps
oldest form of access control. Each file object has a set
of mode bits <xref target="POSIX"/>.</t>
          <t>Each of the user categories is given a set of three access
type bits. Altogether there are then nine bit flags for
every file object.</t>
        </section>
        <section anchor="access-control-lists">
          <name>Access Control Lists</name>
          <t>An Access Control Entry, or ACE, represents a set of access categories
and a specific user or group. An Access Control List is a list of ACEs.</t>
          <t>Mode bits, as explained in the previous section, are essentially an
ACL that always contains exactly three ACEs: one for the file's owner,
one for the file's owner group, and one for everyone else.</t>
          <section anchor="interpreting-access-control-lists">
            <name>Interpreting Access Control Lists</name>
            <t>NFS clients do not perform access checks based on their
interpretation of an ACL read from the server. NFS servers
are solely responsible for authorizing and restricting
access to file content via the NFS protocol.</t>
            <t>An NFS Access Control List is a list of three or more
Access Control Entries (ACEs) associated with one file
system object. Each Access Control Entry in this list
specifies a user and a set of access types granted to
that user.</t>
            <t>Only ACEs that match the requester are considered. Each
ACE is processed until all of the bits of the requester's
access have been ALLOWED. Once a bit has been ALLOWED,
that bit is no longer considered in the processing
of subsequent ACEs in the list.</t>
            <t>When the ACL has been fully processed, if there are bits
in the requester's mask that have not been ALLOWED,
access of that type is denied.</t>
            <t>Note that an ACL might not be the sole determiner of access. For example:</t>
            <ul spacing="normal">
              <li>
                <t>In the case of a file system exported as read-only,
the server may deny write access even though an object's
ACL grants it.</t>
              </li>
              <li>
                <t>Server implementations can grant some limited permission
to update an ACL in order to prevent a situation from
rising in which there is no valid way to ever modify the ACL.</t>
              </li>
              <li>
                <t>All servers will allow a user the ability to read the
data of the file when only the execute permission is granted
(i.e., if the ACL denies the user the NA_READ access and
allows the user NA_EXEC, the server will allow the user to
read the data of the file).</t>
              </li>
              <li>
                <t>Some server implementations have the notion of
owner-override, in which the owner of the object is allowed
to override accesses that are denied by the ACL. This can be
helpful, for example, to allow users continued access to
open files on which the permissions have changed.</t>
              </li>
              <li>
                <t>Some server implementations have the notion of a
"superuser" that has privileges beyond an ordinary user.
The superuser may be able to read or write data or metadata
in ways that would otherwise not be permitted by the object's
ACL.</t>
              </li>
            </ul>
            <t>NFS clients can use either the NFS_ACL version 2 ACCESS
procedure or the NFS version 3 ACCESS procedure to ask the
server to perform an access check based on the requesting
user and the ACL present on a file system object. Clients are
also free to simply try an operation to see what works, then
recover it the server denies access.</t>
          </section>
          <section anchor="acls-in-operation">
            <name>ACLs in Operation</name>
            <t>The SETACL procedure sets two types of Access Control Lists:</t>
            <dl>
              <dt>Access:</dt>
              <dd>
                <t>An NFS access ACL specifies the access permission
for a file object. Access Control Entries in an ACL's
"aclent" field comprise the object's access ACL.</t>
              </dd>
              <dt>Default:</dt>
              <dd>
                <t>An NFS default ACL specifies the default ACL that
is set on objects that are children of a directory.
Access Control Entries in an ACL's "dfaclent" comprise
an object's default ACL. The default ACL does not affect
access to the object on which it is set.</t>
              </dd>
            </dl>
            <t>Each NFS ACL must have one ACE for each of
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ.
An NFS ACL that consists only of these
three ACEs is referred to as a minimal NFS ACL.</t>
            <t>An NFS ACL may zero or more NA_USER and/or NA_GROUP
ACEs.</t>
            <t>When a client presents a SETACL operation that a server
finds is invalid or it cannot process, the server responds
with ACL2ERR_IO or ACL3ERR_INVAL, depending on the version
of NFS_ACL that is in use. ACLs that are not valid include:</t>
            <ul spacing="normal">
              <li>
                <t>The presented ACL does not contain one ACE for each of
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ</t>
              </li>
              <li>
                <t>The presented ACL is a default ACL but the target object
is not a directory</t>
              </li>
              <li>
                <t>The presented ACL contains too many ACEs</t>
              </li>
              <li>
                <t>The presented ACL's type field contains more than one
set bit</t>
              </li>
            </ul>
            <aside>
              <t>cel: What does the NA_ACL_DEFAULT bit do?</t>
            </aside>
            <aside>
              <t>rthurlow: In the Solaris acl(2)/facl(2) system calls, the
equivalently-defined ACL_DEFAULT is used after aclent
sorting to note where regular entries end and where default
entries start in a single list.  So perhaps it would be
normal for the dfaclent entries to all be so marked.</t>
            </aside>
            <t>The "id" field in an Access Control Entry is interpreted as follows:</t>
            <ul spacing="normal">
              <li>
                <t>For an ACE that specifies an NA_USER_OBJ, NA_USER,
NA_GROUP, and NA_GROUP_OBJ, the "id" field contains
a UID or GID value that identifies the user on the
server whose access permission is being set.</t>
              </li>
              <li>
                <t>For an ACE that specifies other types of permission,
the "id" field is ignored.</t>
              </li>
            </ul>
          </section>
          <section anchor="relationship-between-acls-and-other-file-attributes">
            <name>Relationship Between ACLs and Other File Attributes</name>
            <t>When an ACL is present on a file, the ACL controls the
requesting user's access to the file. Typically the NFS
server ignores the file's mode bits.</t>
            <t>Depending on the behavior of the local file system
implementation, changing the file's ACL via the SETACL
procedure may alter the file's mode bits, and changing
the mode bits via the SETATTR procedure may alter the
content of the ACL in any way. NFS clients should
refresh cached ACLs or file modes after one of these
operations.</t>
            <t>When an ACL is present on a file, changing the file's owner
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_USER_OBJ.</t>
            <t>When an ACL is present on a file, changing the file's group
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_GROUP_OBJ.</t>
            <t>If an NFS client observes that a file's ctime attribute
has changed, it should assume that any ACLs that are
present might have been modified.</t>
          </section>
          <section anchor="acl-inheritance">
            <name>ACL Inheritance</name>
            <aside>
              <t>Section needs to explain how default ACLs work and what
impact they may have on the mode bits of the new file.</t>
            </aside>
            <t>A client uses one of the NFS CREATE, MKDIR, or MKNOD procedures
to request instantiation of a new file object. The server uses
the default ACL from the parent directory as the initial access
ACL on the new object.</t>
          </section>
          <section anchor="historical-references">
            <name>Historical References</name>
            <t>The section entitled "The POSIX 1003.1e/1003.2c Working Group"
in <xref target="Gruenbacher"/> details the history of POSIX standards efforts
with regard to file access control. The editor recommends that
readers familiarize themselves with the extent to which POSIX
specifies the content and behavior of ACLs.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="protocol-elements-common-to-both-versions">
      <name>Protocol Elements Common to Both Versions</name>
      <section anchor="rpc-authentication">
        <name>RPC Authentication</name>
        <t>The NFS_ACL service uses AUTH_NONE in the NULL procedure.
All RPC authentication flavors may be used for other procedures.</t>
      </section>
      <section anchor="constants">
        <name>Constants</name>
        <t>These are the RPC constants needed to call the NFS Version 3
service.  They are given in decimal.</t>
        <dl>
          <dt>100227</dt>
          <dd>
            <t>The RPC program number for the NFS_ACL protocol</t>
          </dd>
        </dl>
        <t>Only versions 2 and 3 of this RPC program are valid.</t>
      </section>
      <section anchor="transport-address">
        <name>Transport address</name>
        <t>The NFS_ACL protocol can operate over the TCP, UDP, and RDMA
transport protocols.
For TCP and UDP, it uses port 2049, and for RDMA, it uses 20049.
In both cases, this is the same as the base NFS protocol.</t>
      </section>
      <section anchor="sizes">
        <name>Sizes</name>
        <sourcecode type="xdr"><![CDATA[
NFS_ACL_MAX_ENTRIES 1024
]]></sourcecode>
        <t>The maximum number of Access Control Entries allowed in one Access Control List array.</t>
      </section>
      <section anchor="basic-data-types">
        <name>Basic Data Types</name>
        <t>The following XDR definitions are basic scalar types that are used in other structures.</t>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned int uid;
]]></sourcecode>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned short o_mode;
]]></sourcecode>
      </section>
      <section anchor="structured-data-types">
        <name>Structured Data types</name>
        <t>The following XDR definitions are common structured data types
that are used in all versions of the NFS_ACL protocol.</t>
        <section anchor="aclent">
          <name>aclent</name>
          <t>This structure represents a single entry in an Access Control List.</t>
          <sourcecode type="xdr"><![CDATA[
struct aclent {
    int type;
    uid id;
    o_mode perm;
};
]]></sourcecode>
          <t>The "type" element in an Access Control Entry is a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_USER_OBJ = 0x1;        /* object owner */
const NA_USER = 0x2;            /* additional users */
const NA_GROUP_OBJ = 0x4;       /* owning group of the object */
const NA_GROUP = 0x8;           /* additional groups */
const NA_CLASS_OBJ = 0x10;      /* file group class and mask entry */
const NA_OTHER_OBJ = 0x20;      /* other entry for the object */
const NA_ACL_DEFAULT = 0x1000;  /* default flag */
]]></sourcecode>
          <t>The "perm" element in an Access Control Entry is also a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_READ = 0x4;            /* read permission */
const NA_WRITE = 0x2;           /* write permission */
const NA_EXEC = 0x1;            /* exec permission */
]]></sourcecode>
        </section>
        <section anchor="secattr">
          <name>secattr</name>
          <t>The secattr structure represents, on the wire, the full Access Control
List for one file system object. This list contains an array of
Access Control Entries that apply to the object, plus an array of
default Access Control Entries that are inherited by the object's
children.</t>
          <sourcecode type="xdr"><![CDATA[
struct secattr {
    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>
        <section anchor="interoperability-considerations">
          <name>Interoperability Considerations</name>
          <t>Interoperability between NFS peers that do not implement
the NFS_ACL protocol is what we already have today.
Interoperability between peers that both implement the NFS_ACL
protocol is described in the rest of this document.</t>
          <t>The following subsections briefly discuss three new
interoperability scenarios.</t>
          <section anchor="client-implements-nfsacl-server-does-not">
            <name>Client Implements NFS_ACL, Server Does Not</name>
            <t>Typically an NFS server that implements the NFS_ACL program will
advertise the presence of NFS_ACL via an rpcbind registration.
An NFS client that implements NFS_ACL should perform an rpcbind
query before attempting any NFS_ACL procedure <xref target="RFC1833"/>.</t>
            <t>If the client sends any NFS_ACL procedure without sending an
rpcbind query first, and the server does not implement the
NFS_ACL program, the server responds with an RPC access_stat
of PROG_UNAVAIL.</t>
          </section>
          <section anchor="server-implements-nfsacl-client-does-not">
            <name>Server Implements NFS_ACL, Client Does Not</name>
            <t>An NFS server that implements advanced access control can
deny requests made by a client by responding with
NFS2ERR_ACCESS or NFS3ERR_ACCESS status codes, and an
NFS client has no visibility as to why the denial occurred.
Neither can that client send operations to update
the access control on file objects.</t>
            <t>This is a quality of implementation issue for the client.</t>
          </section>
          <section anchor="client-implements-exported-file-system-does-not">
            <name>Client Implements, Exported File System Does Not</name>
            <t>An NFS server that implements the NFS_ACL protocol might
share both file systems that implement ACLs and
file systems that do not. In this case, NFS clients
detect the presence of an NFS_ACL service on the NFS
server.</t>
            <t>For file objects that do not implement ACL support:</t>
            <ul spacing="normal">
              <li>
                <t>The server responds to a GETACL procedure by returning
a manufactured minimal ACL (i.e., only three ACEs) that
reflects the current mode bits of the object.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 3 procedure by
returning ACL3ERR_NOTSUPP.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 2 procedure by
returning ACL2ERR_IO.</t>
              </li>
            </ul>
            <t>The Linux implementation of the NFS_ACL protocol deviates from
the protocol specified in the current document by returning
NFS3ERR_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>
          <sourcecode type="xdr"><![CDATA[
enum aclstat2 {
    ACL2_OK = 0,
    ACL2ERR_PERM = 1,
    ACL2ERR_NOENT = 2,
    ACL2ERR_IO = 5,
    ACL2ERR_ACCES = 13,
    ACL2ERR_NOSPC = 28,
    ACL2ERR_ROFS = 30,
    ACL2ERR_DQUOT = 69,
    ACL2ERR_STALE = 70
};
]]></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_NOSPC</dt>
            <dd>
              <t>No space left on device.  The operation caused the server's file system to reach its limit.</t>
            </dd>
            <dt>ACL2ERR_ROFS</dt>
            <dd>
              <t>Read-only file system.  Write attempted on a read-only file system.</t>
            </dd>
            <dt>ACL2ERR_DQUOT</dt>
            <dd>
              <t>Disk quota exceeded.  The client's disk quota on the server has been exceeded.</t>
            </dd>
            <dt>ACL2ERR_STALE</dt>
            <dd>
              <t>The "fhandle" given in the arguments was invalid.  That is, the file referred to by that file handle no longer exists, or access to it has been revoked.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="server-procedures">
        <name>Server Procedures</name>
        <section anchor="procedure-0-null-no-operation">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implementation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors">
            <name>ERRORS</name>
            <t>Since the NULL procedure returns no result, it can not return an
NFS_ACL error status code. However, some server implementations may
return RPC-level errors based on security or authentication policy
settings.</t>
          </section>
        </section>
        <section anchor="procedure-1-getacl-retrieve-an-access-control-list">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-1">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2args {
    fhandle fh;
    unsigned int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-1">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2resok {
    struct nfsfattr attr;
    secattr acl;
};

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

union SETACL2res switch (enum nfsstat status) {
case ACL2_OK:
    SETACL2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-2">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL2args.fh field with the ACLs specified by the
SETACL2args.acl field.  The client obtains the file
handle using one of the NFS version 2 LOOKUP, CREATE,
MKDIR, SYMLINK procedures, or the MOUNT service, as
described in <xref target="RFC1094"/>.</t>
            <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, or the new ACL does not
contain at least the minimal set of ACEs (as described
in <xref target="acls-in-operation"/>), the server responds by
setting SETACL2res.status to ACL2ERR_IO.</t>
          </section>
          <section anchor="errors-2">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getattr-get-file-attributes">
          <name>Procedure 3: GETATTR - Get file attributes</name>
          <section anchor="arguments-3">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2args {
    fhandle fh;
};
]]></sourcecode>
          </section>
          <section anchor="results-3">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2resok {
    struct nfsfattr attr;
};

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

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

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

union GETXATTRDIR2res switch (enum nfsstat status) {
case ACL2_OK:
    GETXATTRDIR2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-5">
            <name>DESCRIPTION</name>
            <t><xref section="5.3" sectionFormat="of" target="RFC8881"/> defines a set of generic file attributes known
as "named attributes". The GETXATTRDIR procedure extends this facility
into the NFSv2 protocol.</t>
            <t>The GETXATTRDIR procedure obtains the file handle of the named attribute
directory associated with the file handle in the GETXATTRDIR2args.fh
field. This directory contains only objects of type NFREG.</t>
            <t>If the GETXATTRDIR procedure is successful, the server sets the
GETXATTRDIR2res.status field to ACL2_OK.
It fills in the GETXATTRDIR2resok.fh field with a file handle that
the client may use to look up the target file's named attributes.
It fills in the GETXATTRDIR2resok.attr field with the name attribute
directory's current file attributes, as detailed in <xref target="RFC1094"/>.</t>
            <t>Using the file handle returned in GETXATTRDIR2resok.fh, a client
can utilize the READDIR and LOOKUP procedures to obtain file handles
for the named attributes associated with the target file system object.</t>
            <t>If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to false, the server returns ACL2ERR_NOENT.
If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to true, the server attempts to create the named attribute
directory before returning a result.
If the target file currently has a named attribute directory
associated with it and the GETXATTRDIR2args.create boolean is set
to true, the server returns the file handle of that named attribute
directory.</t>
            <t>If the RPC user does not have read access to the target file, or
if the GETXATTRDIR operation is to create a named attribute directory
and the RPC user does not have permission to do so, the server returns
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_IO in the GETXATTRDIR2.status
field. Neither named attributes nor named attribute directories have
their own named attributes.</t>
            <t>Note: This operation is equivalent to the NFSv4 OPENATTR operation as
specified in <xref section="16.17" sectionFormat="of" target="RFC7530"/> and <xref section="18.17" sectionFormat="of" target="RFC8881"/>.</t>
          </section>
          <section anchor="implementation-5">
            <name>IMPLEMENTATION</name>
            <t>Server implementers are free to choose not to implement this procedure.
In this case, the server returns the RPC-level error PROC_UNAVAIL.</t>
            <t>If the server implementation does implement the GETXATTRDIR procedure
but the shared file system containing the file object specified by the
file handle in the GETXATTRDIR2args.fh field does not support named
attributes, the server returns ACL2ERR_IO in the GETXATTRDIR2.status
field.</t>
          </section>
          <section anchor="errors-5">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_NOENT</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-3">
      <name>NFS_ACL Version 3</name>
      <t>Version 3 of the NFS_ACL protocol is used in conjunction only with
version 3 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-3">
        <name>Data types inherited from NFS version 3</name>
        <section anchor="scalar-data-types">
          <name>Scalar Data types</name>
          <t>These are defined in <xref section="2.5" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned hyper uint64;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned long uint32;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 fileid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 uid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 gid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 size3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 mode3;
]]></sourcecode>
        </section>
        <section anchor="ftype3">
          <name>ftype3</name>
          <t>The enumeration "ftype3" represents the type of a file object.
This definition is further explained in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype3 {
    NF3REG    = 1,
    NF3DIR    = 2,
    NF3BLK    = 3,
    NF3CHR    = 4,
    NF3LNK    = 5,
    NF3SOCK   = 6,
    NF3FIFO   = 7
};
]]></sourcecode>
        </section>
        <section anchor="specdata3">
          <name>specdata3</name>
          <sourcecode type="xdr"><![CDATA[
struct specdata3 {
    uint32     specdata1;
    uint32     specdata2;
};
]]></sourcecode>
          <t>The interpretation of the two words depends on the type of file
system object. For a block special (NF3BLK) or character special
(NF3CHR) file, specdata1 and specdata2 are the major and minor
device numbers, respectively. For all other file types, these
two elements should either be set to 0 or the values should be
agreed upon by the client and server.</t>
          <t>Further detail is available in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
        </section>
        <section anchor="nfsfh3">
          <name>nfs_fh3</name>
          <t>The nfs_fh3 data type is a variable-length opaque object returned
by the NFS version 3 LOOKUP, CREATE, SYMLINK, MKNOD, LINK,
or READDIRPLUS procedures.
A client uses this handle during subsequent NFS operations
to reference the file. This definition comes from
<xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
NFS3_FHSIZE 64
]]></sourcecode>
          <t>The maximum size in bytes of the opaque file handle.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfs_fh3 {
    opaque       data<NFS3_FHSIZE>;
};
]]></sourcecode>
          <t>To the client, a file handle is opaque. The client stores file
handles for use in a later request and can compare two file
handles from the same server for equality by doing a
byte-by-byte comparison, but cannot otherwise interpret the
contents of file handles. Further, if two file handles from the
same server are equal, they must refer to the same file, but if
they are not equal, no conclusions can be drawn.</t>
          <t>Servers may revoke access provided by a file handle at any
time. If the file handle passed in a call refers to a file
system object that no longer exists on the server or access for
that file handle has been revoked, the error, ACL3ERR_STALE,
is returned.</t>
        </section>
        <section anchor="nfstime3">
          <name>nfstime3</name>
          <t>NFS version 3's "nfstime3" structure represents the number of
seconds and nanoseconds since midnight January 1, 1970 Greenwich
Mean Time. Further details are in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfstime3 {
    uint32   seconds;
    uint32   nseconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr3">
          <name>nfsfattr3</name>
          <t>This document refers to NFS version 3's file attribute structure
as "nfsfattr3". This is the same as the fattr3 structure described
in <xref section="2.6" sectionFormat="of" target="RFC1813"/>. A definition of the bit fields in
the "mode" element, which relate to traditional file system access
permissions, can also be found there.</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr3 {
    ftype3     type;
    mode3      mode;
    uint32     nlink;
    uid3       uid;
    gid3       gid;
    size3      size;
    size3      used;
    specdata3  rdev;
    uint64     fsid;
    fileid3    fileid;
    nfstime3   atime;
    nfstime3   mtime;
    nfstime3   ctime;
};
]]></sourcecode>
        </section>
        <section anchor="postopattr">
          <name>post_op_attr</name>
          <t>The NFS version 3 "post_op_attr" data type returns file
attributes that are not directly involved in the requested
procedure. See <xref section="2.6" sectionFormat="of" target="RFC1813"/> for more
information.</t>
          <sourcecode type="xdr"><![CDATA[
union post_op_attr switch (bool attributes_follow) {
case TRUE:
    fattr3   attributes;
case FALSE:
    void;
};
]]></sourcecode>
          <t>The format of this data type appears to make returning file
attributes optional. However, server implementers are strongly
encouraged to make a best effort to return attributes whenever
possible, even when returning an error.</t>
        </section>
      </section>
      <section anchor="error-values">
        <name>Error Values</name>
        <t><xref section="2.5" sectionFormat="of" target="RFC1813"/> describes an enumerated type called
"nfsstat3" which provides a status code for NFS version 3 procedure
results.
A matching type called "aclstat3" is defined in this document
for the similar purpose of returning NFS_ACL version 3 procedure
status codes. The numeric values of these two types match up,
although aclstat3 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
        <sourcecode type="xdr"><![CDATA[
enum aclstat3 {
    ACL3_OK             = 0,
    ACL3ERR_PERM        = 1,
    ACL3ERR_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="procedure-1-getacl-retrieve-an-access-control-list-1">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-7">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3args {
    nfs_fh3 fh;
    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>
          </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>
          </section>
          <section anchor="errors-8">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_PERM</t>
              </li>
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL3ERR_ROFS</t>
              </li>
              <li>
                <t>ACL3ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getxattrdir-get-named-attribute-directory">
          <name>Procedure 3: GETXATTRDIR - Get named attribute directory</name>
          <section anchor="arguments-9">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3args {
    nfs_fh3 fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-9">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3resok {
    nfs_fh3 fh;
    post_op_attr attr;
};

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

<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,
Wim Coekaerts,
Andreas Gruenbacher,
Rick Macklem,
Greg Marsden,
Martin Thomson,
Rob Thurlow,
and
Jim Wright
for their input and support.</t>
      <t>Special thanks to
Area Director
Gorry Fairhurst,
NFSV4 Working Group Chairs
Brian Pawlowski
and
Christopher Inacio,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their patience, guidance, and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1923Lb2JbY+/4KjDpVbXeRtCXabbd8ps/QEm3ztCxpRKnd
namJCyJBCSMS4AFAyWrHU/mNvOVD8pT8Sb4k67ovAEjJ7ksmM8dV57QIYN/W
Xnvd19rdbtdUaTVPdqOt08skOkyqm7y4il6l8yQa35ZVsogGk0lSltFenlVF
Po8O0rKKjou8yif5fMvE5+dFcg3ND1+No8HegfdqElfJRV7c7kZpNsuNmeaT
LF7AUNMinlXdNKlm3WxWXj/B/+/Gk3n38bZZprvRP5V5URXJrOxE5e2C/4DG
i3i5TLOLfzbl6nyRlmUKM7pdQn+j4ekrky6L3agqVmW18/jxd493TFnF2fR9
PM8z+OQ2KQ3Msm/iIolhtu+S8wheR6OsSoosqaLTIs7KJYy7ZRACF0W+WuKq
WgDyY1Lg2NGTLXOV3MLr6a6JuhEAAP8DMDDXSbZK4GF0z26iiBey9Q4+giVG
r7EdPl/E6RyeE5j+ASHWy4sLfBEXk0t4cVlVy3L30SP8Dh+l10lPP3uEDx6d
F/lNmTyiHh5hy4u0ulydQ9vJ5WpyNU+uk+JR2p3qJuAnc9i5svK6d5/2uHkv
zf1Gj9Ztae+yWkCXJl5Vl3mBcILuo2i2ms8ZF/aw5+gAu6Y3gGLwNJmmVc4P
YCFxlv4SVwAr2OpsmiwT+L+soreTfAVoCSh2lqVVMo3GFU49ymfRYJEU6SSm
rxIG4ySZ0xT/wVsO7L0xWV4sYIBr2rOTV3tPnj7+Vv58+rS/vWsMYnD4zfbj
757on8+3+/Lns6f9x/Ln8+fPt/HP18Uqyc7jyWWC64d/cuCOj8ajn9pOF0w/
gz+y1Qf63IKO/qVZuRsNetDr//6f0qu8YXgOsilgeNnyHgC5G41X42F0EJ+X
9HAKwNqNvu3CienTgxJglpS4WB1vC87zJIH9yC7KLcAIgGwFhOLVyXB4CNOH
YzO52o2wg+hsTI8GWbaK59FpMrnMYAPmuLZZUiTZJOlEy2Uv2nn6XXfn2c6W
jDAavzzcjba73/W3v3u23d3e7j6GN39Zlb9MfomvApCNFssiv8YDgnM4Tgra
FOiYzvJeXhTJpMoQnjDNOMMjGY2TQnGrBZJ7PR4pvgqguHcJJCF8QeDbTwH9
YUnDv67S5QKQEAcFqkHY6YEUlvHd8+/WgZQBhdB0oIk8OHcsKMsyn6TUeSd6
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
SQB+8G34wV/Ofhi+PPrJ6+H5rytShRts8MpCDleTRBgUDFG8ntP1e873OOcY
VbfzzdJWYdknutNR4vPOE6qNZEfguEI1TNPlj/Yu4imb7B8UeV491Ng50oX8
y5v1EklVk4LqTQ4Bf6eiWH1bFGv06EioH0g5XlGsB8Et0H6Zq4d+wSwc3Cuk
EzC81lVtKIZ1evmb18LiBGfOwksltFwLtiIOOCGNI/fwskiMiiF/J29X0dhZ
bwqSW1P6UMXzzffxetesrjIxOideUSTEMrdPs7zwbfUmIAmbqnjVUJcsKVyV
7e56XlwUq17QyxKb9QW9BhJoTcGRwbm5f40vR7VoHClP9ICqeD1kZKRJeUW/
TiUC7uvS1TPib+5V9ctRQiIcvD3NUqyeBnifYmC2zeeWALtPBbAGhcaZwyG5
kKzwjbOfafQAiFSodsjlxSBO3bogpxqJh/6PfGeY5zEJwegIPqN7rZpeuCF8
zuy5XsRLjvbUK5Qjt6JA+GA3BXfNckZYJEAsh3Q5Fytal3wDKxW5Aqm0yOH8
4guhchgRaK+oDEtw1TqBJ0PKn61xMCkYZ+NX8eI9DTCzmSxoObFcRG6bV7ZE
sdB4NlBJwYMRl5dErZrruomdUzyjAHFvFI1ywbwFdBXT/GMWV0f7bKq1JJyW
JHnyam314vy4ZoFflV32vIwuU8CGAgRPvDAQbWjxBWcTAkFOqJizDQ4kmszs
QI071JfF60V6QVJyvQi7HxfEs+ObffF5uuBWpPRo5zQ8JUMTZBloEmqiC/1b
/by/1c/7t1o/rwIdlqrnBVvsquqZTVX12OJfWHWtWVzP3Le4nnaK9IMDaM39
y+pFf2BZvb4X96oeg9+mrF7fD3wNrCobauo1ekBWu76Pehm+vh8ka3XXZoBs
v1aCr78+NrY2Ffnvv9mifP0/Ol9TfW/rvW5rCgKZ9jROtY6f1pb0t0J9/2EL
9fXXhC/3NxTq69+3fBJSFXcv+j3DhQVJvTzKlnp9OoVGxT4jFfuiX1Gxz4fJ
H1Wxr/+ZdX7qgbn3qdhnNhUHCuLIXMmedRX76mW+oqBiHwetr6vYt+7qnjtK
hTUD1dQm1A1Nht5vp4J228x+3lPVlP6gan+bZIMvrfZ3l1TgCQHjzxYCxl8o
BIzvEgLGXyQE/OG1AvtfUCuw/5vXCmyE6WitQAnSsYLDRonBNCWGNYUfrMTw
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
y5r2K8GfJyDEtpJGzetztLGlCoBPNgEzJ1nlnglt4//8qYVdfB+2n87W9EAv
NvdxXxrMJCE8UbpQZQnsfdVO4jWNGxWLgoxfMhZpF5IzG5Sfbj1huPntOE40
kqHhGbW4vBIpKy1dYS5323mDrlz6tuKaLofHaO2Sk81bCQCSutlnzc9mmzc5
wqb52VG8Tmu7TgartTcmqF+neVdkQ8xxZfa9M3D46hAEQap06B5hkCbVN3SP
MCiPqhq6R1h7nwrvu0dYe58K77tHWHufKh7W0JohJ+XBoZudUIbSOuDsPv8n
/u6fXXNBbnSOwq6sO9S2lHDr21Xw+lOj81mNXjDs5F9NqApIiYp7zVdSO7d9
Or5UFry5WPuGq+m2vqILADa85/K6G5queckVeNtfSR1efam7w8SPK+y2vlts
eDdx71qpoqtnQ3UgX7CMHFYa5bKiXCcyMNlrJ2R20PiI4DyFpM0vHbrjocZA
LpYMDtLAu8wlPE8D/16X8FwN3PUx9tj4zzlOm8uENrvDYqBcBrT+jkqBcg3Q
+iuuA8oVQOvvuAoo1/9cuwWtF9aKq8wxFCnBhVEcDdoUVMfRGyvtufPulryD
dzcPsXSp6Wravv1+SvvWrwFQ69evynOfqyuJ2AXXV+oowdQkjw3f2Vw2/ZDz
2drXN743yDYtKuzs/sBqwGX8G8Bl/FvABYF7enpyF2DWN/wVQPC6+HXY4ebx
pWCQ63bvc6K4wjs7OxvdMbvWy3ut6rRdU6BJayJphSIYUA0uKGJQc4S+aetO
8shqwh10hwl3oAJzDgz7uu7o6u3R/ujVz3WpjmbGOhkVadMy43aq0td9/kFf
XMnUdeXmpOJd69yGP50OD/frEqLVFrEqo84HAHffXuUi5ZoVgZR1qh25ZpZr
4Id66ZkqtrY7UUlXEjcaPchyra3MGqXr/GELWZfOP48Gb8ZHPmiu4y8/Z8Hk
PvuYtavj3u0Pqmy1p706jRqjQ6QnucviR8tNOVY3EETW3/O86YwHKd9ryV/j
gueNXOWzyOLn3Pm8kTS23/38Jfv2efpVf71+dcflcq2fBHfKBV/UrpKrv7M3
yLW8uGh94e6La2ki18Q9aqiK/UBXDG5l8x77N7N5j/3b2bzH/g1t3mP/ljbv
sX9Tm/fYu62tHZH929lqNIXw1t3QtuHtzhpG6N9tBTN70hjd3VGlvd91T1X7
Kry7cxrTbGq3zTt02nu1l8DYk12/CEZfNC6DaQFWXamtXQqjz+sXw1gKUr8c
puUFXxBjX9QvifEnFVwUY9fXvCxGXzUvjGl5s1j7pl09/aIbVyzB41tX7Nzb
bl6x38rtK/ckdr+vstxfryz3Q2W536Ys99cqy/31ynJ/jbLc36Ase1nFfKNG
c6hWRbq/XpHub1Ck+22KtP/OXaZhr9JozoiTSu1VGo3+267TqH+kV2rIdRqf
odL3f51K368JJ37FGHt4P0+l79elk5aqM5Zg3K36Ngrz3tHtGovAXSVtfKGm
32IN6N8tz6yr29u+rvG94X9v+8B9Ib+p/RcC+X51ENcDua0eYiuQ19VFXHtg
vlz81x5EC6iL//37if/32eHPE/8b29zW5WecjvtWfdp4RNqrP7Vu4R2scHyp
GcoUJm85neZ34FUpAczDMJFjDHMBDvH4yXeud9jZiyJeuI9Ojl6fDN56MFR6
ql/86FuRddbBA6HfGDm08x6Lwj/ATx4i93wRfOjMievb8zcPPDsrdrQddjS+
R0f8zYNx2NFOc0Ziwto8JfjogW+ww776YV9OTV/fFX/zwLN5YUdPGpPylceN
E9MPH9T1bOz3qev3U7j2xib3P2OT+/fY5P6GiffDTe5v3OTNHQWb3F+/yf6h
3DitNnj2Wzb8k/v5iYWVnZ1nWs6tXnBizDU1zMfdGDNyPpnvoyBrwiuczlmH
kkC2XFGyGmck+SHnHPB98mqvV8u/wPSpYqoRF5ThlM+4ElwjF0zyL1xejAYo
3PJoQdp6JLUOOEF1RlRV8vMp4FSjYbv7RTyrOM0Nc+L14gW8TSyHRpjHFtZh
/DusKfPdkx28lfT0MqmnPtRnrbcAOthhbTouOUt5xpg5RFOlcFwsCkARspO0
9G5bYf82EUNO+TJTnDftA8wHU16OsaIkFaJJXKmHeWqXjTEkaTZNr9MpXnlS
S/3CNCdjM404n1ZCeGkH5eIAnKO9wRbziyl3X26AvIxLQ1fMwE5w1ggcWzTr
Yks/x0dqdaJBJylktnQT14oYNl3oTdDwQ43drbI0Q4VhLDmKFMktWcPEV4qV
JpJR7TVQbuc5A8JdU17HsIIz/o3m/PTo7i0t+RNPr1OJbnZQ5kiwlms9jF72
hhfg5JjEVPqZjq6YhjFHxUWcpb9Q213NCTBnJwe7cuL/dFlVy3L30aObm5te
Tu97k3zxvTFvcaJpdbsbUV4I2qexKC2GNsYXyS4nKnjl5KgEv61lhIkTnERC
maN7+/sHxtSIAZZ7wfTVCWatwFoO0mz14X4rofPB37/CtEG51Wfdwq7wRM5h
fRdfsDC8ZWwZSFv1teLx9ajoOexcI1vRS1by4PL6+OB6ZxNgeKV8D9VcVlxL
mFuTFRWljTrVrwFzs3NMlCs+fepw/qC7ad5P6SgbSZmVBTgD0/i5GEUCBC0l
f8XHj/QVZaDVRiTcRnqFkJ5j7Wq62nAm19mXNoERiTGPhRigKN5CtQdUX5c1
20VcXHEK8i5wFW1EOYu4XY7+copqion1SOmwH6qrgayr39tOOtC8zIlYkg3d
EneJwtIwuVvKBptjBgeQNJt0Ca2pMgLAjPvffuayJzmfiS7MA/D5EXdMhKBx
itFLwLsySgIrlRjgzWtStbOA9eCFD6Vc6Q5Lx3QnaOsD0xUrkfwSJEyUwDjW
q3/2JC+WAWrMgG7YjSdXms83rySOWSoseyHPMeULUhJ4iiXjqbhEpgHPHbxb
T/OHbZ+uuAlnwXGnxvIU7Jdrr+DttVPJDqy4nOQpUvQZMYYWTFDsl4unpJmU
A6iSi0IS9QeuXDRfFewtgm5b43htPHVYMEQWbLvoSmIYLc0WB5jHt1T8lMFq
bKV4rQJFSuV4HP2QFOdJkZeuP1dVHqvjyI3IJLssFsSFaMNGg8NBY7NGVCwG
ZJxYS3D4Vei0VO7Tp/1tPOuUazfFI2rCdH3qm2tq80dB5LHWldcrwIQQYG2E
Y9WfKF4Ok9UuMHOICqnE02lwsUUgrgHnEySFxXW7XTiakyvCS6YobyU5iZOW
86wLPXVv8AIxT0BTuqZJ1J7kY9go6nypCZUdyTegjZa04Ano4tHbFIp+fvos
CXt+eieZZzWzUjKHS0dARYTFKjw11nAEB0fplU9VkWTBnnqvYSftSZMvERSw
8pgPp3wH67FJ15xnTlJGNEtuXOX4POBLfKANCktaJACpms9ANsyV7hVjieQk
mco1hd6xVAPJE2Psn/77Oq8KahU4oPKIUhWELn2Nb0F2+N4KcLEeZo7np7sx
ZzHf65ZkJJp5EtP1E2iq10XS3eNZulzRJZGc657Zr6VkHZfvJ7LyPeEGlxeQ
qx+TjMrdNKs1pnR0pRlXnXRsmlJXe5E8J0lZfLd6gwQ08ipkpln3HN4DtF96
NxfjvdxY1iC8is5pCarnhtKC03mobMeq1EIvcUkR51xoQoEQ86z5TnjOSQTZ
nm/1XiOuenusM3hCVxVZaZuyhe3dA7UjzsoP3z9P1aZqN5/Lte4IpzJEOWOC
p5xamVzEk9tAQsJEQExBpDJlFB6RAWW1CgUqaXrEby6x6oBerc6aqiKtpTam
BgCpLaHZ1aAe0IpOuOAKWeaFzjWx3V2xyQAo2w6hPX3A/KdyFQDn6K9sAY8b
QL75bdepJ8VycoFyVp7P8V6Qb9zdsk5R442h8gXWQirIoxGUwEzUP0SKUYzn
SJ1NrlnJ99BT1R6yMJZ3jFlrGtTgkBj40th7v6RknW8UrJVRUD6sMREo+PrG
UCH/d9N7hwwYQcO3v1WIFiaX9I9ShBYpcWZJA6kyjABa2cCWbbhfiYOvooG9
xJIh8HGXY9WT6d9vUU3rrU+8EGb0iKJ0IetsNUe2+BIraL6MQRDrmHfpAvAx
uYqToio7IPhNC9DxI09c75iTdHIFzHhyBRDvmNfA3+FXUU6TrAM6VAHYDluY
L8ocfp/k5/BjVczzG+RQU/MXGOAdZTdrQfEUM5SXUnJNCp7AssZScwtlZpTf
czOAqUT7EqNkXud4VfyrOC2g+7LqYJWMH59E70BKQ/R+TXlXe5fwvjQvQWzI
ouP4BqZRXqU0kb1LOCVVvkTiNMriSZrzBNu6AekJE8qLW4MLA3i8iW8zVxId
VrAEvEioat7FKp1y/TxcT07EDVbbM/8XkGFsdaEyAQA=

-->

</rfc>
