options/ansi: Implemented renameat() (#69)

* options/ansi: Implemented renameat()

Signed-off-by: Dennisbonke <admin@dennisbonke.com>
This commit is contained in:
Dennis Bonke 2020-04-25 22:08:26 +02:00 committed by GitHub
parent 97f459dfa4
commit 4a71593226
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 4 deletions

View file

@ -199,8 +199,16 @@ int rename(const char *path, const char *new_path) {
return 0; return 0;
} }
int renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_path) { int renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_path) {
__ensure(!"Not implemented"); if(!mlibc::sys_renameat) {
__builtin_unreachable(); MLIBC_MISSING_SYSDEP();
errno = ENOSYS;
return -1;
}
if(int e = mlibc::sys_renameat(olddirfd, old_path, newdirfd, new_path); e) {
errno = e;
return -1;
}
return 0;
} }
FILE *tmpfile(void) { FILE *tmpfile(void) {
__ensure(!"Not implemented"); __ensure(!"Not implemented");

View file

@ -117,6 +117,7 @@ int sys_close(int fd);
[[gnu::weak]] int sys_mkdirat(int dirfd, const char *path, mode_t mode); [[gnu::weak]] int sys_mkdirat(int dirfd, const char *path, mode_t mode);
[[gnu::weak]] int sys_symlink(const char *target_path, const char *link_path); [[gnu::weak]] int sys_symlink(const char *target_path, const char *link_path);
[[gnu::weak]] int sys_rename(const char *path, const char *new_path); [[gnu::weak]] int sys_rename(const char *path, const char *new_path);
[[gnu::weak]] int sys_renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_path);
[[gnu::weak]] int sys_fcntl(int fd, int request, va_list args, int *result); [[gnu::weak]] int sys_fcntl(int fd, int request, va_list args, int *result);
[[gnu::weak]] int sys_ttyname(int fd, char *buf, size_t size); [[gnu::weak]] int sys_ttyname(int fd, char *buf, size_t size);
[[gnu::weak]] int sys_fadvise(int fd, off_t offset, off_t length, int advice); [[gnu::weak]] int sys_fadvise(int fd, off_t offset, off_t length, int advice);

View file

@ -248,14 +248,20 @@ int sys_symlink(const char *target_path, const char *link_path) {
} }
int sys_rename(const char *path, const char *new_path) { int sys_rename(const char *path, const char *new_path) {
return sys_renameat(AT_FDCWD, path, AT_FDCWD, new_path);
}
int sys_renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_path) {
SignalGuard sguard; SignalGuard sguard;
HelAction actions[3]; HelAction actions[3];
globalQueue.trim(); globalQueue.trim();
managarm::posix::CntRequest<MemoryAllocator> req(getSysdepsAllocator()); managarm::posix::CntRequest<MemoryAllocator> req(getSysdepsAllocator());
req.set_request_type(managarm::posix::CntReqType::RENAME); req.set_request_type(managarm::posix::CntReqType::RENAMEAT);
req.set_path(frg::string<MemoryAllocator>(getSysdepsAllocator(), path)); req.set_path(frg::string<MemoryAllocator>(getSysdepsAllocator(), old_path));
req.set_target_path(frg::string<MemoryAllocator>(getSysdepsAllocator(), new_path)); req.set_target_path(frg::string<MemoryAllocator>(getSysdepsAllocator(), new_path));
req.set_fd(olddirfd);
req.set_newfd(newdirfd);
frg::string<MemoryAllocator> ser(getSysdepsAllocator()); frg::string<MemoryAllocator> ser(getSysdepsAllocator());
req.SerializeToString(&ser); req.SerializeToString(&ser);