1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 06:47:34 +00:00

LibC: Properly implement the futimens function

Use the new futimens syscall to ensure futimens can actually work.
This change for example allows a user to run "touch non-existing-file"
without getting any error, as expected.
This commit is contained in:
Liav A 2023-04-08 11:39:28 +03:00 committed by Andreas Kling
parent cbf78975f1
commit d05d938e73
3 changed files with 42 additions and 7 deletions

View file

@ -6,6 +6,7 @@
*/
#include <bits/pthread_cancel.h>
#include <bits/utimens.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@ -127,11 +128,18 @@ int utimensat(int dirfd, char const* path, struct timespec const times[2], int f
errno = EFAULT;
return -1;
}
return __utimens(dirfd, path, times, flag);
}
size_t path_length = strlen(path);
if (path_length > INT32_MAX) {
errno = EINVAL;
return -1;
int __utimens(int fd, char const* path, struct timespec const times[2], int flag)
{
size_t path_length = 0;
if (path) {
path_length = strlen(path);
if (path_length > INT32_MAX) {
errno = EINVAL;
return -1;
}
}
// POSIX allows AT_SYMLINK_NOFOLLOW flag or no flags.
@ -161,8 +169,16 @@ int utimensat(int dirfd, char const* path, struct timespec const times[2], int f
}
}
Syscall::SC_utimensat_params params { dirfd, { path, path_length }, times, flag };
int rc = syscall(SC_utimensat, &params);
int rc = 0;
if (path) {
// NOTE: fd is treated as dirfd for this syscall.
Syscall::SC_utimensat_params params { fd, { path, path_length }, times, flag };
rc = syscall(SC_utimensat, &params);
} else {
Syscall::SC_futimens_params params { fd, times };
rc = syscall(SC_futimens, &params);
}
__RETURN_WITH_ERRNO(rc, rc, -1);
}
}