mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:54:58 +00:00
Kernel+LibC+LibCore+UE: Implement fchmodat(2)
This function is an extended version of `chmod(2)` that lets one control whether to dereference symlinks, and specify a file descriptor to a directory that will be used as the base for relative paths.
This commit is contained in:
parent
5f71925aa4
commit
182016d7c0
10 changed files with 64 additions and 14 deletions
|
@ -34,12 +34,30 @@ int mkdir(const char* pathname, mode_t mode)
|
|||
|
||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html
|
||||
int chmod(const char* pathname, mode_t mode)
|
||||
{
|
||||
return fchmodat(AT_FDCWD, pathname, mode, 0);
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchmodat.html
|
||||
int fchmodat(int dirfd, char const* pathname, mode_t mode, int flags)
|
||||
{
|
||||
if (!pathname) {
|
||||
errno = EFAULT;
|
||||
return -1;
|
||||
}
|
||||
int rc = syscall(SC_chmod, pathname, strlen(pathname), mode);
|
||||
|
||||
if (flags & ~AT_SYMLINK_NOFOLLOW) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Syscall::SC_chmod_params params {
|
||||
dirfd,
|
||||
{ pathname, strlen(pathname) },
|
||||
mode,
|
||||
!(flags & AT_SYMLINK_NOFOLLOW)
|
||||
};
|
||||
int rc = syscall(SC_chmod, ¶ms);
|
||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue