From: John Hodge (sonata) Date: Wed, 15 May 2013 09:08:33 +0000 (+0800) Subject: Kernel - SYS_FDCTL X-Git-Tag: rel0.15~478 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;ds=inline;h=3f9b3f4cb91ce4ada9c892e6f2a3c69dbb9debd6;p=tpg%2Facess2.git Kernel - SYS_FDCTL --- diff --git a/KernelLand/Kernel/include/vfs_ext.h b/KernelLand/Kernel/include/vfs_ext.h index 1bae964f..00eeebb5 100644 --- a/KernelLand/Kernel/include/vfs_ext.h +++ b/KernelLand/Kernel/include/vfs_ext.h @@ -32,7 +32,7 @@ typedef Uint32 tMount; //! Create the file if it doesn't exist #define VFS_OPENFLAG_CREATE 0x80 //! Treat as a directory -#define VFS_OPENFLAG_DIRECTORY 0x100 +#define VFS_OPENFLAG_DIRECTORY 0x1000 //! Open as a user #define VFS_OPENFLAG_USER 0x8000 /** @@ -233,6 +233,11 @@ extern void VFS_Close(int FD); */ extern int VFS_DuplicateFD(int SrcFD, int DstFD); +/** + * \brief Update the flags on a FD + */ +extern int VFS_SetFDFlags(int FD, int Mask, int Value); + /** * \brief Get file information from an open file * \param FD File handle returned by ::VFS_Open diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 4416ec4f..340a5ccc 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -218,7 +218,12 @@ void SyscallHandler(tSyscallRegs *Regs) 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 ); diff --git a/KernelLand/Kernel/vfs/open.c b/KernelLand/Kernel/vfs/open.c index 67ef58a6..067a73ac 100644 --- a/KernelLand/Kernel/vfs/open.c +++ b/KernelLand/Kernel/vfs/open.c @@ -23,7 +23,7 @@ extern tVFS_Node *VFS_MemFile_Create(const char *Path); // === PROTOTYPES === void _ReferenceMount(tVFS_Mount *Mount, const char *DebugTag); void _DereferenceMount(tVFS_Mount *Mount, const char *DebugTag); - int VFS_int_CreateHandle( tVFS_Node *Node, tVFS_Mount *Mount, int Mode ); + int VFS_int_CreateHandle(tVFS_Node *Node, tVFS_Mount *Mount, int Mode); // === CODE === void _ReferenceMount(tVFS_Mount *Mount, const char *DebugTag) @@ -769,6 +769,21 @@ int VFS_DuplicateFD(int SrcFD, int DstFD) return DstFD; } +/* + * Update flags on a FD + */ +int VFS_SetFDFlags(int FD, int Mask, int Value) +{ + tVFS_Handle *h = VFS_GetHandle(FD); + if(!FD) return -1; + int ret = h->Mode; + + Value &= Mask; + h->Mode &= ~Mask; + h->Mode |= Value; + return ret; +} + /** * \brief Change current working directory */