3 * Ext2 Driver Version 1
7 * \brief Second Extended Filesystem Driver
8 * \todo Implement file full write support
12 #include "ext2_common.h"
16 * \brief Read from a file
18 size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
20 tExt2_Disk *disk = Node->ImplPtr;
21 tExt2_Inode *inode = (void*)(Node+1);
26 ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);
29 if(Offset >= inode->i_size) {
33 if(Offset + Length > inode->i_size)
34 Length = inode->i_size - Offset;
36 block = Offset / disk->BlockSize;
37 Offset = Offset % disk->BlockSize;
38 base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
40 Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx (Block %i)", Node->Inode, block);
46 if(Length <= disk->BlockSize - Offset)
48 VFS_ReadAt( disk->FD, base+Offset, Length, Buffer);
54 // TODO: If (Flags & VFS_IOFLAG_NOBLOCK) trigger read and return EWOULDBLOCK?
56 VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);
57 remLen -= disk->BlockSize - Offset;
58 Buffer += disk->BlockSize - Offset;
62 while(remLen > disk->BlockSize)
64 base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
66 Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx", Node->Inode);
70 VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);
71 Buffer += disk->BlockSize;
72 remLen -= disk->BlockSize;
77 base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
78 VFS_ReadAt( disk->FD, base, remLen, Buffer);