readlink - get symlink target
#include <unistd.h>
ssize_t readlink(const char* path, char* buffer, size_t size)
readlink()
writes up to size
bytes of the target path of a symbolic link at the specified path
to the given buffer
. readlink()
does not null-terminate the buffer. If the target of the link is longer than size
bytes, it will get truncated.
On success, readlink()
returns the number of bytes written to the buffer, which is always less or equal to the specified size
. Otherwise, it returns -1 and sets errno
to describe the error.
The underlying system call always returns the full size of the target path on success, not the number of bytes written. Core::File::read_link()
makes use of this to provide an alternative way to read links that doesn't require the caller to pick a buffer size and allocate a buffer straight up.
Since it's essentially impossible to guess the right buffer size for reading links, it's strongly recommended that everything uses Core::File::read_link()
instead.
The following example demonstrates how one could implement an alternative version of getpid(2)
which reads the calling process ID from ProcFS:
#include <LibCore/File.h>
#include <unistd.h>
pid_t read_pid_using_readlink()
{
char buffer[64];
int rc = readlink("/proc/self", buffer, sizeof(buffer) - 1);
if (rc < 0)
return rc;
[rc] = 0;
bufferreturn atoi(buffer);
}
pid_t read_pid_using_core_file()
{
auto target = Core::File::read_link("/proc/self");
if (target.is_null())
return -1;
auto pid = target.to_uint();
(pid.has_value());
ASSERTreturn pid.value();
}