mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 07:58:11 +00:00
Kernel+LibC+LibCore: Implement renameat(2)
Now with the ability to specify different bases for the old and new paths.
This commit is contained in:
parent
eb5389e933
commit
d5fbdf1866
7 changed files with 17 additions and 6 deletions
|
@ -418,7 +418,9 @@ struct SC_symlink_params {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SC_rename_params {
|
struct SC_rename_params {
|
||||||
|
int olddirfd;
|
||||||
StringArgument old_path;
|
StringArgument old_path;
|
||||||
|
int newdirfd;
|
||||||
StringArgument new_path;
|
StringArgument new_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -577,14 +577,14 @@ ErrorOr<void> VirtualFileSystem::chmod(Credentials const& credentials, StringVie
|
||||||
return chmod(credentials, custody, mode);
|
return chmod(credentials, custody, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> VirtualFileSystem::rename(Credentials const& credentials, StringView old_path, StringView new_path, Custody& base)
|
ErrorOr<void> VirtualFileSystem::rename(Credentials const& credentials, Custody& old_base, StringView old_path, Custody& new_base, StringView new_path)
|
||||||
{
|
{
|
||||||
RefPtr<Custody> old_parent_custody;
|
RefPtr<Custody> old_parent_custody;
|
||||||
auto old_custody = TRY(resolve_path(credentials, old_path, base, &old_parent_custody, O_NOFOLLOW_NOERROR));
|
auto old_custody = TRY(resolve_path(credentials, old_path, old_base, &old_parent_custody, O_NOFOLLOW_NOERROR));
|
||||||
auto& old_inode = old_custody->inode();
|
auto& old_inode = old_custody->inode();
|
||||||
|
|
||||||
RefPtr<Custody> new_parent_custody;
|
RefPtr<Custody> new_parent_custody;
|
||||||
auto new_custody_or_error = resolve_path(credentials, new_path, base, &new_parent_custody);
|
auto new_custody_or_error = resolve_path(credentials, new_path, new_base, &new_parent_custody);
|
||||||
if (new_custody_or_error.is_error()) {
|
if (new_custody_or_error.is_error()) {
|
||||||
if (new_custody_or_error.error().code() != ENOENT || !new_parent_custody)
|
if (new_custody_or_error.error().code() != ENOENT || !new_parent_custody)
|
||||||
return new_custody_or_error.release_error();
|
return new_custody_or_error.release_error();
|
||||||
|
|
|
@ -67,7 +67,7 @@ public:
|
||||||
ErrorOr<InodeMetadata> lookup_metadata(Credentials const&, StringView path, Custody& base, int options = 0);
|
ErrorOr<InodeMetadata> lookup_metadata(Credentials const&, StringView path, Custody& base, int options = 0);
|
||||||
ErrorOr<void> utime(Credentials const&, StringView path, Custody& base, time_t atime, time_t mtime);
|
ErrorOr<void> utime(Credentials const&, StringView path, Custody& base, time_t atime, time_t mtime);
|
||||||
ErrorOr<void> utimensat(Credentials const&, StringView path, Custody& base, timespec const& atime, timespec const& mtime, int options = 0);
|
ErrorOr<void> utimensat(Credentials const&, StringView path, Custody& base, timespec const& atime, timespec const& mtime, int options = 0);
|
||||||
ErrorOr<void> rename(Credentials const&, StringView oldpath, StringView newpath, Custody& base);
|
ErrorOr<void> rename(Credentials const&, Custody& old_base, StringView oldpath, Custody& new_base, StringView newpath);
|
||||||
ErrorOr<void> mknod(Credentials const&, StringView path, mode_t, dev_t, Custody& base);
|
ErrorOr<void> mknod(Credentials const&, StringView path, mode_t, dev_t, Custody& base);
|
||||||
ErrorOr<NonnullRefPtr<Custody>> open_directory(Credentials const&, StringView path, Custody& base);
|
ErrorOr<NonnullRefPtr<Custody>> open_directory(Credentials const&, StringView path, Custody& base);
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ ErrorOr<FlatPtr> Process::sys$rename(Userspace<Syscall::SC_rename_params const*>
|
||||||
auto params = TRY(copy_typed_from_user(user_params));
|
auto params = TRY(copy_typed_from_user(user_params));
|
||||||
auto old_path = TRY(get_syscall_path_argument(params.old_path));
|
auto old_path = TRY(get_syscall_path_argument(params.old_path));
|
||||||
auto new_path = TRY(get_syscall_path_argument(params.new_path));
|
auto new_path = TRY(get_syscall_path_argument(params.new_path));
|
||||||
TRY(VirtualFileSystem::the().rename(credentials(), old_path->view(), new_path->view(), current_directory()));
|
TRY(VirtualFileSystem::the().rename(credentials(), TRY(custody_for_dirfd(params.olddirfd)), old_path->view(), TRY(custody_for_dirfd(params.newdirfd)), new_path->view()));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1125,12 +1125,18 @@ int fclose(FILE* stream)
|
||||||
|
|
||||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html
|
||||||
int rename(char const* oldpath, char const* newpath)
|
int rename(char const* oldpath, char const* newpath)
|
||||||
|
{
|
||||||
|
return renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/renameat.html
|
||||||
|
int renameat(int olddirfd, char const* oldpath, int newdirfd, char const* newpath)
|
||||||
{
|
{
|
||||||
if (!oldpath || !newpath) {
|
if (!oldpath || !newpath) {
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
Syscall::SC_rename_params params { { oldpath, strlen(oldpath) }, { newpath, strlen(newpath) } };
|
Syscall::SC_rename_params params { olddirfd, { oldpath, strlen(oldpath) }, newdirfd, { newpath, strlen(newpath) } };
|
||||||
int rc = syscall(SC_rename, ¶ms);
|
int rc = syscall(SC_rename, ¶ms);
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,7 @@ int setvbuf(FILE*, char* buf, int mode, size_t);
|
||||||
void setbuf(FILE*, char* buf);
|
void setbuf(FILE*, char* buf);
|
||||||
void setlinebuf(FILE*);
|
void setlinebuf(FILE*);
|
||||||
int rename(char const* oldpath, char const* newpath);
|
int rename(char const* oldpath, char const* newpath);
|
||||||
|
int renameat(int olddirfd, char const* oldpath, int newdirfd, char const* newpath);
|
||||||
FILE* tmpfile(void);
|
FILE* tmpfile(void);
|
||||||
char* tmpnam(char*);
|
char* tmpnam(char*);
|
||||||
FILE* popen(char const* command, char const* type);
|
FILE* popen(char const* command, char const* type);
|
||||||
|
|
|
@ -920,7 +920,9 @@ ErrorOr<void> rename(StringView old_path, StringView new_path)
|
||||||
|
|
||||||
#ifdef AK_OS_SERENITY
|
#ifdef AK_OS_SERENITY
|
||||||
Syscall::SC_rename_params params {
|
Syscall::SC_rename_params params {
|
||||||
|
.olddirfd = AT_FDCWD,
|
||||||
.old_path = { old_path.characters_without_null_termination(), old_path.length() },
|
.old_path = { old_path.characters_without_null_termination(), old_path.length() },
|
||||||
|
.newdirfd = AT_FDCWD,
|
||||||
.new_path = { new_path.characters_without_null_termination(), new_path.length() },
|
.new_path = { new_path.characters_without_null_termination(), new_path.length() },
|
||||||
};
|
};
|
||||||
int rc = syscall(SC_rename, ¶ms);
|
int rc = syscall(SC_rename, ¶ms);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue