#include <syscalls.h>
#include <proc.h>
#include <errno.h>
+#include <threads.h>
#define CHECK_NUM_NULLOK(v,size) \
if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
// === IMPORTS ===
-extern int Proc_Clone(Uint *Err, Uint Flags);
-extern int Threads_WaitTID(int TID, int *status);
-extern Uint Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data);
-extern int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);
extern int Proc_Execve(char *File, char **ArgV, char **EnvP);
extern Uint Binary_Load(char *file, Uint *entryPoint);
-extern int Threads_SetUID(Uint *errno, tUID ID);
-extern int Threads_SetGID(Uint *errno, tGID ID);
-extern int Threads_SetFaultHandler(Uint Handler);
// === PROTOTYPES ===
+void SyscallHandler(tSyscallRegs *Regs);
int Syscall_ValidString(Uint Addr);
int Syscall_Valid(int Size, Uint Addr);
(char*)Regs->Arg4 // Options
);
break;
+
+ // Wait on a set of handles
+ case SYS_SELECT:
+ // Sanity checks
+ if( (Regs->Arg2 && !Syscall_Valid(sizeof(fd_set), Regs->Arg2))
+ || (Regs->Arg3 && !Syscall_Valid(sizeof(fd_set), Regs->Arg3))
+ || (Regs->Arg4 && !Syscall_Valid(sizeof(fd_set), Regs->Arg4))
+ || (Regs->Arg5 && !Syscall_Valid(sizeof(tTime), Regs->Arg5)) )
+ {
+ err = -EINVAL;
+ ret = -1;
+ break;
+ }
+ // Perform the call
+ ret = VFS_Select(
+ Regs->Arg1, // Max handle
+ (fd_set *)Regs->Arg2, // Read
+ (fd_set *)Regs->Arg3, // Write
+ (fd_set *)Regs->Arg4, // Errors
+ (tTime *)Regs->Arg5, // Timeout
+ 0 // User handles
+ );
+ break;
// -- Debug
//#if DEBUG_BUILD