X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=85fbbf8c7882242b8465ac4bf60b41ff0cb125ad;hb=d8976435eade14e409b01e58850b75990ad9a4a7;hp=1f2f798053ef1c365fb122f62c05a43a7efc0c23;hpb=04a050f42807686dc119838c82372409246d55bb;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 1f2f7980..85fbbf8c 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -29,8 +29,8 @@ #define CHECK_STR_ARRAY(arr) do {\ int i;\ char **tmp = (char**)arr; \ - CHECK_NUM_NONULL( tmp, sizeof(char**) ); \ - for(i=0;tmp[i];i++) { \ + CHECK_NUM_NULLOK( tmp, sizeof(char**) ); \ + for(i=0;tmp&&tmp[i];i++) { \ CHECK_STR_NONULL( tmp[i] ); \ CHECK_NUM_NONULL( &tmp[i+1], sizeof(char*) ); \ }\ @@ -72,6 +72,10 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Put the current thread to sleep case SYS_SLEEP: Threads_Sleep(); break; + + case SYS_TIMEDSLEEP: + Time_Delay(Regs->Arg1); + break; // -- Yield current timeslice case SYS_YIELD: Threads_Yield(); break; @@ -172,7 +176,8 @@ void SyscallHandler(tSyscallRegs *Regs) CHECK_STR_NONULL((const char*)Regs->Arg1); CHECK_STR_ARRAY((const char**)Regs->Arg2); CHECK_STR_ARRAY((const char**)Regs->Arg3); - CHECK_NUM_NULLOK((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); + if( Regs->Arg4 > 0 ) + CHECK_NUM_NONULL((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); ret = Proc_SysSpawn( (const char*)Regs->Arg1, (const char**)Regs->Arg2, (const char**)Regs->Arg3, Regs->Arg4, (int*)Regs->Arg5 @@ -207,12 +212,27 @@ void SyscallHandler(tSyscallRegs *Regs) LOG("VFS_Open(\"%s\", 0x%x)", (char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER); ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER); break; + case SYS_REOPEN: + CHECK_STR_NONULL( (char*)Regs->Arg2 ); + LOG("VFS_Reopen(%i, \"%s\", 0x%x)", Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER); + ret = VFS_Reopen(Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER); + break; case SYS_CLOSE: LOG("VFS_Close(%i)", Regs->Arg1); VFS_Close( Regs->Arg1 ); break; + case SYS_COPYFD: + LOG("VFS_DuplicateFD(%i,%i)", Regs->Arg1, Regs->Arg2); + ret = VFS_DuplicateFD(Regs->Arg1, Regs->Arg2); + break; + + case SYS_FDCTL: + LOG("VFS_SetFDFlags(%i,0%o,0%o)", Regs->Arg1, Regs->Arg2, Regs->Arg3); + ret = VFS_SetFDFlags(Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + case SYS_SEEK: #if BITS == 64 ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3 ); @@ -299,14 +319,10 @@ void SyscallHandler(tSyscallRegs *Regs) else { // Sanity check the paths - if(!Syscall_ValidString((char*)Regs->Arg1) - || !Syscall_ValidString((char*)Regs->Arg2) - || (Regs->Arg3 && !Syscall_ValidString((char*)Regs->Arg3)) - || !Syscall_ValidString((char*)Regs->Arg4) ) { - err = -EINVAL; - ret = -1; - break; - } + CHECK_STR_NONULL((char*)Regs->Arg1); + CHECK_STR_NONULL((char*)Regs->Arg2); + CHECK_STR_NULLOK((char*)Regs->Arg3); + CHECK_STR_NONULL((char*)Regs->Arg4); ret = VFS_Mount( (char*)Regs->Arg1, // Device (char*)Regs->Arg2, // Mount point @@ -339,7 +355,17 @@ void SyscallHandler(tSyscallRegs *Regs) 0 // User handles ); break; + + + // Create a directory + case SYS_MKDIR: + CHECK_STR_NONULL( (char*)Regs->Arg1 ); + ret = VFS_MkDir( (char*)Regs->Arg1 ); + break; + case SYS_UNLINK: + Log_Error("Syscalls", "TODO: Impliment SYS_UNLINK"); + // Fall // -- Debug //#if DEBUG_BUILD case SYS_DEBUG: