+ case SYS_WRITE:
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
+ ret = VFS_Write( Regs->Arg1, Regs->Arg3, (void*)Regs->Arg2 );
+ break;
+
+ case SYS_READ:
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
+ ret = VFS_Read( Regs->Arg1, Regs->Arg3, (void*)Regs->Arg2 );
+ break;
+
+ case SYS_FINFO:
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, sizeof(tFInfo) + Regs->Arg3*sizeof(tVFS_ACL) );
+ // FP, Dest, MaxACLs
+ ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
+ break;
+
+ // Get ACL Value
+ case SYS_GETACL:
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, sizeof(tVFS_ACL) );
+ ret = VFS_GetACL( Regs->Arg1, (void*)Regs->Arg2 );
+ break;
+
+ // Read Directory
+ case SYS_READDIR:
+ // TODO: What if the filename is longer?
+ // Maybe force it to be a 256 byte buffer
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, 256 );
+ ret = VFS_ReadDir( Regs->Arg1, (void*)Regs->Arg2 );
+ break;
+
+ // Open a file that is a entry in an open directory
+ case SYS_OPENCHILD:
+ CHECK_STR_NONULL( (char*)Regs->Arg2 );
+ ret = VFS_OpenChild( Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3);
+ break;
+
+ // Change Directory
+ case SYS_CHDIR:
+ CHECK_STR_NONULL( (const char*)Regs->Arg1 );
+ ret = VFS_ChDir( (const char*)Regs->Arg1 );
+ break;
+
+ // IO Control
+ case SYS_IOCTL:
+ // All sanity checking should be done by the driver
+ if( Regs->Arg3 && !MM_IsUser(Regs->Arg3) ) {
+ err = -EINVAL; ret = -1; break;
+ }
+ ret = VFS_IOCtl( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
+ break;
+
+ // Mount a filesystem
+ case SYS_MOUNT:
+ // Only root can mount filesystems
+ if(Threads_GetUID() != 0) {
+ err = -EACCES;
+ ret = -1;
+ break;
+ }
+ // Sanity check the paths
+ if(!Syscall_ValidString((char*)Regs->Arg1)
+ || !Syscall_ValidString((char*)Regs->Arg2)
+ || !Syscall_ValidString((char*)Regs->Arg3)
+ || !Syscall_ValidString((char*)Regs->Arg4) ) {
+ err = -EINVAL;
+ ret = -1;
+ break;
+ }
+ ret = VFS_Mount(
+ (char*)Regs->Arg1, // Device
+ (char*)Regs->Arg2, // Mount point
+ (char*)Regs->Arg3, // Filesystem
+ (char*)Regs->Arg4 // Options
+ );
+ break;
+
+ // Wait on a set of handles
+ case SYS_SELECT:
+ // Sanity checks
+ if( (Regs->Arg2 && !Syscall_Valid(sizeof(fd_set), (void*)Regs->Arg2))
+ || (Regs->Arg3 && !Syscall_Valid(sizeof(fd_set), (void*)Regs->Arg3))
+ || (Regs->Arg4 && !Syscall_Valid(sizeof(fd_set), (void*)Regs->Arg4))
+ || (Regs->Arg5 && !Syscall_Valid(sizeof(tTime), (void*)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;