Add read to EXT2
diff --git a/src/kernel/dri/fs/ext2/ext2.c b/src/kernel/dri/fs/ext2/ext2.c
index 3a1e183..2cf15f5 100644
--- a/src/kernel/dri/fs/ext2/ext2.c
+++ b/src/kernel/dri/fs/ext2/ext2.c
@@ -3,6 +3,7 @@
 #include <kint.h>
 #include <log.h>
 #include <io.h>
+#include <alloc.h>
 
 inline uint ext2_block_size(struct ext2_superblock *sb)
 {
@@ -77,9 +78,25 @@
 	return descriptors[bgd_offset];
 }
 
-static void print_entry(uint inode, const char *name, void *data)
+static void print_entry(uint inode, const char *name, void *sb)
 {
 	kprintf("%d\t %s\n", inode, name);
+
+	struct ext2_inode in;
+
+	if (ext2_find_inode(sb, inode, &in))
+	{
+		if ((in.mode & EXT2_F_TYPE) == EXT2_S_IFREG)
+		{
+			char buffer[65];
+			uint read = ext2_read_inode(sb, &in, buffer, 64);
+			buffer[read] = 0;
+
+			kprintf("contents: %d\n'%s'\n", read, buffer);
+		}
+	}
+
+	return;
 }
 
 void ext2_mount(struct fs_node *where)
@@ -100,7 +117,7 @@
 		kprintf("ls /\n");
 		kprintf("inode\t name\n");
 		kprintf("--------------------\n");
-		ext2_dir_ls(&sb, &root, print_entry, NULL);
+		ext2_dir_ls(&sb, &root, print_entry, &sb);
 	}
 	else
 	{
@@ -143,7 +160,7 @@
 	struct ext2_block_group_descriptor descriptor =
 		ext2_load_block_group_descriptor(sb, block_group);
 
-	kprintf(DEBUG "Descriptor inode_table = 0x%x\n", descriptor.inode_table_start_block);
+	// kprintf(DEBUG "Descriptor inode_table = 0x%x\n", descriptor.inode_table_start_block);
 
 	// We need to figure out what FS block the inode is on, we know how many
 	// inodes there are total in this BGD and the number per page, so this is
@@ -184,7 +201,7 @@
 		struct ext2_dirent *ent = (void *)buffer;
 
 		// While there are files in this block
-		while (ent < buffer + ext2_block_size(sb))
+		while ((uint)ent < (uint)(buffer + ext2_block_size(sb)))
 		{
 			if (ent->inode == 0)
 				return true;
@@ -195,7 +212,7 @@
 
 				memcpy(name, ent->name, ent->name_len);
 				name[ent->name_len] = '\0';
-				
+
 				cb(ent->inode, name, data);
 			}
 
@@ -208,6 +225,32 @@
 	return true;
 }
 
+ssize_t ext2_read_inode(struct ext2_superblock *sb, struct ext2_inode *inode, void *buffer, ssize_t size)
+{
+	const uint block_size = ext2_block_size(sb);
+	char transfer[block_size];
+
+	uint fsize = MIN(inode->size, size);
+	uint i;
+
+	// Transfer full blocks straight to the output buffer
+	for (i = 0; i < fsize / block_size; i++)
+	{
+		ext2_read_inode_block(sb, inode, buffer + i * block_size, i);
+	}
+
+	// If we have part of a block left over read it here first, then transfer what we need
+	if (i * block_size < fsize)
+	{
+		uint remainder = fsize % block_size;
+
+		ext2_read_inode_block(sb, inode, transfer, i);
+		memcpy(buffer + i * block_size, transfer, remainder);
+	}
+
+	return fsize;
+}
+
 bool ext2_read_inode_block(struct ext2_superblock *sb,
 						   struct ext2_inode *inode,
 						   void *buffer,
@@ -223,4 +266,6 @@
 	uint block_address = inode->blocks[block];
 
 	ext2_read_block(sb, buffer, block_address);
+
+	return true;
 }