#include "Log.h" #include "memory/MemoryManager.h" #include "sys/Syscall.h" #include "thread/Scheduler.h" #include Result sys_unlinkat(Registers*, SyscallArgs args) { int dirfd = (int)args[0]; auto path = TRY(MemoryManager::strdup_from_user(args[1])); int flags = (int)args[2]; Thread* current = Scheduler::current(); PathParser parser = TRY(PathParser::create(path.chars())); auto dirname = TRY(parser.dirname()); auto basename = TRY(parser.basename()); if (basename.view() == ".") return err(EINVAL); kinfoln("unlinkat: remove %s from directory %s, dirfd is %d", basename.chars(), dirname.chars(), dirfd); auto inode = TRY(current->resolve_atfile(dirfd, dirname, false)); if (!VFS::can_write(inode, current->auth)) return err(EACCES); if (flags > 0) { auto child = TRY(inode->find(basename.chars())); if (child->type() != VFS::InodeType::Directory) return err(ENOTDIR); } TRY(inode->remove_entry(basename.chars())); return 0; }