X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fnativefs.c;h=178162179d44a245bfa7e47d7509360595968b8f;hb=1cf5d4d187852cbe85fb41ae7b23f3e44e197afa;hp=022ab78a0ef690dc23ce826eabf69d4474a8034f;hpb=d212a6f1517af8a9c1d550f566a202418f04fffe;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/nativefs.c b/AcessNative/acesskernel_src/nativefs.c index 022ab78a..17816217 100644 --- a/AcessNative/acesskernel_src/nativefs.c +++ b/AcessNative/acesskernel_src/nativefs.c @@ -7,9 +7,11 @@ */ #define DEBUG 0 #define off_t _acess_off_t +#define sprintf _acess_sprintf #include // Acess #include // Acess #undef off_t +#undef sprintf #include // Posix #include // Posix #include // Posix @@ -31,21 +33,26 @@ typedef struct tVFS_Node *NativeFS_Mount(const char *Device, const char **Arguments); void NativeFS_Unmount(tVFS_Node *Node); tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name); -char *NativeFS_ReadDir(tVFS_Node *Node, int Position); -size_t NativeFS_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer); + int NativeFS_ReadDir(tVFS_Node *Node, int Position, char Dest[FILENAME_MAX]); +size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer); +size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer); +void NativeFS_Close(tVFS_Node *Node); // === GLOBALS === tVFS_NodeType gNativeFS_FileNodeType = { - .Read = NativeFS_Read + .Read = NativeFS_Read, + .Write = NativeFS_Write, + .Close = NativeFS_Close }; tVFS_NodeType gNativeFS_DirNodeType = { .FindDir = NativeFS_FindDir, .ReadDir = NativeFS_ReadDir, + .Close = NativeFS_Close }; tVFS_Driver gNativeFS_Driver = { - "nativefs", 0, - NativeFS_Mount, NativeFS_Unmount, - NULL, + .Name = "nativefs", + .InitDevice = NativeFS_Mount, + .Unmount = NativeFS_Unmount }; // === CODE === @@ -99,12 +106,18 @@ void NativeFS_Unmount(tVFS_Node *Node) void NativeFS_Close(tVFS_Node *Node) { tNativeFS *info = Node->ImplPtr; - Inode_UncacheNode( info->InodeHandle, Node->Inode ); + DIR *dp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? (DIR*)(tVAddr)Node->Inode : 0; + FILE *fp = (Node->Flags & VFS_FFLAG_DIRECTORY) ? 0 : (FILE*)(tVAddr)Node->Inode; + + if( Inode_UncacheNode( info->InodeHandle, Node->Inode ) == 1 ) { + if(dp) closedir(dp); + if(fp) fclose(fp); + } } tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name) { - char *path = malloc(Node->ImplInt + 1 + strlen(Name) + 1); + char *path; tNativeFS *info = Node->ImplPtr; tVFS_Node baseRet; struct stat statbuf; @@ -112,6 +125,7 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name) ENTER("pNode sName", Node, Name); // Create path + path = malloc(Node->ImplInt + 1 + strlen(Name) + 1); strcpy(path, Node->Data); path[Node->ImplInt] = '/'; strcpy(path + Node->ImplInt + 1, Name); @@ -156,11 +170,10 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name) return Inode_CacheNode(info->InodeHandle, &baseRet); } -char *NativeFS_ReadDir(tVFS_Node *Node, int Position) +int NativeFS_ReadDir(tVFS_Node *Node, int Position, char Dest[FILENAME_MAX]) { struct dirent *ent; DIR *dp = (void*)(tVAddr)Node->Inode; - char *ret; ENTER("pNode iPosition", Node, Position); @@ -172,26 +185,43 @@ char *NativeFS_ReadDir(tVFS_Node *Node, int Position) } while(Position-- && ent); if( !ent ) { - LEAVE('n'); - return NULL; + LEAVE('i', -ENOENT); + return -ENOENT; } - ret = strdup(ent->d_name); + strncpy(Dest, ent->d_name, FILENAME_MAX); // TODO: Unlock node - LEAVE('s', ret); + LEAVE('i', 0); + return 0; +} + +size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer) +{ + ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer); + if( fseek( (FILE *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 ) + { + LEAVE('i', 0); + return 0; + } + size_t ret = fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode ); + LEAVE('x', ret); return ret; } -size_t NativeFS_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) +size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer) { + FILE *fp = (FILE *)(tVAddr)Node->Inode; ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer); - if( fseek( (void *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 ) + if( fseek( fp, Offset, SEEK_SET ) != 0 ) { LEAVE('i', 0); return 0; } - LEAVE('-'); - return fread( Buffer, 1, Length, (void *)(tVAddr)Node->Inode ); + size_t ret = fwrite( Buffer, 1, Length, fp ); + fflush( fp ); + LEAVE('i', ret); + return ret; + }