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);
-Uint64 FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 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);
* \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;
}
/**
* \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];
}
* \param Buffer Destination buffer
* \return Number of bytes read
*/
-Uint64 FDD_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 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;
int rem_len;
char *dest = Buffer;
- ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
+ ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);
if( Offset > Node->Size ) LEAVE_RET('i', 0);
if( Length > Node->Size ) Length = Node->Size;
rem_len = Length;
track = Offset / BYTES_PER_TRACK;
- Offset %= BYTES_PER_TRACK;
+ Offset %= BYTES_PER_TRACK;
+
+ // TODO: Handle (Flags & VFS_IOFLAG_NOBLOCK)
if( Offset )
{