X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=8d17e74d2120967ba5d058f1b7ec0111cff17679;hb=391af300bd045791b8aaf50cf44b2d503c763213;hp=dd1f4b3ab5bdc50fdbd8e733b0e88ea90883f89f;hpb=51adc08a1e11fe9e5389e6e7c3e3a4ea4973917b;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index dd1f4b3a..8d17e74d 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -119,6 +119,11 @@ void SyscallHandler(tSyscallRegs *Regs) // Binary Control // --- case SYS_EXECVE: + if( !Syscall_ValidString(Regs->Arg1) ) { + err = -EINVAL; + ret = -1; + break; + } ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3); break; case SYS_LOADBIN: @@ -147,6 +152,14 @@ void SyscallHandler(tSyscallRegs *Regs) VFS_Close( Regs->Arg1 ); break; + case SYS_SEEK: + ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + + case SYS_TELL: + ret = VFS_Tell( Regs->Arg1 ); + break; + case SYS_WRITE: #if BITS < 64 ret = VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); @@ -197,6 +210,36 @@ void SyscallHandler(tSyscallRegs *Regs) ret = VFS_ChDir( (void*)Regs->Arg1 ); break; + // IO Control + case SYS_IOCTL: + 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(Regs->Arg1) + || !Syscall_ValidString(Regs->Arg2) + || !Syscall_ValidString(Regs->Arg3) + || !Syscall_ValidString(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; + // -- Debug case SYS_DEBUG: Log((char*)Regs->Arg1,