#include #include #include #include #include #include // flags is ignored for now syscallret syscall_fchmodat(int dirfd, const char* path, mode_t mode, int flags){ syscallret retv; retv.ret = -1; if(path > USER_SPACE_END){ retv.errno = EFAULT; return retv; } size_t len = strlen(path); char buff[len+1]; strcpy(buff, path); proc_t* proc = arch_getcls()->thread->proc; dirnode_t* target; fd_t* fd; if(dirfd != AT_FDCWD){ int err = fd_access(&proc->fdtable, &fd, dirfd); if(err){ retv.errno = err; return retv; } if(GETTYPE(fd->mode) != TYPE_DIR){ retv.errno = ENOTDIR; goto _fail; } target = fd->node; } else target = proc->cwd; vnode_t* node; retv.errno = vfs_open(&node, buff[0] == '/' ? proc->root : target, buff); if(retv.errno) goto _fail; retv.errno = vfs_chmod(node, mode); vfs_close(node); _fail: if(dirfd != AT_FDCWD) fd_release(fd); retv.ret = retv.errno ? -1 : 0; return retv; }