<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.3.6) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-cel-nfsv4-nfs-acl-00" category="info" submissionType="IETF" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="NFS ACL Protocol">The Network File System Access Control List Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-cel-nfsv4-nfs-acl-00"/>
    <author fullname="Chuck Lever" role="editor">
      <organization abbrev="Oracle">Oracle Corporation</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="02"/>
    <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 access and modify Access
Control Lists stored on an NFS version 2 or version 3 server.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chucklever.github.io/i-d-nfs-acl/draft-cel-nfsv4-nfs-acl.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-cel-nfsv4-nfs-acl/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network File System Version 4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chucklever/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 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 viewing or 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>This document assumes readers are familiar with the NFS version
2 or 3 protocols and at least one implementation of them.</t>
      <t>Issues of compatibility between the protocol described in
this document and NFSv4 ACLs (as described by <xref target="RFC8881"/>)
are considered out of scope. More information on this topic
is available in Section 6 of draft-rmacklem-nfsv4-posix-acls.</t>
    </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) specification 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 by using different protocol version numbers.</t>
        <t>The NFS and NFS_ACL protocols are both based on SunRPC. The
remainder of this document assumes an NFS environment that is
implemented on top of SunRPC, as it is specified in <xref target="RFC5531"/>.</t>
      </section>
      <section anchor="external-data-representation">
        <name>External Data Representation</name>
        <t>The eXternal Data Representation (XDR) specification provides a
standard way of representing a set of data types on a network.
XDR addresses the problem of communication between network
peers with different byte orders, structure alignment, and data
type representation.</t>
        <t>This document utilizes the RPC Data Description Language to
specify the XDR format arguments and results to each of the RPC
service procedures that an NFS_ACL server provides.</t>
        <t>Readers can find a full guide to XDR and the RPC Data Description
Language in <xref target="RFC4506"/>.</t>
      </section>
      <section anchor="authentication-and-authorization">
        <name>Authentication and Authorization</name>
        <t>The RPC protocol includes a slot 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 a server uses to
determine whether an access or modification to a file is permitted.</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 enforcing access control.</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. The server ignores the
file's mode bits. Changing the file's ACL via the SETACL
procedure does not alter the file's mode bits, and changing
the mode bits via the SETATTR procedure does not alter the
content of the ACL in any way.</t>
            <t>When an ACL is present on a file, changing the file's owner
(say, via the SETATTR operation) alters the server's
interpretation of any ACE that targets @OWNER.</t>
            <t>When an ACL is present on a file, changing the file's group
(say, via the SETATTR operation) alters the server's
interpretation of any ACE that targets @GROUP.</t>
          </section>
          <section anchor="acl-inheritance">
            <name>ACL Inheritance</name>
            <aside>
              <t>Section needs to explain how default ACLs work and what
impact they have on the mode bits of the new file.</t>
            </aside>
            <t>A client uses one of the NFS CREATE, MKDIR, or MKNOD procedures
to request instantiatiation of a new file object. The server uses
the default ACL from the parent directory as the initial access
ACL on the new object.</t>
          </section>
          <section anchor="historical-references">
            <name>Historical References</name>
            <t>The section entitled "The POSIX 1003.1e/1003.2c Working Group"
in <xref target="Gruenbacher"/> details the history of POSIX standards efforts
with regard to file access control.</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 can 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 int uid;
]]></sourcecode>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned short o_mode;
]]></sourcecode>
      </section>
      <section anchor="structured-data-types">
        <name>Structured Data types</name>
        <t>The following XDR definitions are common structured data types
that are used in all versions of the NFS_ACL protocol.</t>
        <section anchor="aclent">
          <name>aclent</name>
          <t>This structure represents a single entry in an Access Control List.</t>
          <sourcecode type="xdr"><![CDATA[
struct aclent {
    int type;
    uid id;
    o_mode perm;
};
]]></sourcecode>
          <t>The "type" element in an Access Control Entry is a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_USER_OBJ = 0x1;        /* object owner */
const NA_USER = 0x2;            /* additional users */
const NA_GROUP_OBJ = 0x4;       /* owning group of the object */
const NA_GROUP = 0x8;           /* additional groups */
const NA_CLASS_OBJ = 0x10;      /* file group class and mask entry */
const NA_OTHER_OBJ = 0x20;      /* other entry for the object */
const NA_ACL_DEFAULT = 0x1000;  /* default flag */
]]></sourcecode>
          <t>The "perm" element in an Access Control Entry is also a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_READ = 0x4;            /* read permission */
const NA_WRITE = 0x2;           /* write permission */
const NA_EXEC = 0x1;            /* exec permission */
]]></sourcecode>
        </section>
        <section anchor="secattr">
          <name>secattr</name>
          <t>The secattr structure represents, on the wire, the full Access Control
List for one file system object. This list contains an array of
Access Control Entries that apply to the object, plus an array of
default Access Control Entries that are inherited by the object's
children.</t>
          <sourcecode type="xdr"><![CDATA[
struct secattr {
    u_int mask;
    int aclcnt;
    aclent aclent<NFS_ACL_MAX_ENTRIES>;
    int dfaclcnt;
    aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
};
]]></sourcecode>
          <t>The "mask" element of the secattr structure is a bit mask. The
bit field vvalues in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_ACL = 0x1;         /* aclent contains a valid list */
const NA_ACLCNT = 0x2;      /* number of entries in the aclent list */
const NA_DFACL = 0x4;       /* dfaclent contains a valid list */
const NA_DFACLCNT = 0x8;    /* number of entries in the dfaclent list */
]]></sourcecode>
          <t>These bit field values are also used in the "mask" element of the
GETACL2args and GETACL3args structures.</t>
        </section>
        <section anchor="interoperability-considerations">
          <name>Interoperability Considerations</name>
          <t>Interoperability between NFS peers that do not implement
the NFS_ACL protocol is what we already have today.
Interoperability between peers that both implement the NFS_ACL
protocol is described in the rest of this document.</t>
          <t>The following subsections briefly discuss three new
interoperability scenarios.</t>
          <section anchor="client-implements-nfsacl-server-does-not">
            <name>Client Implements NFS_ACL, Server Does Not</name>
            <t>Typically an NFS server that implements the NFS_ACL program will
advertise the presence of NFS_ACL via an rpcbind registration.
An NFS client that implements NFS_ACL should perform an rpcbind
query before attempting any NFS_ACL procedure <xref target="RFC1833"/>.</t>
            <t>If the client sends any NFS_ACL procedure without sending an
rpcbind query first, and the server does not implement the
NFS_ACL program, the server responds with an RPC access_stat
of PROG_UNAVAIL.</t>
          </section>
          <section anchor="server-implements-nfsacl-client-does-not">
            <name>Server Implements NFS_ACL, Client Does Not</name>
            <t>An NFS server that implements advanced access control can
deny requests made by a client by responding with
NFS2ERR_ACCESS or NFS3ERR_ACCESS status codes, and an
NFS client has no visibility as to why the denial occurred.
Neither can that client send operations to update
the access control on file objects.</t>
            <t>This is a quality of implementation issue for the client.</t>
          </section>
          <section anchor="client-implements-exported-file-system-does-not">
            <name>Client Implements, Exported File System Does Not</name>
            <t>An NFS server that implements the NFS_ACL protocol might
share both file systems that implement ACLs and
file systems that do not. In this case, NFS clients
detect the presence of an NFS_ACL service on the NFS
server.</t>
            <t>For file objects that do not implement ACL support:</t>
            <ul spacing="normal">
              <li>
                <t>The server responds to a GETACL procedure by returning
a manufactured minimal ACL (ie., only three ACEs) that
reflects the current mode bits of the object.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 3 procedure by
returning ACL3ERR_NOTSUPP.</t>
              </li>
            </ul>
            <aside>
              <t>Linux returns NFS3ERR_NOTSUPP even for NFS_ACLv2. Check Solaris.</t>
            </aside>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-2">
      <name>NFS_ACL Version 2</name>
      <t>Version 2 of the NFS_ACL protocol is used in conjunction only with
version 2 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-2">
        <name>Data types inherited from NFS version 2</name>
        <section anchor="ftype">
          <name>ftype</name>
          <t>The enumeration "ftype" gives the type of an NFS version 3 file.
This definition comes from <xref section="2.3.2" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype {
    NFNON = 0,
    NFREG = 1,
    NFDIR = 2,
    NFBLK = 3,
    NFCHR = 4,
    NFLNK = 5,
};
]]></sourcecode>
        </section>
        <section anchor="fhandlet">
          <name>fhandle_t</name>
          <t>NFS version 2 uses a fixed-size file handle. The following definition
comes from <xref section="2.3.3" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
typedef opaque fhandle[FHSIZE];
]]></sourcecode>
        </section>
        <section anchor="timeval">
          <name>timeval</name>
          <t>NFS version 2's "timeval" structure represents the number of seconds
and microseconds since midnight January 1, 1970, Greenwich Mean Time.
This definition comes from <xref section="2.3.4" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct timeval {
    unsigned int seconds;
    unsigned int useconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr">
          <name>nfsfattr</name>
          <t>This document refers to NFS version 2's file attribute structure
as "nfsfattr". This is the same as the fattr structure described
in <xref section="2.3.5" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr {
    ftype        type;
    unsigned int mode;
    unsigned int nlink;
    unsigned int uid;
    unsigned int gid;
    unsigned int size;
    unsigned int blocksize;
    unsigned int rdev;
    unsigned int blocks;
    unsigned int fsid;
    unsigned int fileid;
    timeval      atime;
    timeval      mtime;
    timeval      ctime;
};
]]></sourcecode>
        </section>
        <section anchor="defined-error-numbers">
          <name>Defined Error Numbers</name>
          <t><xref section="2.3.1" sectionFormat="of" target="RFC1094"/> describes an enumerated type called
"stat" which provides a status code for NFS version 2 results.
A matching type called "aclstat2" is defined in this document
for the similar purpose of returning NFS_ACL version 2 procedure
status codes. The numeric values of these two types match up,
though aclstat2 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
          <sourcecode type="xdr"><![CDATA[
enum aclstat2 {
    ACL2_OK = 0,
    ACL2ERR_PERM = 1,
    ACL2ERR_IO = 5,
    ACL2ERR_ACCES = 13,
    ACL2ERR_NOSPC = 28,
    ACL2ERR_ROFS = 30,
    ACL2ERR_DQUOT = 69,
    ACL2ERR_STALE = 70,
};
]]></sourcecode>
          <t>These status codes carry the following meanings:</t>
          <dl>
            <dt>ACL2ERR_PERM</dt>
            <dd>
              <t>Not owner. The caller does not have correct ownership to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_IO</dt>
            <dd>
              <t>Some sort of hard error occurred when the operation was in progress.  This could be a disk error, for example.</t>
            </dd>
            <dt>ACL2ERR_ACCES</dt>
            <dd>
              <t>Permission denied.  The caller does not have the correct permission to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_NOSPC</dt>
            <dd>
              <t>No space left on device.  The operation caused the server's file system to reach its limit.</t>
            </dd>
            <dt>ACL2ERR_ROFS</dt>
            <dd>
              <t>Read-only file system.  Write attempted on a read-only file system.</t>
            </dd>
            <dt>ACL2ERR_DQUOT</dt>
            <dd>
              <t>Disk quota exceeded.  The client's disk quota on the server has been exceeded.</t>
            </dd>
            <dt>ACL2ERR_STALE</dt>
            <dd>
              <t>The "fhandle" given in the arguments was invalid.  That is, the file referred to by that file handle no longer exists, or access to it has been revoked.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="server-procedures">
        <name>Server Procedures</name>
        <section anchor="procedure-0-null-no-operation">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implementation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors">
            <name>ERRORS</name>
            <t>Since the NULL procedure returns no result, it can not return an
NFS_ACL error status code. However, some server implementations may
return RPC-level errors based on security or authentication policy
settings.</t>
          </section>
        </section>
        <section anchor="procedure-1-getacl-retrieve-an-access-control-list">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-1">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2args {
    fhandle_t fh;
    u_int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-1">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2resok {
    struct nfsfattr attr;
    secattr acl;
};

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

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

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

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

union ACCESS2res switch (enum nfsstat status) {
case ACL2_OK:
    ACCESS2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-4">
            <name>DESCRIPTION</name>
            <t>The ACCESS procedure determines the access rights
that a user, as identified by the RPC credentials
in the request, has with respect to the file system
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.
ACCESS2_LOOKUP</t>
              </dd>
              <dt/>
              <dd>
                <t>Look up a name in a directory (no meaning for non-directory objects).
ACCESS2_MODIFY</t>
              </dd>
              <dt/>
              <dd>
                <t>Rewrite existing file data or modify existing directory entries.
ACCESS2_EXTEND</t>
              </dd>
              <dt/>
              <dd>
                <t>Write new data or add directory entries.
ACCESS2_DELETE</t>
              </dd>
              <dt/>
              <dd>
                <t>Delete an existing directory entry.
ACCESS2_EXECUTE</t>
              </dd>
              <dt/>
              <dd>
                <t>Execute file (no meaning for a directory).</t>
              </dd>
            </dl>
            <t>If the ACCESS procedure is successful, the server
sets the ACCESS2res.status field to ACL2_OK. It
fills in the ACCESS2resok.attr field with the file
object's current file attributes, as detailed in
<xref target="RFC1094"/>. Lastly, it encodes the set of
permissions that the requesting user is granted
in the ACCESS2resok.access field.</t>
          </section>
          <section anchor="implementation-4">
            <name>IMPLEMENTATION</name>
            <t>In the NFS version 2 protocol, the only reliable way to
determine whether an operation is allowed is to try it
and see if it succeeded or failed. Using the ACCESS
procedure in the NFS_ACL version 2 protocol, a client can
ask the server to indicate whether or not one or more
classes of operations are permitted.</t>
            <t>In general, it is not sufficient for a client to attempt
to deduce access permissions by inspecting the uid, gid,
and mode fields in the file attributes, since the server
may perform uid or gid mapping or enforce additional
access control restrictions. It is also possible that the
NFS version 2 protocol server may not be in the same ID
space as the NFS version 2 protocol client. In these cases,
the NFS version 2 protocol client can not reliably perform
an access check with only current file attributes.</t>
            <t>The information returned by the server in response to an
ACCESS call is advisory only. It was correct at the exact
time that the server performed the checks, but not
necessarily afterwards. The server can revoke access
permission to a file object at any time.</t>
            <t>The NFS_ACL version 2 protocol client should use the
effective credentials of the user to build the
authentication information in the ACCESS request used
to determine access rights. It is the effective user
and group credentials that are used in subsequent read
and write operations.</t>
            <t>Many implementations do not directly support the
ACCESS2_DELETE permission. Operating systems like UNIX
may ignore the ACCESS2_DELETE bit if set on an access
request on a non-directory object. In these systems,
delete permission on a file is determined by the access
permissions on the directory in which the file resides,
instead of being determined by the permissions of the file
itself.  Thus, the bit mask returned for such a request
will have the ACCESS3_DELETE bit set to 0, indicating that
the client does not have this permission.</t>
            <t>The server should return a status of ACL2_OK if no
errors occurred that prevented the server from making
the required access checks.</t>
          </section>
          <section anchor="errors-4">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-3">
      <name>NFS_ACL Version 3</name>
      <t>Version 3 of the NFS_ACL protocol is used in conjunction only with
version 3 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-3">
        <name>Data types inherited from NFS version 3</name>
        <section anchor="scalar-data-types">
          <name>Scalar Data types</name>
          <t>These are defined in <xref section="2.5" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned hyper uint64;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned long uint32;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 fileid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 uid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 gid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 size3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 mode3;
]]></sourcecode>
        </section>
        <section anchor="ftype3">
          <name>ftype3</name>
          <t>The enumeration "ftype3" represents the type of a file object.
This definition is further explained in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype3 {
    NF3REG    = 1,
    NF3DIR    = 2,
    NF3BLK    = 3,
    NF3CHR    = 4,
    NF3LNK    = 5,
    NF3SOCK   = 6,
    NF3FIFO   = 7
};
]]></sourcecode>
        </section>
        <section anchor="specdata3">
          <name>specdata3</name>
          <sourcecode type="xdr"><![CDATA[
struct specdata3 {
    uint32     specdata1;
    uint32     specdata2;
};
]]></sourcecode>
          <t>The interpretation of the two words depends on the type of file
system object. For a block special (NF3BLK) or character special
(NF3CHR) file, specdata1 and specdata2 are the major and minor
device numbers, respectively. For all other file types, these
two elements should either be set to 0 or the values should be
agreed upon by the client and server.</t>
          <t>Further detail is available in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
        </section>
        <section anchor="nfsfh3">
          <name>nfs_fh3</name>
          <t>The nfs_fh3 data type is a variable-length opaque object returned
by the NFS version 3 LOOKUP, CREATE, SYMLINK, MKNOD, LINK,
or READDIRPLUS procedures.
A client uses this handle during subsequent NFS operations
to reference the file. This definition comes from
<xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
NFS3_FHSIZE 64
]]></sourcecode>
          <t>The maximum size in bytes of the opaque file handle.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfs_fh3 {
    opaque       data<NFS3_FHSIZE>;
};
]]></sourcecode>
          <t>To the client, a file handle is opaque. The client stores file
handles for use in a later request and can compare two file
handles from the same server for equality by doing a
byte-by-byte comparison, but cannot otherwise interpret the
contents of file handles. Further, if two file handles from the
same server are equal, they must refer to the same file, but if
they are not equal, no conclusions can be drawn.</t>
          <t>Servers may revoke access provided by a file handle at any
time. If the file handle passed in a call refers to a file
system object that no longer exists on the server or access for
that file handle has been revoked, the error, ACL3ERR_STALE,
is returned.</t>
        </section>
        <section anchor="nfstime3">
          <name>nfstime3</name>
          <t>NFS version 3's "nfstime3" structure represents the number of
seconds and nanoseconds since midnight January 1, 1970 Greenwich
Mean Time. Further details are in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfstime3 {
    uint32   seconds;
    uint32   nseconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr3">
          <name>nfsfattr3</name>
          <t>This document refers to NFS version 3's file attribute structure
as "nfsfattr3". This is the same as the fattr3 structure described
in <xref section="2.6" sectionFormat="of" target="RFC1813"/>. A definition of the bit fields in
the "mode" element, which relate to traditional file system access
permissions, can also be found there.</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr3 {
    ftype3     type;
    mode3      mode;
    uint32     nlink;
    uid3       uid;
    gid3       gid;
    size3      size;
    size3      used;
    specdata3  rdev;
    uint64     fsid;
    fileid3    fileid;
    nfstime3   atime;
    nfstime3   mtime;
    nfstime3   ctime;
};
]]></sourcecode>
        </section>
        <section anchor="postopattr">
          <name>post_op_attr</name>
          <t>The NFS version 3 "post_op_attr" data type returns file
attributes that are not directly involved in the requested
procedure. See <xref section="2.6" sectionFormat="of" target="RFC1813"/> for more
information.</t>
          <sourcecode type="xdr"><![CDATA[
union post_op_attr switch (bool attributes_follow) {
case TRUE:
    fattr3   attributes;
case FALSE:
    void;
};
]]></sourcecode>
          <t>The format of this data type appears to make returning file
attributes optional. However, server implementers are strongly
encouraged to make a best effort to return attributes whenever
possible, even when returning an error.</t>
        </section>
      </section>
      <section anchor="error-values">
        <name>Error Values</name>
        <t><xref section="2.5" sectionFormat="of" target="RFC1813"/> describes an enumerated type called
"nfsstat3" which provides a status code for NFS version 3 procedure
results.
A matching type called "aclstat3" is defined in this document
for the similar purpose of returning NFS_ACL version 3 procedure
status codes. The numeric values of these two types match up,
although aclstat3 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
        <sourcecode type="xdr"><![CDATA[
enum aclstat3 {
    ACL3_OK             = 0,
    ACL3ERR_PERM        = 1,
    ACL3ERR_IO          = 5,
    ACL3ERR_ACCES       = 13,
    ACL3ERR_INVAL       = 22,
    ACL3ERR_NOSPC       = 28,
    ACL3ERR_ROFS        = 30,
    ACL3ERR_DQUOT       = 69,
    ACL3ERR_STALE       = 70,
    ACL3ERR_BADHANDLE   = 10001,
    ACL3ERR_NOTSUPP     = 10004,
    ACL3ERR_SERVERFAULT = 10006,
    ACL3ERR_JUKEBOX     = 10008
};
]]></sourcecode>
        <t>These status codes carry the following meanings:</t>
        <dl>
          <dt>ACL3_OK</dt>
          <dd>
            <t>Indicates the call completed successfully.</t>
          </dd>
          <dt>ACL3ERR_PERM</dt>
          <dd>
            <t>Not owner. The operation was not allowed because the caller is either not a privileged user (root) or not the owner of the target of the operation.</t>
          </dd>
          <dt>ACL3ERR_IO</dt>
          <dd>
            <t>I/O error. A hard error (for example, a disk error) occurred while processing the requested operation.</t>
          </dd>
          <dt>ACL3ERR_ACCES</dt>
          <dd>
            <t>Permission denied. The caller does not have the correct permission to perform the requested operation. Contrast this with NFS3ERR_PERM, which restricts itself to owner or privileged user permission failures.</t>
          </dd>
          <dt>ACL3ERR_INVAL</dt>
          <dd>
            <t>An invalid or unsupported argument was specified for procedure.</t>
          </dd>
          <dt>ACL3ERR_NOSPC</dt>
          <dd>
            <t>No space left on device. The operation would have caused the server's file system to exceed its limit.</t>
          </dd>
          <dt>ACL3ERR_ROFS</dt>
          <dd>
            <t>Read-only file system. A modifying operation was attempted on a read-only file system.</t>
          </dd>
          <dt>ACL3ERR_DQUOT</dt>
          <dd>
            <t>Resource (quota) hard limit exceeded. The user's resource limit on the server has been exceeded.</t>
          </dd>
          <dt>ACL3ERR_STALE</dt>
          <dd>
            <t>Invalid file handle. The file handle given in the arguments was invalid. The file referred to by that file handle no longer exists or access to it has been revoked.</t>
          </dd>
          <dt>ACL3ERR_BADHANDLE</dt>
          <dd>
            <t>Illegal NFS file handle. The file handle failed internal consistency checks.</t>
          </dd>
          <dt>ACL3ERR_NOTSUPP</dt>
          <dd>
            <t>Operation is not supported.</t>
          </dd>
          <dt>ACL3ERR_SERVERFAULT</dt>
          <dd>
            <t>An error occurred on the server which does not map to any of the legal NFS version 3 protocol error values.  The client should translate this into an appropriate error. UNIX clients may choose to translate this to EIO.</t>
          </dd>
          <dt>ACL3ERR_JUKEBOX</dt>
          <dd>
            <t>The server initiated the request, but was not able to complete it in a timely fashion. The client should wait and then try the request with a new RPC transaction ID. For example, this error should be returned from a server that supports hierarchical storage and receives a request to process a file that has been migrated. In this case, the server should start the immigration process and respond to client with this error.</t>
          </dd>
        </dl>
      </section>
      <section anchor="server-procedures-1">
        <name>Server Procedures</name>
        <section anchor="procedure-0-null-no-operation-1">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments-5">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results-5">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description-5">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation-5">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implmentation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors-5">
            <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-6">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3args {
    nfs_fh3 fh;
    u_int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-6">
            <name>RESULTS</name>
            <sourcecode type="xde"><![CDATA[
struct GETACL3resok {
    post_op_attr attr;
    secattr acl;
};

struct GETACL3resfail {
    post_op_attr attr;
};

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

struct SETACL3resfail {
    post_op_attr attr;
};

union SETACL3res switch (nfsstat3 status) {
case ACL3_OK:
    SETACL3resok resok;
default:
    SETACL3resfail resfail;
};
]]></sourcecode>
          </section>
          <section anchor="description-7">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL3args.fh field with the ACLs specified by the
SETACL3args.acl field.  The client obtains the file
handle using one of the NFS version 3 LOOKUP, CREATE,
MKDIR, MKNOD, SYMLINK, or READDIRPLUS procedures, or
the MOUNT service, as described in <xref target="RFC1813"/>.</t>
            <aside>
              <t>How are ACLs removed?</t>
            </aside>
            <t>If the SETACL procedure is successful, the server sets
the SETACL3res.status field to ACL3_OK and fills in the
SETACL3resok.attr field with the file object's post
operation file attributes, as detailed in <xref target="RFC1813"/>.</t>
            <t>Otherwise, SETACL3res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-7">
            <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-7">
            <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>
    </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 int uid;
/// typedef unsigned short o_mode;
///
/// /*
///  * This is the format of an ACL which is passed over the network.
///  */
/// struct aclent {
///     int type;
///     uid id;
///     o_mode perm;
/// };
///
/// /*
///  * The values for the type element of the aclent structure.
///  */
/// const NA_USER_OBJ = 0x1;            /* object owner */
/// const NA_USER = 0x2;                /* additional users */
/// const NA_GROUP_OBJ = 0x4;           /* owning group of the object */
/// const NA_GROUP = 0x8;               /* additional groups */
/// const NA_CLASS_OBJ = 0x10;          /* file group class and mask entry */
/// const NA_OTHER_OBJ = 0x20;          /* other entry for the object */
/// const NA_ACL_DEFAULT = 0x1000;      /* default flag */
///
/// /*
///  * The bit field values for the perm element of the aclent
///  * structure.  The three values can be combined to form any
///  * of the 8 combinations.
///  */
/// const NA_READ = 0x4;                /* read permission */
/// const NA_WRITE = 0x2;               /* write permission */
/// const NA_EXEC = 0x1;                /* exec permission */
///
/// /*
///  * This is the structure which contains the ACL entries for a
///  * particular entity.  It contains the ACL entries which apply
///  * to this object plus any default ACL entries which are
///  * inherited by its children.
///  *
///  * The values for the mask field are defined below.
///  */
/// struct secattr {
///     u_int mask;
///     int aclcnt;
///     aclent aclent<NFS_ACL_MAX_ENTRIES>;
///     int dfaclcnt;
///     aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
/// };
///
/// /*
///  * The values for the mask element of the secattr struct as well
///  * as for the mask element in the arguments in the GETACL2 and
///  * GETACL3 procedures.
///  */
/// const NA_ACL = 0x1;                 /* aclent contains a valid list */
/// const NA_ACLCNT = 0x2;              /* number of entries in the aclent list */
/// const NA_DFACL = 0x4;               /* dfaclent contains a valid list */
/// const NA_DFACLCNT = 0x8;            /* number of entries in the dfaclent list */
///
/// /*
///  * XDR data types inherited from the NFS version 2 protocol
///  */
///
/// enum ftype {
///     NFNON = 0,
///     NFREG = 1,
///     NFDIR = 2,
///     NFBLK = 3,
///     NFCHR = 4,
///     NFLNK = 5,
/// };
///
/// typedef opaque fhandle[FHSIZE];
///
/// struct timeval {
///     unsigned int seconds;
///     unsigned int useconds;
/// };
///
/// struct fattr {
///     ftype        type;
///     unsigned int mode;
///     unsigned int nlink;
///     unsigned int uid;
///     unsigned int gid;
///     unsigned int size;
///     unsigned int blocksize;
///     unsigned int rdev;
///     unsigned int blocks;
///     unsigned int fsid;
///     unsigned int fileid;
///     timeval      atime;
///     timeval      mtime;
///     timeval      ctime;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 2.
///  */
/// enum aclstat2 {
///     ACL2_OK = 0,
///     ACL2ERR_PERM = 1,
///     ACL2ERR_IO = 5,
///     ACL2ERR_ACCES = 13,
///     ACL2ERR_NOSPC = 28,
///     ACL2ERR_ROFS = 30,
///     ACL2ERR_DQUOT = 69,
///     ACL2ERR_STALE = 70,
/// };
///
/// /*
///  * NFS_ACL version 2 procedure arguments and results
///  */
///
/// struct GETACL2args {
///     fhandle_t fh;
///     u_int mask;
/// };
///
/// struct GETACL2resok {
///     struct nfsfattr attr;
///     secattr acl;
/// };
///
/// union GETACL2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     GETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct SETACL2args {
///     fhandle_t fh;
///     secattr acl;
/// };
///
/// struct SETACL2resok {
///     struct nfsfattr attr;
/// };
///
/// union SETACL2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     SETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct GETATTR2args {
///     fhandle_t fh;
/// };
///
/// struct GETATTR2resok {
///     struct nfsfattr attr;
/// };
///
/// union GETATTR2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     GETATTR2resok resok;
/// default:
///     void;
/// };
///
/// struct ACCESS2args {
///     fhandle_t fh;
///     uint32 access;
/// };
///
/// const ACCESS2_READ = 0x1;           /* read data or readdir a directory */
/// const ACCESS2_LOOKUP = 0x2;         /* lookup a name in a directory */
/// const ACCESS2_MODIFY = 0x4;         /* rewrite existing file data or */
///                                     /* modify existing directory entries */
/// const ACCESS2_EXTEND = 0x8;         /* write new data or add directory entries */
/// const ACCESS2_DELETE = 0x10;        /* delete existing directory entry */
/// const ACCESS2_EXECUTE = 0x20;       /* execute file (no meaning for a directory) */
///
/// struct ACCESS2resok {
///     struct nfsfattr attr;
///     uint32 access;
/// };
///
/// union ACCESS2res switch (enum nfsstat status) {
/// case ACL2_OK:
///     ACCESS2resok resok;
/// default:
///     void;
/// };
///
/// /*
///  * XDR data types inherited from the NFS version 3 protocol
///  */
///
/// typedef unsigned hyper uint64;
/// typedef unsigned long uint32;
/// typedef uint64 fileid3;
/// typedef uint32 uid3;
/// typedef uint32 gid3;
/// typedef uint64 size3;
/// typedef uint32 mode3;
///
/// enum ftype3 {
///     NF3REG    = 1,
///     NF3DIR    = 2,
///     NF3BLK    = 3,
///     NF3CHR    = 4,
///     NF3LNK    = 5,
///     NF3SOCK   = 6,
///     NF3FIFO   = 7
/// };
///
/// struct specdata3 {
///     uint32     specdata1;
///     uint32     specdata2;
/// };
///
/// const NFS3_FHSIZE = 64;
///
/// struct nfs_fh3 {
///     opaque       data<NFS3_FHSIZE>;
/// };
///
/// struct nfstime3 {
///     uint32   seconds;
///     uint32   nseconds;
/// };
///
/// struct fattr3 {
///     ftype3     type;
///     mode3      mode;
///     uint32     nlink;
///     uid3       uid;
///     gid3       gid;
///     size3      size;
///     size3      used;
///     specdata3  rdev;
///     uint64     fsid;
///     fileid3    fileid;
///     nfstime3   atime;
///     nfstime3   mtime;
///     nfstime3   ctime;
/// };
///
/// union post_op_attr switch (bool attributes_follow) {
/// case TRUE:
///     fattr3   attributes;
/// case FALSE:
///     void;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 3.
///  */
/// enum aclstat3 {
///     ACL3_OK = 0,
///     ACL3ERR_PERM = 1,
///     ACL33ERR_NOENT = 2,
///     ACL3ERR_IO = 5,
///     ACL3ERR_ACCES = 13,
///     ACL3ERR_INVAL = 22,
///     ACL3ERR_NOSPC = 28,
///     ACL3ERR_ROFS = 30,
///     ACL3ERR_DQUOT = 69,
///     ACL3ERR_STALE = 70,
///     ACL3ERR_BADHANDLE = 10001,
///     ACL3ERR_NOTSUPP = 10004,
///     ACL3ERR_SERVERFAULT = 10006,
///     ACL3ERR_JUKEBOX = 10008,
/// };
///
/// /*
///  * NFS_ACL version 3 procedure arguments and results
///  */
///
/// struct GETACL3args {
///     nfs_fh3 fh;
///     u_int mask;
/// };
///
/// struct GETACL3resok {
///     post_op_attr attr;
///     secattr acl;
/// };
///
/// struct GETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union GETACL3res switch (nfsstat3 status) {
/// case ACL3_OK:
///     GETACL3resok resok;
/// default:
///     GETACL3resfail resfail;
/// };
///
/// struct SETACL3args {
///     nfs_fh3 fh;
///     secattr acl;
/// };
///
/// struct SETACL3resok {
///     post_op_attr attr;
/// };
///
/// struct SETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union SETACL3res switch (nfsstat3 status) {
/// case ACL3_OK:
///     SETACL3resok resok;
/// default:
///     SETACL3resfail resfail;
/// };
///
/// /*
///  * 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;
///     } = 2;
///     version NFS_ACL_V3 {
///         void
///             ACLPROC3_NULL(void) = 0;
///         GETACL3res
///             ACLPROC3_GETACL(GETACL3args) = 1;
///         SETACL3res
///             ACLPROC3_SETACL(SETACL3args) = 2;
///     } = 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 described in this document 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="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="Gruenbacher">
          <front>
            <title>POSIX Access Control Lists on Linux</title>
            <author initials="A." surname="Grünbacher" fullname="Andreas Grünbacher">
              <organization>SuSE Labs</organization>
            </author>
            <date year="2003" month="January"/>
          </front>
          <seriesInfo name="Proceedings" value="of the FREENIX Track: 2003 USENIX Annual Technical Conference, pp. 259-272"/>
          <seriesInfo name="ISBN" value="1-931971-11-0"/>
        </reference>
        <reference anchor="Juszczak">
          <front>
            <title>Improving the Performance and Correctness of an NFS Server</title>
            <author initials="C." surname="Juszcak" fullname="Chet Juszcak">
              <organization>Digital Equipment Corporation</organization>
            </author>
            <date year="1989" month="January"/>
          </front>
          <seriesInfo name="USENIX" value="Conference Proceedings, USENIX Association, Berkeley, CA, pp. 53-63"/>
        </reference>
        <reference anchor="IEEE">
          <front>
            <title>IEEE 1003.1e and 1003.2c: Draft Standard for Information Technology-- Portable Operating System Interface (POSIX)-- Part 1: System Application Program Interface (API) and Part 2: Shell and Utilities, draft 17</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="1997" month="January"/>
          </front>
        </reference>
        <reference anchor="POSIX">
          <front>
            <title>IEEE Std 1003.1-2001 (Open Group Technical Standard, Issue 6), Standard for Information Technology-- Portable Operating System Interface (POSIX)</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="ISBN" value="0-7381-3010-9"/>
        </reference>
        <reference anchor="Linux" target="https://www.kernel.org">
          <front>
            <title>Linux kernel source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OpenSolaris" target="https://github.com/kofemann/opensolaris">
          <front>
            <title>Archived OpenSolaris source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC1833">
          <front>
            <title>Binding Protocols for ONC RPC Version 2</title>
            <author fullname="R. Srinivasan" initials="R." surname="Srinivasan"/>
            <date month="August" year="1995"/>
            <abstract>
              <t>This document describes the binding protocols used in conjunction with the ONC Remote Procedure Call (ONC RPC Version 2) protocols. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1833"/>
          <seriesInfo name="DOI" value="10.17487/RFC1833"/>
        </reference>
      </references>
    </references>
    <?line 2173?>

<section anchor="source-material">
      <name>Source Material</name>
      <t>The on-the-wire protocol described here is intended to
match existing de factor implementations of NFS_ACL.</t>
      <t>The source for the XDR specification provided in this
document is the nfs_acl.x file as found in published
versions of the OpenSolaris source code base <xref target="OpenSolaris"/>,
an open source descendant of Solaris.</t>
      <t>However, there are a few changes to the protocol as it
was originally described in the OpenSolaris source code
base.</t>
      <section anchor="redaction-of-nfsacl-version-4">
        <name>Redaction of NFS_ACL Version 4</name>
        <t>Version 4 of NFS_ACL is described in the original nfs_acl.x source
file is described this way:</t>
        <ul empty="true">
          <li>
            <t>This is a transitional interface to enable Solaris NFSv4
clients to manipulate ACLs on Solaris servers until the
spec is complete enough to implement this inside the
NFSv4 protocol itself.  NFSv4 does handle extended
attributes in-band.</t>
          </li>
        </ul>
        <t>Because the two non-NULL procedures in this version of the NFS_ACL
protocol were used only as part of a Solaris a prototype and there
are no other implementations of NFS_ACL version 4, it is not included
in the protocol description appearing in this document.</t>
      </section>
      <section anchor="redaction-of-getxattrdir-procedures">
        <name>Redaction of GETXATTRDIR Procedures</name>
        <t>The original NFS_ACL protocol contained a GETXATTRDIR procedure
that was meant to provide clients access to named attributes
(auxiliary streams) stored with each shared file. These
procedures were later introduced in NFS version 4 <xref target="RFC8881"/>.</t>
        <t>As far as this editor is aware, support for NFSv4 named
attributes was only ever implemented in Solaris, which uses
these procedures make named attributes visible over NFSv2 and
NFSv3 as they are in NFSv4. There is little to no public
documentation beyond what can be found in the original
nfs_acl.x file.</t>
        <t>Therefore, the GETXATTRDIR procedures are not included in
the protocol description appearing in this document.</t>
        <aside>
          <t>Perhaps this document should provide rules for extending the
NFS_ACL protocol, in case some other implementation wishes to
provide named attribute visibility for NFSv3.</t>
        </aside>
      </section>
      <section anchor="code-compilation-requirements">
        <name>Code Compilation Requirements</name>
        <t>The original nfs_acl.x file that appears in the OpenSolaris code
base did not compile using the widely-available rpcgen tool).</t>
        <ul spacing="normal">
          <li>
            <t>The file does not include a definition of the ACL2_OK or
ACL3_OK constants used in definitions of result unions.</t>
          </li>
          <li>
            <t>The file does not include definitions of NFS protocol elements
that are shared with the NFS_ACL protocol, such as fhandle_t and
post_op_attr.</t>
          </li>
        </ul>
        <t>The XDR specification provided in this document rectifies those
omissions to provide a complete and compilable XDR language
description of the NFS_ACL protocol.</t>
      </section>
    </section>
    <section anchor="open-questions">
      <name>Open Questions</name>
      <t>Should the CDDL .x file be explicitly cited, or otherwise
referenced, in this document?</t>
    </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+2963bbVpYw+P88BVqZtWLXImlLdG5yddK0RNuskkU1KcXJ
9OrPCyJBES0SYAGgZCXjXvMa828eZH7NvMk8yezruQCgJCeVWjM97R+JCODc
9tln3/c+3W7XVGm1Sg6jvfNlEp0m1W1eXEev01USTe/KKllHg9ksKcvoKM+q
Il9FJ2lZRWdFXuWzfLVn4svLIrmB5qevp9Hg6MR7NYur5Cov7g6jNFvkxszz
WRavYah5ES+q7ixZdbNFefMC/9uNZ6vu8+dmkx5G/1bmRVUki7ITlXdr/gPa
ruPNJs2u/t2U28t1WpYpTOhuA92NhuevTbopDqOq2JbVwfPn3z0/MGUVZ/MP
8SrP4JO7pDQwyb6JiySGyb5PLiN4HY2yKimypIrOizgrNzDunkEAXBX5doOL
aoHHj0mBY0cv9sx1cgev54cm6kawfvwfgMDcJNk2gYfRI7uJIl7I3nv4CJYY
vcF2+Hwdpyt4TmD6lzSpFr28uMIXcTFbwotlVW3Kw2fP8Dt8lN4kPf3sGT54
dlnkt2XyjHp4hi2v0mq5vYS2s+V2dr1KbpLiWdqd6ybgJyvYuLLyunef9rh5
L839Rs927GhvWa2hRxNvq2VeIJig9yhabFcrxoQj7Dg6wZ7pDSAYPE3maZXz
A1hHnKW/xBWA6jAaF9BpAqhYwFbRM/pIcZBf06NZvgV0BdS7yNIqmUfTCtcU
5YtosE6KdBbTVwnDl5bXo/X9S0599Gb52pgsL9Ywyg3t5eT10Yuvnn8tf371
VX//0BhE7PCb/effvdA/v93vy5/ffvvtPv75ptgm2WU8WyYIDfgnh+9sPB39
1HbSYMoZ/JFtP/JKFZD0L83Kw2jQg17/r/9DepU3DN1BNgd0L1veA1gPo+l2
OoxO4suSHs4BQIfR1104Pn16UAKckhJXqOPtwdmeJbA72VW5B+gB0KyAaLye
DIenMH04Q7Prwwg7iC6m9GiQZdt4FZ0ns2UGQF/h2hZJkWSzpBNtNr3o4Kvv
ugffHOzJCKPpq9PDaL/7XX//u2/2u/v73efw5i/b8pfZL/F1ALLRelPkN3ha
cA5nSUE7AR3TwQYUKZJZlSE8YZpxhuczmiaFYloLJI96PFJ8HUDxaAn0IXxB
4DtO4SzAkoZ/26abdZJVDbxkkMIyvvv2u10gZUAhNB1oIg/OHQvKssxnKXXe
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
jKUWU7J+XPKOO6qlZU7pMFLwkZQw1Yqmfl2ZgExByxMgTdFO2lQ/SFmedetl
Q9EQF5IumtB95OpBQuR6ZAJkS64+SHRcSyY26BhmAhNnO2mMPxzRFmg1fCxB
cQJN4xw+Qp5xBOA+C24ozfhE4w8SZtSCi2bIJt6bBt579MFdI+CqxbVOPDwF
7a5eG88bhu3IpZWkf2dUFHOVkgLPdfLay6u7GIbUS53lMhSY7FZRVCDaMVOs
2cxbR4nVGEFMYOpFfE2CW4ynNad2ss04I5mwjV7HAHcpI2aDrnPoYU6OVjtr
OnKVXLzF5TkppZAjkrwAc5QR/dLwALgrvrCsE2nJSVzRYoHVzbNKsFhzIXIN
ukDiBSvGOyJbCNElZrISyVcgbPF+BbxkwcjFulJNx+JqA+lK6yyWo0DGAQlX
2XKxJL8cvy1xmngJmaYWQo9JL0U6kzvkRpXNXNzkJZdKVSw17bjk142UgnOy
ALnGwnBwTFzeg5D2YhdG2zKRhHHzYBPPJ06IbCFi6hXlpOgqfLHjWAtD8b2j
VqIPr6JJM2tlYne/UEGOFEgpOyMtidDDeARWDG/RgCM59VSf15DBy1ICvUnI
Xn1BagYVxeV67GiAyRJcVlykmBCENYtuscRDUOACocJhLlqtonafcmATosKj
d3rzxfm9R9EmanB8xpZzikxC1dBSjCVz8k9QCxqZ+zZdcQXNWhiBD/OA4tka
H3SZDh0xpU+BbKaoS3C1U8FxjbuPxZ9ZI4ndKxeLzJ+aMSd2xAIrNiOg6lEU
khLBnA02RW1puNKaBO+2oefdLq9pHasUNgyvz6CzbWNWkroeQC7VhRbHs5iu
BYPkOq8WkcM7YVri3oga4SGIq6XYemdTA6NKDQpzwwVFQSWAC237MB6Wa5Eg
IS7Y1Bwh6NpVKzVpVSarBbkytmK31oxTT/um4vuzJQXlEDwMlUW1gX8MzL4P
TIQkYNfzjnISJtMxZykKytdDCFOfxvc00Zm9Dnw6NFBHI3PIMsq+Bti+LDcS
amNjJOUeRap2G8QKsni6jq+1ypKERM0DIve5poZGqknfpZr0f3+qSf/3ppr0
2Rwy5SoatRoWUtTFi232TTjWgMNXhN9TO2MJDwpSUr9+8VCdDQwxFH1216fU
j0Si9+/5CDTi7YNfXN3/BQyEAfUPdILCRd9PXsH3/V2pO/29ehKITeAJ6+zX
czhQ+dwWJH0Flez9Xfl61664HJ6+TeLpY9oO/PMyd/qYukOPbPZOH9N36JHN
4OljCg89slk8fUzjoUdf2UfT8dFf6dHX9tHr0esxPfomiP1HyQ2Vp34zb1/f
aAYKg5wMIvJq/+WuNwdhpn2znhdB/zaXm6i5gKUltrotbUXk+Z4KSp/Qi2Oi
JwyrpygYzpYx3rOUFPrWPGGwPZVSZXbyZFm1E7ZllNbxf+RciBcIN975QTHP
ej9nRw0cwIVRAKLpYH14wg6+tx3PcYd5kcE1JpozKbRTEkQvE0uc1SMlmQXy
3SVIE3hVFsgiG7wHgzmIu2ZNrwUw5rVgJ6tuUf0S8XvxFLEAb55fLOXgyA9X
GIfTTm9ALMMOu6sku0KBk7OzRNCyLkuZZZgPV7fHiCGmw8XPOhH9QFMM2i7g
IJydXHg6M+WC+DXViEGJJQg+sMnrLOTg0E6y4XJqUqfM8ltJXGrN0zKPOtaY
APmBU9Kir1sKNVGGXJpFfJGxBsZIRpuXONc4dwp+PnXSgv/hjvzZG9ivZ5F7
yNFRgiYwwkt0qR/fuEa3MSelHyRBF49wBDSy9lVcSYSy3rCCwjfd1F3w6Q3b
2tsqYheWS5kN6qYG3JjnZNCi+527l3ddukCVuwS9ImNVQKriunrfln6Q4Kne
ZSURsky8MYDPAdegl/lF9fkZf3507QjOj6+G5+rFhXpO7GqYdODc0oWptF4a
TlIaZzm50VdbFu2klNu8iG9RftI7DFH2DZSX4C7tcNNYdSEtqqeBjP57vGdJ
qlSxduaS+eIWyskCWD2XoJbz4BIL8AaaRiZCPc+A5VTJYdHkYZLAOiZ1YQyO
yOBi+mG6Zv9LTiikV4/J1zSankmOsTh7ZLqmy9Y0LlszCglnqZGZj6IA7rzS
3OtsMkzS1KdZa4Kmuhb6j0vQ7D82QbP/UIZm/zEpmjUI4B21jm66i1GclYdr
zaJwZiu06L3fBRaZTdi+5q5/8l3bTR2sQ8eJbDeXaBbfcvxO0UI8ZVFesmif
KKdLFSWRkcmplyjqJBg/TRREVKG8Nkn0yj2zKaIkqPIzlwTqPUSVQh5amcrP
C2Vxl2Zskz9FynZ/8mOLbEHip/d03fq0Jelzk5fVh3zzwVWyCln2nv/BnicM
aAJHPWQhSGi0BoM0u8lXN35IuTgsnJEUr3hN7kE44iFk5/SMKd7Ws8fNn671
uV3moNS5OX5gl4p1u51PLobsUhO8ibyPX/I3rwcn02Gb341dNHTjti2tY4Gk
tzFjGlF8rUBTp4cPtnzDZ6B5/6S7jb1gwsS3sq7uDFrft0V8xTljNACIxMik
uRgqJ9yxgu5GwixFHMCoAbTDVRsoe9ELDJZQBLnNnaLzfiS5NEwJDtXQxyUE
i/uz/5lJwV7BCvPY9OD+H5Ae7M/j96UHx6swQbj/xyQI912CcB9NM/4/P1m4
b5OF7cv98OVo7Lf8KnzJycO2Zb/WFC8psG8PDsK3nGBs334bvqU0Y/u2X5sx
ZxvrWy/n2Aki9u03tbavBsdvB6fH9MU/Y3Xi5/v1iXFlk8h+8KLW/3Dy43Ci
ZRbxg6/DD/5y8dfhq/FPXg/f/r7kZ9xDgxcFsEtIQshQ9kMJekVF751zke9T
9Ta3mTId5itz1XL2gV0mlNRrR2DfnWiufOVC7WrQ6EmR59VT9U+RuuNfmaRX
N6gmFKQd922y9ejZWOgPyBlesvWT4GokP336qZ+IjYKEl6AZsJzWQe9Jsj5f
/t1zrDl2nkNLU4mY0FI6uEVOTGLnFd6ggIZh7NveI1sHvH8ZJweNlT5U8fjx
JTXe3SPbTEz5iZdsi0jggjQWuVd82uvwwezwGmaRLYOT8R/OE+dk63qiuKUF
uxPFBxJBQP7BAK0fnzvuiAqNI2mvTyg7/CkjI03KSyY/FyfQl6XLk+VvHpVN
7ggVnWvenmZdHU8He0ySuW3zuanlj8ksbxBQnDkckivJHrp39guNLAChBgV/
udEHBJo7Z+evUWDof+y76dlrLcjrg9HRY0b3WpWGcEP4nNlzvY437PDUe4Ui
t6KA/bOjgLtmTh/mn4jtjoqOs6qzTOViZ1RiNtAFnF98IVQOnWL2lrIwtbvW
CTwZjsbeioXBSCEC68LFWv7qY7EBWmi7sERermBTrkHhAHg2UE3Ag4GXlSO1
aq7rNk4rLTOYUYyEN4omD2BEDgaM0fz50vtodBxc6CgV0yX5Q+2dnqsLjTWx
jYOgW054z8tomQI2FCD64R0EaMWKrzhMFghyQsW5rH+Mr1jM+aZBMc/qDXaE
1+v0iuTUeq05D1NkdnzdDT5P19yK1A7tnIanCH+CLANNom90of9dl+G/Xl2G
/yJlGSpQIqkoQ7DDrliDua9YA5vcbe2/lpoN5rE1GyJXs0GqNZjHV2uI/oHV
Gvpe0Lma7D+3VkNS69IPOg7sGfcUamj0gCx2dx/12g59P0RZ1fOW8OR+ra5D
f3d4cm0q8v//11Z66P+jw4/V67Xb37Ujx9S0RyWrXfq8tqT/rv7w/9vqD/0d
scP9e6o/9B+bC4xUxTgV63FpwYKkXghxSxGIfnsRCCNFIKLfUQTCh8g/qghE
/zNTVl0S7uOLQJj78lw9BPGzT3cVgajflBoFRSA4XmxXEYhdhYnN5xaB6Psh
XZ563G1a7vxvPN2vWzfASagVnyYrEzyyKsR9fP631oR4iNF7fH362Xx9+hv5
+vQhvj79TXz9H15Rov8bKkr0/+4VJRoxL1pRQiJerCxwrxBgmkLAjtQkFQL+
qEITxrW5j7nsKjTxD2EuzZoT/zCq/981J/4r1pz4XAb+mbwYY+XCShA+vsqh
CuvxNyaHNKtxKbdfv8I8WL+C87w+p36FztrcO2tyPOzm8a5yRZPle5UrPB9G
1wOIrWThXAPup1fY4u8mQbibMxjRR3jXBl8SeuZf1cxPNZ7CpXmxPwdTKDYJ
xbp3nAzHXmoCtufLIXu4ZM4Rv3K3cfhInlaowiUfN3yy+eAFV3dQjgBZ2ej6
7byWnGHax6QLIfBGUzJQl9UdUuLQ6hIzW8ALIUnsQ+kPVywxAusEj1harrli
bWYvhSSXgyFHGZqywk45wYFuCJ0Ojz68mU570XuMvXeTCVsEWHqlSZRa4NfL
36HENPcTU9Qim0NDoXBUpJitb9ncSKwpO6Y41cpPcjkPbl8t865EIFCWi5eR
A0eAMwQxk43GwzsbAZvs1Wpuvl5Yb0TXqBgbtrWVe7d60fAGr/zRAMZMbX1A
2tKCAxjVS8mhjpo2RzZ1zVjSydBDziKCp1foPiIjoUloFC8XTQOw1CovJvwq
kXtGcEnsY6JJ3y5z9DAlFVl2aTFeEBoM/wzhQB5EiW8kO7RR57G1w2d89eqW
CP8iRtmC4qG9Xa9yo55XjqAAIFBSieQLLoIMKVoyyG31XK15vkbqKb4awlYK
duM7sDjYzQByL7MUjcoclxRnsfBnWqK4ZNkxmhfqRL1J0dxr7ImwkbZFNDq2
86SL3u9yvcRplm8SjS1S65XaoDGbk25C7op5tJ5xhdyPeN1si/Et7KGHJSB2
ElgNYsDzp+QKcT4/xH1kcCWFtK7Rd1rwvWUelcDD4RVU18uxJdYQeF9S1B3T
LonSaIhBsIWaBBpndzml6OYSQzsje7F2abgR4LkiJtnsr4jrBYtAgVdStYFa
DowPLI82Ykiy2F5gF0o6Fs85hnbOieHbtFyCWES+Po5C4Fu5URa/GB0DL3o1
Pv75KYmmtwmSjtJuKK6PqYvBo9vRm8I4ChrJpZ/jBM8Q31oFK06J5XApVNsV
kZg0kSAj1w/SyJKKtAUiQ8nDE3GHHeHl2syeKr56LWBTVhAuAO50/lGtXzEl
1MRgkCm7WCdGHAQFXS8pOpEmaRYxAK3sGD3+hIkVB3NiuxWI+U6wIFKIS2eb
79xm+7HMal3YiKkgI+ui1NBQpHAC6bZqEo/s5b2iNMqUUDz8KKY6zMrDIhfr
TV5p6rXevI2pmG7n7TV8TiehWK4exVPYHvwZ55k4Ga37EjFZ6dOavUKYe474
Tlll6GsC/OKAX1Y6nkh8GOUAUtIhWmlkqzsMCVT0hL3xsvQEoNRvMx3hZMV8
XSzqmU97fJ0BGqxrueL55U2ab8vVHeVXurX1+IJwCcq/xBA8cbWJgk4300kq
DhKMjPk48wMvkOiOinKT8QDNqbjTBKMZUTyKxx6Iuuz81n7Yj/FvSEfELxLE
A9lo/NJlZnK0jBWxiCPW74Il6h6iE2EcbyUv2EjKv1qAFdtcKYBedJJeJ6x2
ylR4nkaUbs4fxO3WVEo8xLxxpQbFXNr8buYmdl4m3A1/epRikLClKL1JguVw
uUZ4lc30koZMsAuxiQ4gwcPPMDaUscjJIdDHCrEJBkivMt/GYakFxTxtDN+A
tc1sxQXr+5dcYTgLdxwbjmNw+Gmqd9h5C2DbEFt4w1Xr+SpJ+snkguKa7tky
RUMXw8euGATgWsbiaRd2UnJRdaodE3sfRJeAXpJdD5JCjv6SGfQE04CugDas
dWIpijYOkXSHnEP60BPx0PyKA1K8p73LsOKrQalkA7uGhVVUnPCic4J9Kxv3
PGaAhyUH/c7yqyz9JaEk73kCaErTZyDi+XSzbEcrygRH3PB4ZNNNm4qeCUg1
wzOBPu2Z30tHw3Fxlk3IULMOBeHqlCld+sHJgaBoAp20EfAhcSAMBgyfI1pp
gmMeRzxdrJhgAyctxXH9G/V/BwdfmhCNY6XX5X2bWuxhc+kxyipkTWEFfKOo
i2apuFjVc/DpldkBQiUCnBNB9rC/bMtfZr/E12QQ0+zEmwfusO94Jh8TmARn
cieuxJDVd4blDJQqcMVn6IVP2/RfZ6MQXTdWlz0mGs2kvUiEanctNMERY3Oc
LEuT5dllufEtLaxjK2i80DJl4rGnZhkVPEEtth/M08WCCaDEntSqRjTXAwrA
nJmQSuiRLMe4FbINlkTHoAQHObjndEUtGwPD8jGBKSswvskyajIih0klyXUZ
XeW5vbA25rwoTIpy8SlFQsGCyCkIXo37Vv2pWmMt6W5FcoX7APPgESl6THsr
1czQUiow+ul4gg4YBuGxuyOQg5Dk9mH/uunaGak48BYQHhg/2Rnl4ucmQjtv
PFKEfgctJEVSeldI42RWIE5t46uECx29+Or51+JKt9cobzTs0GbqEeGjokK4
+DUFzmChBdoMVEVBzMQUZFYk6abnbpV3kWyImLIWBwO+E/FQ7mmHpXgXMi9R
neBJcKSQnxrGkW1clge0A0S5pIs9Ep/DxbUAb0feQLk0X/zTs8s0ewZ/XQEX
jr78H9Gfnj179mX0v0QIsi/LH/5HBL+jH34IHuE3/xM806B2udtIZKX4Etiv
LgA3GDNOfdlc80IEYr1yuSe8zV8pxU+GTaI9PG296mO1R6V0NGLBwnMu5ecs
MCm2mPcFXgN4jA8e7PrQwgLEfjej6M+RjhV9Ty7AeLbqfVSfVxQdoefzCHYX
BH+Y7UkKrKUEJYuez/R5qV1qcGO4RjLbpJhAOmebj5v5ijuMUH3BC7F0ta4/
3GwMszJEsNeXlPLCVYHI5MYci+gEaGv6tcaCUIC5ITNAJpX/UC+UYeV2WtQ2
sisSoDYuRFaWijMjIQQZBFnKgbLOvZwUxJxnf6L/RX8CWG3uqLhN9GT2NDp4
fvAiGg3PX0fnxba0waVIvErM35ZGXklCnOkW1I6idDQB7wWKBqj3U9WcyE2C
22s3eOxaGqMCdKjfjAu8nb7WcJKgVkjETEwgmigtYXj4BCCPEMYjDqeAdDtp
jrqJqEoUp25tl0GVLkdkbG0qae/QAbWl1Glt66Q6rE21W5ssrVRmSYuVJGeS
4ew51dYRbTHvDzA48jkSrqIFg0xp3gR4r1xT7wbYtJytYlDqivoWNKeHafIO
cjo9pW5//AyVI+hpjHWLn2H8OB4h136NSfFkRrR7Zbmjv6rmqvVicIoLQj4K
Mx1RIHxSgVIOglN11+GTAMPi/92odDRYVNHmvKtW5kCujUPnWKOCq0O65qow
g2oB7xNOIsnJQMZQrpDdFemNT5xc8zJfVLexfw+9DrspUsTsArE3C2oGhauH
FbwdTaPp+PX5+8FkGMHfZ5Pxj6Pj4XH06md4OYyOxmc/T0Zv3p5Hb8cnx8PJ
1LUdnB7D69PzyejVxfl4Mo32BlPoYo9eDE5/joY/nU2wptZ4Qp7Z0fDYNYbx
JoPT89FwCsA9PTq5OB6dvulE0FN0Oj6PTkbvRucwi/NxB6fh2klHXvto/Dp6
N5wcvYWfg1ejk9H5zzSD16PzU5TbbNPXMI9BdDaYnI+OLk4GIPNcTM7G02GE
Sz8eTY9OBqN3w2OgWKNTmIRrOPxxeHoeTd8OTk5qMBm/Px1OcH0BHF558z0Z
DV6dDHlsAMnxaDI8Osclu7+OAN4w9ZNOND0bHo3gD2/on4aw4MHk546MMh3+
6wV8DV9Fx4N3gzew/ich/FzjOiBhb48uJuQgR6BNL15Nz0fnWKD3zXh8jPvk
2qLjbQRy78voZDwlGF9Mhx0Y83xAU4G+AMDwGv5+dTEdhaAenZ4PJ5MLCjh5
CpjzHkAI0x9AH8e0OeNTAgdAczz5GXoPAUab2Inevx3CBxPcDoLvAOE1BTgf
nXufuaYwFYD/uQeQ6HT45mT0Znh6NMS3Y+zu/Wg6fAp7PoJJv/GnTDN6P4Dp
XBB8cKthwvynd0w6hBDRyJv04PjHES5NWgFWTUeCigToo7eyW3oCn+H/6W+u
mCwS4Id3g58+DBGV+NpXYMIv7ZdaZclej+w/tBWjyiVdifqB0+i17TOP1brE
ApcoLVFtInuUWsYiv1HKyBbjYPpagRnZMkzpV34H/3CCnNqvT9B+rzPGfzw9
okz88FP7VG3tHU0MppxiKV6gkoKMb0smhJMU+A4+wFZOPoxf/SUsHU7/nv1J
IwfYPtnW1C8UHjZ1xS7Jn1M2mr+ZjC/O7NAvXtZGvqXQC3b2hVc1tXbkl/je
NQ/xndbbA4WbTh0Mnr8M2pMgL5ULsXQpBxBiuLIt7x30RqfJ9nZQ641lXG6p
u7djWYj4x0NN2cWJPdfOqOo4O4IWq/jKPzghnthKF3WMQRxrxxht7hCH9b9q
WSQW8cSUY+V3YNckDWEGigqR3Om38pGWbmxFQlu7/kUbJlEVaM89V2/9fjLS
auot+1+3ozeaY8nkFuyX5liXvdn6HurhapQw2bAGAo2g0uryVMFWe/C8n6g6
VHfIb6vdjblvUsS1C1W6BZ02q21JKYJeuHa9eWHFLlf9D2vkoqV/ma7mRdIQ
jlqojxe771cCvExAdm0ljRqK6mijn4Ti00tAyVlWuWdC1Ph/f25hD9+H7eeL
HT3Qi/v7eCzxZVoQHiVdofIC9rZqJ/GOxo1E2fDWQTIEShcStB3UHWs9Wrjr
7chNxJGh4RmxOKuXlJOWrjCVoO2gQVcue0CRTJfDY7R2ybkOrScfadzis+Zn
kx2arOC++dlRvE5ru04Gqp2lMtWP06zS2xBrXH1FD/lPX5+C4EclLtwjLLpI
hS3cIyy6SBUX3SMsukgVF90jLLpIFRfdIyy6SHUwamitUpJWemO/+L9xvbZ/
d98JFqPXE8DvH1sVr/Cs2WJRrW+3wetPjc4XNYrAQJJ/NbHJ79cKdM1XUh2p
fTq+3BW8udr5husltb6iEo/3vOcCSvc03fGSayy1v5JKS/pSd4epHNdQan23
vufdzL1rJX8uYZLKgLxkKTisJcOFY7hMSGCL107InqCBD8HBCWmYXxzmwEON
gdTuDU7MwLtjLDw4A1t61x0C/zkXhOFSMPV3XPCFS73U31G5F67zUn/FtV64
ykv9HVd64RovO+HcWvhbHF2OPUgeN8ZgNChN623d9nAFFw/tYsLNQ1q7plsb
tt85Y9/6iSe1fj/35m6i98ElNDpK2w3e+M5mheiHnF/evr7pZ0DrvmW1X6r6
MLgakHn8Hau7IdN21+pnQ6Z2Md5u0Oxu+jvA8BmX492PIY1L8j4bEOEtXg8c
qPDGpVqHD13fhf8eeYVXs7vmNV7S3UNXeTW7al7nZWf2wJVeCoeH/j32aq/m
3JrXe0l/n3HFV7PX5jVf0usjrvpqm2P9ui/p7bOu/GpHw8+jxPfj4+deBrb7
pLVdCvb4g/Zbxe7+brH7gWLzrZ8ENeaDL2ql5evvbEX5lhdXrS9c/fiWJlI2
/llDg+gHKkRQpd177Fdq9x771dq9x37Fdu+xX7Xde+xXbvcee9Xb22moX629
hpuExK5i+z1vD3YQVL/WNczsRWN0V7Nae3+obnX7Krxauo1pNnWhZk3d9l5t
UVjLWuqFYfVFozhsC7DqKlCtSKw+rxeKteSkXiy25QUXjLUv6kVj/UkFhWPt
+prFY/VVs4Bsy5v1zjftysxvqsBqaR1XYbVzb6vEar+VaqyPJHZ/rGrV361a
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
gglVibvapnOuF4fryYmLwWp75v8B/C062lELAQA=

-->

</rfc>
