.\" $NetBSD: dirent.3,v 1.7 2021/08/12 20:25:26 andvar Exp $
.\"
.\" Copyright (c) 1983, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. 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.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
.\"
.\" @(#)dir.5 8.3 (Berkeley) 4/19/94
.\"
.Dd September 7, 2019
.Dt DIRENT 3
.Os
.Sh NAME
.Nm dirent
.Nd directory format
.Sh SYNOPSIS
.In sys/types.h
.In sys/dirent.h
.Ft mode
.Fn DTTOIF "dirtype"
.Ft dirtype
.Fn IFTODT "mode"
.Sh DESCRIPTION
Directories provide a convenient hierarchical method of grouping
files while obscuring the underlying details of the storage medium.
A directory file is differentiated from a plain file
by a flag in its
.Xr inode 5
entry.
It consists of records (directory entries) each of which contains
information about a file and a pointer to the file itself.
Directory entries may contain other directories
as well as plain files; such nested directories are referred to as
subdirectories.
A hierarchy of directories and files is formed in this manner
and is called a file system (or referred to as a file system tree).
.\" An entry in this tree,
.\" nested or not nested,
.\" is a pathname.
.Pp
Each directory file contains two special directory entries; one is a pointer
to the directory itself
called dot
.Ql \&.
and the other a pointer to its parent directory called dot-dot
.Ql \&.. .
Dot and dot-dot
are valid pathnames, however,
the system root directory
.Ql / ,
has no parent and dot-dot points to itself like dot.
.Pp
File system nodes are ordinary directory files on which has
been grafted a file system object, such as a physical disk or a
partitioned area of such a disk.
(See
.Xr mount 8 . )
.Sh IMPLEMENTATION NOTES
The directory entry format is defined in the file
.In sys/dirent.h ,
which is also included by
.In dirent.h .
The format is represented by the
.Em dirent
structure, which contains the following entries:
.Bd -literal -offset indent
ino_t d_fileno;
uint16_t d_reclen;
uint16_t d_namlen;
uint8_t d_type;
char d_name[MAXNAMLEN + 1];
.Ed
.Pp
These are:
.Bl -enum -offset indent
.It
The
.Fa d_fileno
entry is a number which is unique for each
distinct file in the filesystem.
Files that are linked by hard links (see
.Xr link 2 )
have the same
.Fa d_fileno .
If
.Fa d_fileno
is zero, the entry refers to a deleted file.
The type
.Va ino_t
is defined in
.In sys/types.h .
.It
The
.Fa d_reclen
entry is the length, in bytes, of the directory record.
.It
The
.Fa d_namlen
entry specifies the length of the file name excluding the NUL.
Thus the actual size of
.Fa d_name
may vary from 1 to
.Dv MAXNAMLEN
\&+ 1.
.It
The
.Fa d_type
is the type of the file.
.It
The
.Fa d_name
entry contains a NUL-terminated file name.
.El
.Pp
The following table lists the types available for
.Vt d_type
and the corresponding ones used in the
.Em struct stat
(see
.Xr stat 2 ) ,
respectively:
.Pp
.Bl -column -offset indent -compact \
"DT_UNKNOWN " "DT_UNKNOWN " "DT_UNKNOWN "
.It Sy Dirent Ta Sy Stat Ta Sy Description
.It Dv DT_UNKNOWN Ta - Ta unknown file type
.It Dv DT_FIFO Ta Dv S_IFIFO Ta named pipe
.It Dv DT_CHR Ta Dv S_IFCHR Ta character device
.It Dv DT_DIR Ta Dv S_IFDIR Ta directory
.It Dv DT_BLK Ta Dv S_IFBLK Ta block device
.It Dv DT_REG Ta Dv S_IFREG Ta regular file
.It Dv DT_LNK Ta Dv S_IFLNK Ta symbolic link
.It Dv DT_SOCK Ta Dv S_IFSOCK Ta UNIX domain socket
.It Dv DT_WHT Ta Dv S_IFWHT Ta dummy Dq whiteout inode
.El
.Pp
The
.Dv DT_WHT
type is internal to the implementation and
should not be seen in normal user applications.
The macros
.Fn DTTOIF
and
.Fn IFTODT
can be used to convert from
.Em struct dirent
types to
.Em struct stat
types, and vice versa.
.Sh COMPATIBILITY
The
.St -p1003.1-2001
standard specifies only the fields
.Va d_ino
and
.Va d_name .
The remaining fields are available on many, but not all systems.
.Pp
Furthermore, the standard leaves the size of
.Va d_name
as unspecified, mentioning only that the number of
bytes preceding the terminating NUL shall not exceed
.Dv NAME_MAX .
Because of this, and because the
.Va d_namlen
field may not be present, a portable application should determine the size of
.Va d_name
by using
.Xr strlen 3
instead of applying the
.Fn sizeof
operator.
.Sh SEE ALSO
.Xr getdents 2 ,
.Xr fs 5 ,
.Xr inode 5
.\" .Sh STANDARDS
.\"
.\" XXX: Conformance is unclear, cf. PR lib/43310.
.\"
.\" Given the noted limitations, the
.\".In dirent.h
.\" header conforms to
.\" .St -p1003.1-2001 .
.Sh HISTORY
A
directory file format appeared in
.At v1 .
The
.Em dirent
structure appeared in
.Bx 4.3 reno .