| @node readlinkat |
| @section @code{readlinkat} |
| @findex readlinkat |
| |
| POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlinkat.html} |
| |
| Gnulib module: readlinkat |
| |
| Portability problems fixed by Gnulib: |
| @itemize |
| @item |
| This function is missing on some platforms: |
| glibc 2.3.6, Mac OS X < 10.10, FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, 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 @code{readlink("link/",buf,len)}: |
| Mac OS X 10.10. |
| @item |
| On some platforms, @code{readlinkat} returns @code{int} instead of |
| @code{ssize_t}: |
| AIX 7.1. |
| @item |
| @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 @code{readlink} 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 |
| @code{readlink}. |
| @item |
| When @code{readlink} is called on a file that is not a symbolic link: |
| IRIX may set @code{errno} to @code{ENXIO} instead of @code{EINVAL}. Cygwin |
| may set errno to @code{EACCES} instead of @code{EINVAL}. |
| @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, AIX 5.1 and HP-UX 11 set |
| @code{errno} to @code{ERANGE} rather than returning truncated |
| contents, and Linux sets @code{errno} to @code{EINVAL} if the |
| requested length is zero. Use the gnulib module @code{areadlink} for |
| improved ability to read symlink contents. |
| @end itemize |