AcessNative - added MkNod to nativefs
[tpg/acess2.git] / AcessNative / acesskernel_src / nativefs.c
index af25e3c..e603c26 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
 #define sprintf _acess_sprintf\r
 #include <acess.h>     // Acess\r
@@ -14,7 +14,7 @@
 #undef sprintf\r
 #include <dirent.h>    // Posix\r
 #include <sys/stat.h>  // Posix\r
-#include <stdio.h>     // Posix\r
+#include <stdio.h>     // C\r
 \r
 //NOTES:\r
 // tVFS_Node->ImplPtr is a pointer to the filesystem flags (tNativeFS)\r
@@ -24,7 +24,7 @@
 // === STRUCTURES ===\r
 typedef struct\r
 {\r
-        int    InodeHandle;\r
+       void    *InodeHandle;\r
         int    bReadOnly;\r
 }      tNativeFS;\r
 \r
@@ -32,10 +32,11 @@ typedef struct
  int   NativeFS_Install(char **Arguments);\r
 tVFS_Node      *NativeFS_Mount(const char *Device, const char **Arguments);\r
 void   NativeFS_Unmount(tVFS_Node *Node);\r
-tVFS_Node      *NativeFS_FindDir(tVFS_Node *Node, const char *Name);\r
+tVFS_Node      *NativeFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);\r
  int   NativeFS_ReadDir(tVFS_Node *Node, int Position, char Dest[FILENAME_MAX]);\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
+tVFS_Node      *NativeFS_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);\r
+size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer, Uint Flags);\r
+size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer, Uint Flags);\r
 void   NativeFS_Close(tVFS_Node *Node);\r
 \r
 // === GLOBALS ===\r
@@ -47,6 +48,7 @@ tVFS_NodeType gNativeFS_FileNodeType = {
 tVFS_NodeType  gNativeFS_DirNodeType = {\r
        .FindDir = NativeFS_FindDir,\r
        .ReadDir = NativeFS_ReadDir,\r
+       .MkNod = NativeFS_MkNod,\r
        .Close = NativeFS_Close\r
 };\r
 tVFS_Driver    gNativeFS_Driver = {\r
@@ -77,7 +79,7 @@ tVFS_Node *NativeFS_Mount(const char *Device, const char **Arguments)
        // Check if directory exists\r
        // Parse flags from arguments\r
        info = malloc(sizeof(tNativeFS));\r
-       info->InodeHandle = Inode_GetHandle();\r
+       info->InodeHandle = Inode_GetHandle(NULL);\r
        info->bReadOnly = 0;\r
        // Create node\r
        ret = malloc(sizeof(tVFS_Node));\r
@@ -115,7 +117,7 @@ void NativeFS_Close(tVFS_Node *Node)
        }\r
 }\r
 \r
-tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)\r
+tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)\r
 {\r
        char    *path;\r
        tNativeFS       *info = Node->ImplPtr;\r
@@ -154,11 +156,18 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name)
        else\r
        {\r
                LOG("File");\r
-               baseRet.Inode = (Uint64)(tVAddr) fopen(path, "r+");\r
+               FILE    *fp = fopen(path, "r+");\r
+               if( !fp ) {\r
+                       Log_Error("NativeFS", "fopen of '%s' failed: %s", path, strerror(errno));\r
+                       free(path);\r
+                       LEAVE('n');\r
+                       return NULL;\r
+               }\r
+               baseRet.Inode = (Uint64)(tVAddr) fp;\r
                baseRet.Type = &gNativeFS_FileNodeType;\r
                \r
-               fseek( (FILE*)(tVAddr)baseRet.Inode, 0, SEEK_END );\r
-               baseRet.Size = ftell( (FILE*)(tVAddr)baseRet.Inode );\r
+               fseek( fp, 0, SEEK_END );\r
+               baseRet.Size = ftell( fp );\r
        }\r
        \r
        // Create new node\r
@@ -197,7 +206,24 @@ int NativeFS_ReadDir(tVFS_Node *Node, int Position, char Dest[FILENAME_MAX])
        return 0;\r
 }\r
 \r
-size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer)\r
+tVFS_Node *NativeFS_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)\r
+{\r
+       char path[Node->ImplInt+1+strlen(Name)+1];\r
+       sprintf(path, "%s/%s", Node->Data, Name);\r
+       if( Flags & VFS_FFLAG_DIRECTORY )\r
+       {\r
+               mkdir(path, 0755);\r
+       }\r
+       else\r
+       {\r
+               FILE *tmp = fopen(path, "w");\r
+               if(!tmp)        return NULL;\r
+               fclose(tmp);\r
+       }\r
+       return NativeFS_FindDir(Node, Name, 0);\r
+}\r
+\r
+size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer, Uint Flags)\r
 {\r
        ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);\r
        if( fseek( (FILE *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 )\r
@@ -205,11 +231,12 @@ size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *
                LEAVE('i', 0);\r
                return 0;\r
        }\r
-       LEAVE('-');\r
-       return fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode );\r
+       size_t ret = fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode );\r
+       LEAVE('x', ret);\r
+       return ret;\r
 }\r
 \r
-size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer)\r
+size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer, Uint Flags)\r
 {\r
        FILE    *fp = (FILE *)(tVAddr)Node->Inode;\r
        ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);\r

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