Manpages - realpath.3

Table of Contents

NAME

realpath - return the canonicalized absolute pathname

SYNOPSIS

  #include <limits.h>
  #include <stdlib.h>

  char *realpath(const char *restrict path,
   char *restrict resolved_path);

Feature Test Macro Requirements for glibc (see *feature_test_macros*(7)):

*realpath*():

      _XOPEN_SOURCE >= 500
          || /* Glibc since 2.19: */ _DEFAULT_SOURCE
          || /* Glibc <= 2.19: */ _BSD_SOURCE

DESCRIPTION

realpath*() expands all symbolic links and resolves references to ., .. and extra ’’ characters in the null-terminated string named by /path to produce a canonicalized absolute pathname. The resulting pathname is stored as a null-terminated string, up to a maximum of *PATH_MAX bytes, in the buffer pointed to by resolved_path. The resulting path will have no symbolic link, . or .. components.

If resolved_path is specified as NULL, then realpath*() uses *malloc*(3) to allocate a buffer of up to *PATH_MAX bytes to hold the resolved pathname, and returns a pointer to this buffer. The caller should deallocate this buffer using *free*(3).

RETURN VALUE

If there is no error, *realpath*() returns a pointer to the resolved_path.

Otherwise, it returns NULL, the contents of the array resolved_path are undefined, and errno is set to indicate the error.

ERRORS

EACCES
Read or search permission was denied for a component of the path prefix.
EINVAL
path is NULL. (In glibc versions before 2.3, this error is also returned if resolved_path is NULL.)
EIO
An I/O error occurred while reading from the filesystem.
ELOOP
Too many symbolic links were encountered in translating the pathname.
ENAMETOOLONG
A component of a pathname exceeded NAME_MAX characters, or an entire pathname exceeded PATH_MAX characters.
ENOENT
The named file does not exist.
ENOMEM
Out of memory.
ENOTDIR
A component of the path prefix is not a directory.

ATTRIBUTES

For an explanation of the terms used in this section, see *attributes*(7).

Interface Attribute Value
*realpath*() Thread safety MT-Safe

CONFORMING TO

4.4BSD, POSIX.1-2001.

POSIX.1-2001 says that the behavior if resolved_path is NULL is implementation-defined. POSIX.1-2008 specifies the behavior described in this page.

NOTES

In 4.4BSD and Solaris, the limit on the pathname length is MAXPATHLEN (found in <sys/param.h>). SUSv2 prescribes PATH_MAX and NAME_MAX, as found in <limits.h> or provided by the *pathconf*(3) function. A typical source fragment would be

  #ifdef PATH_MAX
    path_max = PATH_MAX;
  #else
    path_max = pathconf(path, _PC_PATH_MAX);
    if (path_max <= 0)
      path_max = 4096;
  #endif

(But see the BUGS section.)

GNU extensions

If the call fails with either EACCES or ENOENT and resolved_path is not NULL, then the prefix of path that is not readable or does not exist is returned in resolved_path.

BUGS

The POSIX.1-2001 standard version of this function is broken by design, since it is impossible to determine a suitable size for the output buffer, resolved_path. According to POSIX.1-2001 a buffer of size PATH_MAX suffices, but PATH_MAX need not be a defined constant, and may have to be obtained using pathconf*(3). And asking *pathconf*(3) does not really help, since, on the one hand POSIX warns that the result of *pathconf*(3) may be huge and unsuitable for mallocing memory, and on the other hand *pathconf*(3) may return -1 to signify that *PATH_MAX is not bounded. The resolved_path == NULL feature, not standardized in POSIX.1-2001, but standardized in POSIX.1-2008, allows this design problem to be avoided.

SEE ALSO

*realpath*(1), *readlink*(2), *canonicalize_file_name*(3), *getcwd*(3), *pathconf*(3), *sysconf*(3)

COLOPHON

This page is part of release 5.13 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/.

Author: dt

Created: 2022-02-20 Sun 18:13