@node readlinkat
@subsection @code{readlinkat}
@findex readlinkat

POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/functions/readlinkat.html}

Gnulib module: readlinkat
@mindex readlinkat

Portability problems fixed by Gnulib:
@itemize
@item
This function is missing on some platforms:
glibc 2.3.6, Mac OS X 10.9, FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, Solaris 10, Cygwin 1.5.x, mingw, MSVC 14, Android 4.4.
But the replacement function is not safe to be used in libraries and is not multithread-safe.
@item
Some platforms mistakenly succeed on file names ending in @file{/}:
macOS 14.
@item
On some platforms, this function returns @code{int} instead of
@code{ssize_t}:
AIX 7.1.
@item
For the file name @file{/dev/null}, this function returns @file{\Device\Null},
which is unusable, on some platforms:
Cygwin 3.3.6.
@end itemize

Portability problems mostly fixed by Gnulib:
@itemize
@item
On some platforms, this function fails and sets @code{errno} to
@code{ERANGE} rather than returning truncated contents:
AIX 7.2.
The Gnulib replacement normally works as POSIX requires by returning
the truncated contents.  However, if the full link contents are
unreasonably large (more than 4000 bytes) the replacement clears the
entire buffer and returns the buffer size; although this is not a
complete fix, it suffices for typical callers, which ignore the buffer
contents anyway.
@end itemize

Portability problems not fixed by Gnulib:
@itemize
@item
This function always fails on platforms that don't support symlinks:
mingw, MSVC 14.
@item
When this function is called on a directory: In the case of NFS mounted
directories, Cygwin sets @code{errno} to @code{ENOENT} or @code{EIO} instead of
@code{EINVAL}.  To avoid this problem, check for a directory before calling
this function.
@item
When this function is called on a file that is not a symbolic link:
Cygwin may set errno to @code{EACCES} instead of @code{EINVAL}.
@item
When this function fails because it is called on an existing
non-directory's name concatenated to @file{/},
it sets @code{errno} to @code{EINVAL}:
AIX 7.2.
@item
When this function is called on an empty file name, it fails with error
@code{EBADF} instead of @code{ENOENT}:
@c https://cygwin.com/pipermail/cygwin/2023-April/253510.html
Cygwin 3.4.6.
@item
Symlink contents do not always have a trailing null byte, and there is
no indication if symlink contents were truncated if the return value
matches the length.  Furthermore,
Linux sets @code{errno} to @code{EINVAL} if the
requested length is zero.
@mindex areadlink
Use the gnulib module @code{areadlink} for
improved ability to read symlink contents.
@end itemize
