X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=b0329836d6e8447f3e1438233d936dc561fdc589;hb=ad2ec62655e1d6eb8f2b4a4684eb5d7952aea0fb;hp=6e8d60e427e6b301162acc3b9a740f1a9b02b242;hpb=b5a1402b18d2f8cb360bf2fc524609b374bac8ec;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 6e8d60e4..b0329836 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -8,6 +8,7 @@ #include #include #include +#include #define CHECK_NUM_NULLOK(v,size) \ if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;} @@ -19,17 +20,11 @@ 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); @@ -307,12 +302,37 @@ void SyscallHandler(tSyscallRegs *Regs) (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 case SYS_DEBUG: - Log((char*)Regs->Arg1, + LogF("Log: [%i] ", Threads_GetTID()); + LogF((char*)Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6); + LogF("\n"); break; //#endif