mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-28 13:18:22 +00:00
55 lines
979 B
C
55 lines
979 B
C
#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;
|
|
|
|
proc_t* proc = arch_getcls()->thread->proc;
|
|
|
|
if(cmd != F_DUPFD){
|
|
retv.errno = fd_access(&proc->fdtable, &fd, ifd);
|
|
if(retv.errno)
|
|
return retv;
|
|
}
|
|
|
|
switch(cmd){
|
|
case F_DUPFD:
|
|
retv.errno = fd_duplicate(&proc->fdtable, ifd, arg, 1, &retv.ret);
|
|
return retv;
|
|
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;
|
|
|
|
}
|