Kernel, libc: Implement umask()
This commit is contained in:
parent
0d443385e9
commit
52d4f34f05
@ -30,6 +30,7 @@
|
||||
#define SYS_dup2 24
|
||||
#define SYS_setuid 25
|
||||
#define SYS_setgid 26
|
||||
#define SYS_umask 27
|
||||
|
||||
struct stat;
|
||||
struct pstat;
|
||||
@ -68,3 +69,4 @@ 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_umask(Context* context, mode_t cmask);
|
@ -81,6 +81,8 @@ struct Task
|
||||
|
||||
char name[128];
|
||||
|
||||
mode_t umask;
|
||||
|
||||
BlockReason block_reason;
|
||||
|
||||
union {
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
@ -374,3 +374,10 @@ void sys_dup2(Context* context, int fd, int fd2)
|
||||
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;
|
||||
}
|
@ -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
|
||||
|
@ -28,5 +28,6 @@
|
||||
#define SYS_dup2 24
|
||||
#define SYS_setuid 25
|
||||
#define SYS_setgid 26
|
||||
#define SYS_umask 27
|
||||
|
||||
#endif
|
@ -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)
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user