ladybird/Base/usr/share/man/man2/readlink.md
Tim Schumacher d43a7eae54 LibCore: Rename File to DeprecatedFile
As usual, this removes many unused includes and moves used includes
further down the chain.
2023-02-13 00:50:07 +00:00

69 lines
1.8 KiB
Markdown

## Name
readlink - get symlink target
## Synopsis
```**c++
#include <unistd.h>
ssize_t readlink(const char* path, char* buffer, size_t size)
```
## Description
`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.
## Return value
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.
## Notes
The underlying system call always returns the full size of the target path on
success, not the number of bytes written. `Core::DeprecatedFile::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::DeprecatedFile::read_link()`
instead.
## Examples
The following example demonstrates how one could implement an alternative
version of `getpid(2)` which reads the calling process ID from ProcFS:
```c++
#include <LibCore/DeprecatedFile.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;
buffer[rc] = 0;
return atoi(buffer);
}
pid_t read_pid_using_core_file()
{
auto target = Core::DeprecatedFile::read_link("/proc/self");
if (target.is_null())
return -1;
auto pid = target.to_uint();
ASSERT(pid.has_value());
return pid.value();
}
```
## See also
* [`readlink`(1)](help://man/1/readlink)