mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
syscalls: fcntl stub
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/fd.h>
|
||||
#include <arch/cls.h>
|
||||
|
||||
#define F_DUPFD 0
|
||||
#define F_GETFD 1
|
||||
#define F_SETFD 2
|
||||
#define F_GETFL 3
|
||||
#define F_SETFL 4
|
||||
|
||||
#define UNKNOWN "astral: unknown fcntl\n"
|
||||
|
||||
syscallret syscall_fcntl(int ifd, int cmd, uint64_t arg){
|
||||
|
||||
syscallret retv;
|
||||
retv.ret = -1;
|
||||
|
||||
fd_t* fd = NULL;
|
||||
|
||||
if(cmd != F_DUPFD){
|
||||
retv.errno = fd_access(&arch_getcls()->thread->proc->fdtable, &fd, ifd);
|
||||
if(retv.errno)
|
||||
return retv;
|
||||
}
|
||||
|
||||
|
||||
switch(cmd){
|
||||
case F_GETFD: // no fd flags implemented
|
||||
case F_SETFD:
|
||||
retv.ret = 0;
|
||||
break;
|
||||
case F_GETFL:
|
||||
retv.ret = fd->flags;
|
||||
break;
|
||||
case F_SETFL: // no useful status flags implemented
|
||||
retv.ret = 0;
|
||||
break;
|
||||
default:
|
||||
console_write(UNKNOWN, strlen(UNKNOWN));
|
||||
retv.errno = EINVAL;
|
||||
return retv;
|
||||
}
|
||||
|
||||
if(fd)
|
||||
fd_release(fd);
|
||||
|
||||
retv.errno = 0;
|
||||
return retv;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user