NAME
readlink
readlinkat — read the
contents of a symbolic link relative to a directory file
descriptor
SYNOPSIS
#include
<unistd.h>
ssize_t readlink(const char *restrict path, char *restrict buf,
size_t bufsize);
ssize_t readlinkat(int fd, const char *restrict path,
char *restrict buf, size_t bufsize);
DESCRIPTION
The readlink () function shall place the
contents of the symbolic link referred to by path in the
buffer buf which has size bufsize. If
the number of bytes in the symbolic link is less than
bufsize, the contents of the remainder of
buf are unspecified. If the buf argument
is not large enough to contain the link content, the first
bufsize bytes shall be placed in
buf.
If the value of bufsize is greater than {SSIZE_MAX}, the result is implementation-defined.
Upon successful completion, readlink ()
shall mark for update the last data access timestamp of the symbolic
link.
The readlinkat () function shall be equivalent
to the readlink () function except in the case where
path specifies a relative path. In this case the symbolic
link whose content is read is relative to the directory associated with the
file descriptor fd instead of the current working
directory. If the file descriptor was opened without O_SEARCH, the function
shall check whether directory searches are permitted using the current
permissions of the directory underlying the file descriptor. If the file
descriptor was opened with O_SEARCH, the function shall not perform the
check.
If readlinkat () is passed the special value
AT_FDCWD in the fd parameter, the current working
directory is used and the behavior shall be identical to a call to
readlink ().
RETURN VALUE
Upon successful completion, readlink ()
shall return the count of bytes placed in the buffer. Otherwise, it shall
return a value of -1, leave the buffer unchanged, and set
errno to indicate the error.
Upon successful completion, the readlinkat () function shall return 0. Otherwise, it shall return -1 and set errno to indicate the error.
ERRORS
These functions shall fail if:
- [EACCES]
- Search permission is denied for a component of the path prefix of path .
- [EINVAL]
- The path argument names a file that is not a symbolic link.
- [EIO]
- An I/O error occurred while reading from the file system.
- [ELOOP]
- A loop exists in symbolic links encountered during resolution of the path argument.
- [ENAMETOOLONG]
- The length of a component of a pathname is longer than {NAME_MAX}.
- [ENOENT]
- A component of path does not name an existing file or path is an empty string.
- [ENOTDIR]
- A component of the path prefix is not a directory, or the path argument contains at least one non- <slash> character and ends with one or more trailing <slash> characters and the last pathname component names an existing file that is neither a directory nor a symbolic link to a directory.
The readlinkat () function shall fail if:
- [EACCES]
- fd was not opened with O_SEARCH and the permissions of the directory underlying fd do not permit directory searches.
- [EBADF]
- The path argument does not specify an absolute path and the fd argument is neither AT_FDCWD nor a valid file descriptor open for reading or searching.
These functions may fail if:
- [ELOOP]
- More than {SYMLOOP_MAX} symbolic links were encountered during resolution of the path argument.
- [ENAMETOOLONG]
- The length of a pathname exceeds {PATH_MAX}, or pathname resolution of a symbolic link produced an intermediate result with a length that exceeds {PATH_MAX}.
The readlinkat () function may fail if:
- [ENOTDIR]
- The path argument is not an absolute path and fd is neither AT_FDCWD nor a file descriptor associated with a directory.
EXAMPLES
Reading the Name of a Symbolic Link
The following example shows how to read the name of a symbolic link named /modules/pass1.
#include <unistd.h>
char buf[1024];
ssizet_t len;
...
if ((len = readlink("/modules/pass1", buf, sizeof(buf)-1)) != -1)
buf[len] = '\0';
APPLICATION USAGE
Conforming applications should not assume that the returned contents of the symbolic link are null-terminated.
RATIONALE
Since POSIX.1-2008 does not require any association of file times
with symbolic links, there is no requirement that file times be updated by
readlink (). The type associated with
bufsiz is a size_t in order to be
consistent with both the ISO C standard and the definition of
read(3). The behavior specified for
readlink () when bufsiz is zero
represents historical practice. For this case, the standard developers
considered a change whereby readlink () would return
the number of non-null bytes contained in the symbolic link with the buffer
buf remaining unchanged; however, since the
stat
structure member
st_size
value can be used to determine the size of buffer necessary to contain the
contents of the symbolic link as returned by
readlink (), this proposal was rejected, and the
historical practice retained.
The purpose of the readlinkat () function is to
read the content of symbolic links in directories other than the current
working directory without exposure to race conditions. Any part of the path
of a file could be changed in parallel to a call to
readlink (), resulting in unspecified behavior. By
opening a file descriptor for the target directory and using the
readlinkat () function it can be guaranteed that the
symbolic link read is located relative to the desired directory.
FUTURE DIRECTIONS
None.
SEE ALSO
XBD <unistd.h>
CHANGE HISTORY
First released in Issue 4, Version 2.
Issue 5
Moved from X/OPEN UNIX extension to BASE.
Issue 6
The return type is changed to ssize_t, to align with the IEEE P1003.1a draft standard.
The following new requirements on POSIX implementations derive from alignment with the Single UNIX Specification:
- This function is made mandatory.
- In this function it is possible for the return value to exceed the range of the type ssize_t (since size_t has a larger range of positive values than ssize_t). A sentence restricting the size of the size_t object is added to the description to resolve this conflict.
The following changes are made for alignment with the ISO POSIX-1:1996 standard:
- The FUTURE DIRECTIONS section is changed to None.
The following changes were made to align with the IEEE P1003.1a draft standard:
- The [ELOOP] optional error condition is added.
The
restrict keyword
is added to the readlink () prototype for alignment
with the ISO/IEC 9899:1999
(“ISO C99”) standard.
Issue 7
Austin Group Interpretation 1003.1-2001 #143 is applied.
SD5-XSH-ERN-189 is applied, updating the ERRORS section.
The readlinkat () function is added from The Open Group Technical Standard, 2006, Extended API Set Part 2.
The [EACCES] error is removed from the ``may fail'' error conditions.
Changes are made to allow a directory to be opened for searching.
The [ENOTDIR] error condition is clarified to cover the condition where the last component of a pathname exists but is not a directory or a symbolic link to a directory.