Kernel - Cleaning up messages
[tpg/acess2.git] / Kernel / syscalls.c
index 6e8d60e..b032983 100644 (file)
@@ -8,6 +8,7 @@
 #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);
 
@@ -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
        

UCC git Repository :: git.ucc.asn.au