Kernel - SYS_FDCTL
authorJohn Hodge (sonata) <[email protected]>
Wed, 15 May 2013 09:08:33 +0000 (17:08 +0800)
committerJohn Hodge (sonata) <[email protected]>
Wed, 15 May 2013 09:08:33 +0000 (17:08 +0800)
KernelLand/Kernel/include/vfs_ext.h
KernelLand/Kernel/syscalls.c
KernelLand/Kernel/vfs/open.c

index 1bae964..00eeebb 100644 (file)
@@ -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
index 4416ec4..340a5cc 100644 (file)
@@ -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 );
index 67ef58a..067a73a 100644 (file)
@@ -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
  */

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