X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fnativefs.c;h=1a0762745b21a7a822c7bf16c86a5a7a5aa7afdf;hb=b204bbefadbc511b2d9a5a17a099e75b46ebec6d;hp=7c20b69e0d55e10cf8b4f37aa8b4e610e0b07f5e;hpb=151e0400c6cf69d71a51e49bc75fac3d7bdfc2f7;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/nativefs.c b/AcessNative/acesskernel_src/nativefs.c index 7c20b69e..1a076274 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 @@ -22,7 +24,7 @@ // === STRUCTURES === typedef struct { - int InodeHandle; + void *InodeHandle; int bReadOnly; } tNativeFS; @@ -30,10 +32,10 @@ typedef struct int NativeFS_Install(char **Arguments); 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, _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); +tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags); + 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, Uint Flags); +size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer, Uint Flags); void NativeFS_Close(tVFS_Node *Node); // === GLOBALS === @@ -75,7 +77,7 @@ tVFS_Node *NativeFS_Mount(const char *Device, const char **Arguments) // Check if directory exists // Parse flags from arguments info = malloc(sizeof(tNativeFS)); - info->InodeHandle = Inode_GetHandle(); + info->InodeHandle = Inode_GetHandle(NULL); info->bReadOnly = 0; // Create node ret = malloc(sizeof(tVFS_Node)); @@ -113,7 +115,7 @@ void NativeFS_Close(tVFS_Node *Node) } } -tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name) +tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags) { char *path; tNativeFS *info = Node->ImplPtr; @@ -152,11 +154,18 @@ tVFS_Node *NativeFS_FindDir(tVFS_Node *Node, const char *Name) else { LOG("File"); - baseRet.Inode = (Uint64)(tVAddr) fopen(path, "r+"); + FILE *fp = fopen(path, "r+"); + if( !fp ) { + Log_Error("NativeFS", "fopen of '%s' failed: %s", path, strerror(errno)); + free(path); + LEAVE('n'); + return NULL; + } + baseRet.Inode = (Uint64)(tVAddr) fp; baseRet.Type = &gNativeFS_FileNodeType; - fseek( (FILE*)(tVAddr)baseRet.Inode, 0, SEEK_END ); - baseRet.Size = ftell( (FILE*)(tVAddr)baseRet.Inode ); + fseek( fp, 0, SEEK_END ); + baseRet.Size = ftell( fp ); } // Create new node @@ -168,11 +177,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); @@ -184,19 +192,19 @@ 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); - return ret; + LEAVE('i', 0); + return 0; } -size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer) +size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void *Buffer, Uint Flags) { ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer); if( fseek( (FILE *)(tVAddr)Node->Inode, Offset, SEEK_SET ) != 0 ) @@ -204,11 +212,12 @@ size_t NativeFS_Read(tVFS_Node *Node, _acess_off_t Offset, size_t Length, void * LEAVE('i', 0); return 0; } - LEAVE('-'); - return fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode ); + size_t ret = fread( Buffer, 1, Length, (FILE *)(tVAddr)Node->Inode ); + LEAVE('x', ret); + return ret; } -size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer) +size_t NativeFS_Write(tVFS_Node *Node, _acess_off_t Offset, size_t Length, const void *Buffer, Uint Flags) { FILE *fp = (FILE *)(tVAddr)Node->Inode; ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);