Next: readlinkat, Previous: read, Up: Functions in <unistd.h>   [Contents][Index]


10.69.69 readlink ¶

POSIX specification:
https://pubs.opengroup.org/onlinepubs/9799919799/functions/readlink.html

Gnulib module: readlink

Portability problems fixed by Gnulib:

  • This function is missing on some platforms: mingw, MSVC 14.
  • Some platforms mistakenly succeed on file names ending in /: FreeBSD 7.2, Solaris 9, macOS 14.
  • On some platforms, this function returns int instead of ssize_t: glibc 2.4, FreeBSD 6.0, OpenBSD 7.5, Cygwin 1.5.x, AIX 7.1.
  • For the file name /dev/null, this function returns \Device\Null, which is unusable, on some platforms: Cygwin 3.3.6.

Portability problems mostly fixed by Gnulib:

  • On some platforms, this function fails and sets errno to ERANGE rather than returning truncated contents: AIX 7.2, HP-UX 11. 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.

Portability problems not fixed by Gnulib:

  • This function always fails on platforms that don’t support symlinks: mingw, MSVC 14.
  • When this function is called on a directory: In the case of NFS mounted directories, Cygwin sets errno to ENOENT or EIO instead of EINVAL. To avoid this problem, check for a directory before calling this function.
  • When this function is called on a file that is not a symbolic link: Cygwin may set errno to EACCES instead of EINVAL.
  • When this function fails because it is called on an existing non-directory’s name concatenated to /, it sets errno to EINVAL: AIX 7.2.
  • 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 errno to EINVAL if the requested length is zero. Use the gnulib module areadlink for improved ability to read symlink contents.

Next: readlinkat, Previous: read, Up: Functions in <unistd.h>   [Contents][Index]