ACL\_GET\_FILE(3) Library Functions Manual ACL\_GET\_FILE(3)

# [NAME](#NAME)

`acl_get_file`, `acl_get_file_at` — get an ACL by filename

# [LIBRARY](#LIBRARY)

Linux Access Control Lists library (libacl, -lacl).

# [SYNOPSIS](#SYNOPSIS)

`#include <sys/types.h>`  
`#include <sys/acl.h>`

`acl_t`  
`acl_get_file`(`const char *path_p`, `acl_type_t type`);

`acl_t`  
`acl_get_file_at`(`int dirfd`, `const char *path_p`, `int at_flags`, `acl_type_t type`);

# [DESCRIPTION](#DESCRIPTION)

The [`acl_get_file`](#acl_get_file)() function retrieves the access ACL associated with a file or directory, or the default ACL associated with a directory. The pathname for the file or directory is given in the argument `path_p`. If `path_p` is a symbolic link, `acl_get_file`() returns information about the file or directory the link refers to.

The ACL is placed into working storage and [`acl_get_file`](#acl_get_file~2)() returns a pointer to that storage.

In order to read an ACL from an object, a process must have read access to the object's attributes.

The value of the argument `type` is used to indicate whether the access ACL or the default ACL associated with `path_p` is returned. If `type` is `ACL_TYPE_ACCESS`, the access ACL of `path_p` is returned. If `type` is `ACL_TYPE_DEFAULT`, the default ACL of `path_p` is returned. If `type` is `ACL_TYPE_DEFAULT` and no default ACL is associated with the directory `path_p`, then an ACL containing zero ACL entries is returned. If `type` specifies a type of ACL that cannot be associated with `path_p`, then the function fails.

This function may cause memory to be allocated. The caller should free any releasable memory, when the new ACL is no longer required, by calling [acl\_free(3)](/man/os/acl/acl_free.3) with the `(void*)acl_t` returned by [`acl_get_file`](#acl_get_file~3)() as an argument.

## `acl_get_file_at`()

The `acl_get_file_at`() function operates in exactly the same way as `acl_get_file`(), except for the differences described here.

If the pathname given in `path_p` is relative, then it is interpreted relative to the directory referred to by the file descriptor `dirfd` (rather than relative to the current working directory of the calling process, as is done by [`acl_get_file`](#acl_get_file~4)()).

If `path_p` is relative and `dirfd` is the special value `AT_FDCWD`, then `path_p` is interpreted relative to the current working directory of the calling process (like [`acl_get_file`](#acl_get_file~5)()).

If `path_p` is absolute, then `dirfd` is ignored.

The `at_flags` argument can either be 0, or include one or more of the following flags ORed:

[`AT_EMPTY_PATH`](#AT_EMPTY_PATH)

If `path_p` is an empty string, operate on the file referred to by `dirfd` (which may have been obtained using the [open(2)](/man/os/acl/open.2) `O_PATH` flag). In this case, `dirfd` can refer to any type of file, not just a directory, and the behavior of [`acl_get_file_at`](#acl_get_file_at)() is similar to that of [`acl_get_fd`](#acl_get_fd)().

[`AT_SYMLINK_NOFOLLOW`](#AT_SYMLINK_NOFOLLOW)

If `path_p` refers to a symbolic link, do not dereference it: instead, fail the operation and set the global variable `errno` to `ENOTSUP`. This indicates that the symbolic link cannot have ACLs.

# [RETURN VALUE](#RETURN_VALUE)

On success, the `acl_get_file`() and `acl_get_file_at`() functions return a pointer to the working storage. On error, a value of `(acl_t)NULL` is returned, and `errno` is set appropriately.

# [ERRORS](#ERRORS)

If any of the following conditions occur, the `acl_get_file`() and `acl_get_file_at`() functions return a value of `(acl_t)NULL` and set `errno` to the corresponding value:

\[[`EACCES`](#EACCES)]

Search permission is denied for a component of the path prefix or the object exists and the process does not have appropriate access rights.

Argument `type` specifies a type of ACL that cannot be associated with `path_p`.

\[[`EBADF`](#EBADF)]

The argument `path_p` is relative but the argument `dirfd` is neither `AT_FDCWD` nor a valid file descriptor.

\[[`EINVAL`](#EINVAL)]

The argument `type` is not `ACL_TYPE_ACCESS` or `ACL_TYPE_DEFAULT`.

An invalid flag was specified in the `at_flags` argument.

\[[`ENAMETOOLONG`](#ENAMETOOLONG)]

The length of the argument `path_p` is too long.

\[[`ENOENT`](#ENOENT)]

The named object does not exist or the argument `path_p` points to an empty string.

\[[`ENOMEM`](#ENOMEM)]

The ACL working storage requires more memory than is allowed by the hardware or system-imposed memory management constraints.

\[[`ENOTDIR`](#ENOTDIR)]

A component of the path prefix is not a directory.

The argument `path_p` is relative and the argument `dirfd` is a file descriptor referring to a file other than a directory.

\[[`ENOTSUP`](#ENOTSUP)]

The argument `at_flags` includes the flag `AT_SYMLINK_NOFOLLOW` and `path_p` is a symbolic link.

The file system on which the file identified by `path_p` is located does not support ACLs, or ACLs are disabled.

# [STANDARDS](#STANDARDS)

IEEE Std 1003.1e draft 17 (“POSIX.1e”, abandoned)

Function `acl_get_file_at`() is a Linux specific extension.

# [SEE ALSO](#SEE_ALSO)

[acl\_free(3)](/man/os/acl/acl_free.3), [acl\_get\_entry(3)](/man/os/acl/acl_get_entry.3), [acl\_get\_fd(3)](/man/os/acl/acl_get_fd.3), [acl\_set\_file(3)](/man/os/acl/acl_set_file.3), [acl(5)](/man/os/acl/acl.5)

# [AUTHOR](#AUTHOR)

Derived from the FreeBSD manual pages written by Robert N M Watson ⟨rwatson@FreeBSD.org⟩, and adapted for Linux by Andreas Gruenbacher ⟨andreas.gruenbacher@gmail.com⟩.

June 5, 2026 Linux ACL

---

Document: acl_get_file(3) from acl 2.4.0-r3 (Chainguard OS)
Source: https://git.savannah.nongnu.org/git/acl.git
