* \brief Second Extended Filesystem Driver
* \todo Implement file full write support
*/
-#define DEBUG 1
+#define DEBUG 0
#define VERBOSE 0
#include "ext2_common.h"
-// === PROTOTYPES ===
-Uint64 Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
-
// === CODE ===
/**
- * \fn Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
* \brief Read from a file
*/
-Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
+size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
{
tExt2_Disk *disk = Node->ImplPtr;
- tExt2_Inode inode;
+ tExt2_Inode *inode = (void*)(Node+1);
Uint64 base;
Uint block;
Uint64 remLen;
- ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
-
- // Get Inode
- Ext2_int_ReadInode(disk, Node->Inode, &inode);
+ ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);
// Sanity Checks
- if(Offset >= inode.i_size) {
+ if(Offset >= inode->i_size) {
LEAVE('i', 0);
return 0;
}
- if(Offset + Length > inode.i_size)
- Length = inode.i_size - Offset;
+ if(Offset + Length > inode->i_size)
+ Length = inode->i_size - Offset;
block = Offset / disk->BlockSize;
- Offset = Offset / disk->BlockSize;
- base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
+ Offset = Offset % disk->BlockSize;
+ base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
if(base == 0) {
- Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode);
+ Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx (Block %i)", Node->Inode, block);
LEAVE('i', 0);
return 0;
}
}
// Read first block
+ // TODO: If (Flags & VFS_IOFLAG_NOBLOCK) trigger read and return EWOULDBLOCK?
remLen = Length;
VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);
remLen -= disk->BlockSize - Offset;
// Read middle blocks
while(remLen > disk->BlockSize)
{
- base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
+ base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
if(base == 0) {
- Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode);
+ Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx", Node->Inode);
LEAVE('i', 0);
return 0;
}
}
// Read last block
- base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
+ base = Ext2_int_GetBlockAddr(disk, inode->i_block, block);
VFS_ReadAt( disk->FD, base, remLen, Buffer);
LEAVE('X', Length);