X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FStorage%2FFDDv2%2Fmain.c;h=7bea4769845949a1e5d0f5a6231d98b7a2ef7e98;hb=5cab4c07bc13888dc7956194ef9595508072a4eb;hp=c33dcdad8f96fba481cf3f03367562e5b3769e8c;hpb=880dd63bfcba522dab0a75cc63fdec1d04ff8c89;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Storage/FDDv2/main.c b/KernelLand/Modules/Storage/FDDv2/main.c index c33dcdad..7bea4769 100644 --- a/KernelLand/Modules/Storage/FDDv2/main.c +++ b/KernelLand/Modules/Storage/FDDv2/main.c @@ -21,10 +21,10 @@ int FDD_Install(char **Arguments); int FDD_RegisterFS(void); // --- VFS -char *FDD_ReadDir(tVFS_Node *Node, int pos); -tVFS_Node *FDD_FindDir(tVFS_Node *dirNode, const char *Name); + int FDD_ReadDir(tVFS_Node *Node, int pos, char dest[FILENAME_MAX]); +tVFS_Node *FDD_FindDir(tVFS_Node *dirNode, const char *Name, Uint Flags); int FDD_IOCtl(tVFS_Node *Node, int ID, void *Data); -size_t FDD_ReadFS(tVFS_Node *node, off_t Offset, size_t Len, void *buffer); +size_t FDD_ReadFS(tVFS_Node *node, off_t Offset, size_t Len, void *buffer, Uint Flags); // --- Helpers int FDD_int_ReadWriteWithinTrack(int Disk, int Track, int bWrite, size_t Offset, size_t Length, void *Buffer); @@ -111,17 +111,16 @@ int FDD_RegisterFS(void) * \param Pos Position * \return Heap string of node name */ -char *FDD_ReadDir(tVFS_Node *Node, int Pos) +int FDD_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]) { - char ret_tpl[2]; - if(Pos < 0 || Pos > MAX_DISKS ) - return NULL; - if(gaFDD_Disks[Pos].bValid) - return VFS_SKIP; + if(Pos < 0 || Pos >= MAX_DISKS ) + return -ENOENT; + if(!gaFDD_Disks[Pos].bValid) + return 1; - ret_tpl[0] = '0' + Pos; - ret_tpl[1] = '\0'; - return strdup(ret_tpl); + Dest[0] = '0' + Pos; + Dest[1] = '\0'; + return 0; } /** @@ -130,13 +129,14 @@ char *FDD_ReadDir(tVFS_Node *Node, int Pos) * \param Name Drive name * \return Pointer to node structure */ -tVFS_Node *FDD_FindDir(tVFS_Node *Node, const char *Name) +tVFS_Node *FDD_FindDir(tVFS_Node *Node, const char *Name, Uint Flags) { int pos; if( '0' > Name[0] || Name[0] > '9' ) return NULL; if( Name[1] != '\0' ) return NULL; pos = Name[0] - '0'; + if( pos >= MAX_DISKS ) return NULL; return &gaFDD_DiskNodes[pos]; } @@ -169,7 +169,7 @@ int FDD_IOCtl(tVFS_Node *Node, int ID, void *Data) * \param Buffer Destination buffer * \return Number of bytes read */ -size_t FDD_ReadFS(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) +size_t FDD_ReadFS(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags) { int disk = Node->Inode; int track; @@ -187,7 +187,9 @@ size_t FDD_ReadFS(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) rem_len = Length; track = Offset / BYTES_PER_TRACK; - Offset %= BYTES_PER_TRACK; + Offset %= BYTES_PER_TRACK; + + // TODO: Handle (Flags & VFS_IOFLAG_NOBLOCK) if( Offset ) {