Kernel, libc: Implement umask()

This commit is contained in:
apio 2022-10-30 19:55:38 +01:00
parent 0d443385e9
commit 52d4f34f05
8 changed files with 22 additions and 6 deletions

View File

@ -30,6 +30,7 @@
#define SYS_dup2 24
#define SYS_setuid 25
#define SYS_setgid 26
#define SYS_umask 27
struct stat;
struct pstat;
@ -67,4 +68,5 @@ void sys_getdents(Context* context, int fd, struct luna_dirent* buf, size_t coun
void sys_stat(Context* context, const char* path, struct stat* buf);
void sys_dup2(Context* context, int fd, int fd2);
void sys_setuid(Context* context, int new_uid, int new_euid);
void sys_setgid(Context* context, int new_gid, int new_egid);
void sys_setgid(Context* context, int new_gid, int new_egid);
void sys_umask(Context* context, mode_t cmask);

View File

@ -81,6 +81,8 @@ struct Task
char name[128];
mode_t umask;
BlockReason block_reason;
union {

View File

@ -40,6 +40,7 @@ void Syscall::entry(Context* context)
case SYS_dup2: sys_dup2(context, (int)context->rdi, (int)context->rsi); break;
case SYS_setuid: sys_setuid(context, (int)context->rdi, (int)context->rsi); break;
case SYS_setgid: sys_setgid(context, (int)context->rdi, (int)context->rsi); break;
case SYS_umask: sys_umask(context, (mode_t)context->rdi); break;
default: context->rax = -ENOSYS; break;
}
VMM::exit_syscall_context();

View File

@ -333,7 +333,7 @@ void sys_mkdir(Context* context, const char* filename, mode_t mode)
Task* current_task = Scheduler::current_task();
int rc = VFS::do_mkdir(kfilename, current_task->euid, current_task->egid, mode);
int rc = VFS::do_mkdir(kfilename, current_task->euid, current_task->egid, mode & (~current_task->umask));
kfree(kfilename);
@ -373,4 +373,11 @@ void sys_dup2(Context* context, int fd, int fd2)
*file2 = *file1;
kinfoln("dup2(): overwrote fd %d with fd %d", fd2, fd);
context->rax = fd2;
}
void sys_umask(Context* context, mode_t cmask)
{
Task* current_task = Scheduler::current_task();
context->rax = current_task->umask;
current_task->umask = cmask;
}

View File

@ -64,7 +64,9 @@ extern "C"
/* Returns information about the file pointed at path in buf. */
int stat(const char* pathname, struct stat* buf);
mode_t umask(mode_t cmask); // Not implemented.
/* Changes the current process' file creation mask. */
mode_t umask(mode_t cmask);
int chmod(const char* pathname, mode_t mode); // Not implemented.
#ifdef __cplusplus

View File

@ -28,5 +28,6 @@
#define SYS_dup2 24
#define SYS_setuid 25
#define SYS_setgid 26
#define SYS_umask 27
#endif

View File

@ -20,9 +20,9 @@ extern "C"
return (int)__lc_fast_syscall2(SYS_stat, path, buf);
}
mode_t umask(mode_t)
mode_t umask(mode_t cmask)
{
NOT_IMPLEMENTED("umask");
return (mode_t)__lc_fast_syscall1(SYS_umask, cmask);
}
int chmod(const char*, mode_t)

View File

@ -17,13 +17,14 @@ extern "C" long syscall(long number, ...)
case SYS_exit:
case SYS_getprocid:
case SYS_close:
case SYS_mkdir:
case SYS_umask:
case SYS_sleep: result = __luna_syscall1(number, va_arg(ap, arg)); break;
case SYS_munmap:
case SYS_execv:
case SYS_access:
case SYS_fstat:
case SYS_stat:
case SYS_mkdir:
case SYS_dup2:
case SYS_clock_gettime:
case SYS_setuid: