| READLINK(2) | System Calls Manual | READLINK(2) | 
readlink, readlinkat —
#include <unistd.h>
ssize_t
  
  readlink(const
    char * restrict path,
    char * restrict buf,
    size_t bufsiz);
ssize_t
  
  readlinkat(int
    fd, const char * restrict
    path, char * restrict
    buf, size_t
    bufsiz);
readlink() places the contents of the symbolic link
  path in the buffer buf, which has
  size bufsiz. readlink() does not
  append a NUL character to buf.
readlinkat() works the same way as
    readlink() except if path is
    relative. In that case, it is looked up from a directory whose file
    descriptor was passed as fd. Search permission is
    required on this directory. fd can be set to
    AT_FDCWD in order to specify the current
  directory.
#include <limits.h>
#include <unistd.h>
char buf[PATH_MAX];
ssize_t len;
if ((len = readlink("/symbolic/link", buf, sizeof(buf)-1)) == -1)
	error handling;
buf[len] = '\0';
readlink() and readlinkat() will
  fail if:
EACCES]EFAULT]EINVAL]EIO]ELOOP]ENAMETOOLONG]NAME_MAX}
      characters, or an entire path name exceeded
      {PATH_MAX} characters.ENOENT]ENOTDIR]In addition, readlinkat() will fail
  if:
readlink() function conforms to
  IEEE Std 1003.1-2001 (“POSIX.1”).
  readlinkat() conforms to IEEE Std
  1003.1-2008 (“POSIX.1”).
readlink() function appeared in
  4.2BSD. The type returned was changed from
  int to ssize_t in
  NetBSD 2.1.
| July 28, 2013 | NetBSD 10.0 |