AcessNative/nativefs - Fixed memory leak due to Close() not being bound
[tpg/acess2.git] / AcessNative / acesskernel_src / nativefs.c
index 835fce9..e51f286 100644 (file)
@@ -5,7 +5,7 @@
  * nativefs.c\r
  * - Host filesystem access\r
  */\r
-#define DEBUG  1\r
+#define DEBUG  0\r
 #define off_t  _acess_off_t\r
 #include <acess.h>     // Acess\r
 #include <vfs.h>       // Acess\r
@@ -32,15 +32,20 @@ tVFS_Node   *NativeFS_Mount(const char *Device, const char **Arguments);
 void   NativeFS_Unmount(tVFS_Node *Node);\r
 tVFS_Node      *NativeFS_FindDir(tVFS_Node *Node, const char *Name);\r
 char   *NativeFS_ReadDir(tVFS_Node *Node, int Position);\r
-size_t NativeFS_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);\r
+size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer);\r
+size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer);\r
+void   NativeFS_Close(tVFS_Node *Node);\r
 \r
 // === GLOBALS ===\r
 tVFS_NodeType  gNativeFS_FileNodeType = {\r
-       .Read = NativeFS_Read\r
+       .Read = NativeFS_Read,\r
+       .Write = NativeFS_Write,\r
+       .Close = NativeFS_Close\r
 };\r
 tVFS_NodeType  gNativeFS_DirNodeType = {\r
        .FindDir = NativeFS_FindDir,\r
        .ReadDir = NativeFS_ReadDir,\r
+       .Close = NativeFS_Close\r
 };\r
 tVFS_Driver    gNativeFS_Driver = {\r
        "nativefs", 0,\r
@@ -63,7 +68,7 @@ tVFS_Node *NativeFS_Mount(const char *Device, const char **Arguments)
        \r
        dp = opendir(Device);\r
        if(!dp) {\r
-               Log_Warning("NativeFS", "ERRO: Unable to open device root '%s'", Device);\r
+               Log_Warning("NativeFS", "ERROR: Unable to open device root '%s'", Device);\r
                return NULL;\r
        }\r
        \r
@@ -82,7 +87,7 @@ tVFS_Node *NativeFS_Mount(const char *Device, const char **Arguments)
        ret->Flags = VFS_FFLAG_DIRECTORY;\r
 \r
        ret->Type = &gNativeFS_DirNodeType;     \r
-       \r
+\r
        return ret;\r
 }\r
 \r
@@ -99,12 +104,18 @@ void NativeFS_Unmount(tVFS_Node *Node)
 void NativeFS_Close(tVFS_Node *Node)\r
 {\r
        tNativeFS       *info = Node->ImplPtr;\r
-       Inode_UncacheNode( info->InodeHandle, Node->Inode );\r
+       DIR     *dp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? (DIR*)(tVAddr)Node->Inode : 0;\r
+       FILE    *fp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? 0 : (FILE*)(tVAddr)Node->Inode;\r
+       \r
+       if( Inode_UncacheNode( info->InodeHandle, Node->Inode ) == 1 ) {\r
+               if(dp)  closedir(dp);\r
+               if(fp)  fclose(fp);\r
+       }\r
 }\r
 \r
 tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)\r
 {\r
-       char    *path = malloc(Node->ImplInt + 1 + strlen(Name) + 1);\r
+       char    *path;\r
        tNativeFS       *info = Node->ImplPtr;\r
        tVFS_Node       baseRet;\r
        struct stat statbuf;\r
@@ -112,6 +123,7 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)
        ENTER("pNode sName", Node, Name);\r
        \r
        // Create path\r
+       path = malloc(Node->ImplInt + 1 + strlen(Name) + 1);\r
        strcpy(path, Node->Data);\r
        path[Node->ImplInt] = '/';\r
        strcpy(path + Node->ImplInt + 1, Name);\r
@@ -184,14 +196,30 @@ char *NativeFS_ReadDir(tVFS_Node *Node, int Position)
        return ret;\r
 }\r
 \r
-size_t NativeFS_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)\r
+size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer)\r
 {\r
        ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);\r
-       if( fseek( (void *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 )\r
+       if( fseek( (FILE *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 )\r
        {\r
                LEAVE('i', 0);\r
                return 0;\r
        }\r
        LEAVE('-');\r
-       return fread( Buffer, 1, Length, (void *)(tVAddr)Node->Inode );\r
+       return fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode );\r
+}\r
+\r
+size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer)\r
+{\r
+       FILE    *fp = (FILE *)(tVAddr)Node->Inode;\r
+       ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);\r
+       if( fseek( fp, Offset, SEEK_SET ) != 0 )\r
+       {\r
+               LEAVE('i', 0);\r
+               return 0;\r
+       }\r
+       size_t ret = fwrite( Buffer, 1, Length, fp );\r
+       fflush( fp );\r
+       LEAVE('i', ret);\r
+       return ret;\r
+\r
 }\r

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