---
name: "readdir"
section: "2"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/readdir"
---

# readdir(2)

read directory entry

## NAME

readdir - read directory entry

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <sys/syscall.h>      /* Definition of SYS_* constants */
#include <unistd.h>
```

**int syscall(SYS\_readdir, unsigned int** *fd***,**             **struct old\_linux\_dirent \****dirp***, unsigned int** *count***);**

*Note*: There is no definition of **struct old\_linux\_dirent**; see VERSIONS.

## DESCRIPTION

This is not the function you are interested in. Look at [**readdir**(3)](/readdir/3.md) for the POSIX conforming C library interface. This page documents the bare kernel system call interface, which is superseded by [**getdents**(2)](/getdents/2.md).

**readdir**() reads one *old\_linux\_dirent* structure from the directory referred to by the file descriptor *fd* into the buffer pointed to by *dirp*. The argument *count* is ignored; at most one *old\_linux\_dirent* structure is read.

The *old\_linux\_dirent* structure is declared (privately in Linux kernel file **fs/readdir.c**) as follows:

```
struct old_linux_dirent {
    unsigned long d_ino;     /* inode number */
    unsigned long d_offset;  /* offset to this old_linux_dirent */
    unsigned short d_namlen; /* length of this d_name */
    char  d_name[1];         /* filename (null-terminated) */
}
```

*d\_ino* is an inode number. *d\_offset* is the distance from the start of the directory to this *old\_linux\_dirent*. *d\_reclen* is the size of *d\_name*, not counting the terminating null byte ('\\0'). *d\_name* is a null-terminated filename.

## RETURN VALUE

On success, 1 is returned. On end of directory, 0 is returned. On error, -1 is returned, and *errno* is set to indicate the error.

## ERRORS

- **EBADF**

  Invalid file descriptor *fd*.

- **EFAULT**

  Argument points outside the calling process's address space.

- **EINVAL**

  Result buffer is too small.

- **ENOENT**

  No such directory.

- **ENOTDIR**

  File descriptor does not refer to a directory.

## VERSIONS

You will need to define the *old\_linux\_dirent* structure yourself. However, probably you should use [**readdir**(3)](/readdir/3.md) instead.

This system call does not exist on x86-64.

## STANDARDS

Linux.

## SEE ALSO

[**getdents**(2)](/getdents/2.md), [**readdir**(3)](/readdir/3.md)
