faccessat - Linux


Overview

faccessat evaluates file access permissions for a given file relative to a root directory. It provides a more versatile alternative to access(), allowing access checks for files within a specified hierarchy.

Syntax

faccessat(int dirfd, const char *pathname, int mode)

Options/Flags

  • dirfd: File descriptor of the root directory. Use AT_FDCWD to refer to the current working directory.
  • pathname: Path to the file relative to dirfd.
  • mode: Access permissions to check. Use bitwise OR of one or more of the following:
    • F_OK: Check if file exists.
    • R_OK: Check read access.
    • W_OK: Check write access.
    • X_OK: Check execute access.

Examples

Simple Permission Check:

#include <fcntl.h>

int main() {
  int fd = open("/", O_RDONLY);
  if (faccessat(fd, "myfile.txt", F_OK) == 0)
    printf("myfile.txt exists\n");
  close(fd);
  return 0;
}

Checking Read and Execute Access with Hierarchy:

#include <fcntl.h>
#include <unistd.h>

int main() {
  int fd = open(".", O_RDONLY);
  if (faccessat(fd, "bin/ls", R_OK | X_OK) == 0)
    execlp("bin/ls", "bin/ls", NULL);
  close(fd);
  return 0;
}

Common Issues

  • Ensure the file descriptor for the root directory is valid and refers to an accessible directory.
  • Check for potential race conditions, as the file may change between the permission check and subsequent action.

Integration

Combination with chdir(): Change the root directory for file access checks using chdir() before calling faccessat.

chdir("/dir/of/myfile");
faccessat(AT_FDCWD, "myfile", R_OK);

Related Commands

  • access(): Checks file access permissions.
  • opendir(): Opens a directory for reading.
  • readdir(): Reads entries from a directory.
  • Linux File Permissions