CeDOS - Commit fbd6338f

Added offset to FAT file functions
Celina Sophie Kalus
Sat, 29 Apr 2023 14:31:49 +0200
3 files changed, 33 insertions(+), 7 deletions(-)
M include/cedos/fat.hinclude/cedos/fat.h

@@ -8,7 +8,7 @@

void FAT_init(); int FAT_dir_next(file_t *file, int index, char *fname_buffer); int FAT_openat(file_t *root, file_t *handle, const char *fname, int flags); -uint32_t FAT_read(file_t *file, void *buffer, int count); +uint32_t FAT_read(file_t *file, uint8_t *buffer, uint32_t count); extern file_operations_t FAT_fops;
M src/kernel/elf.csrc/kernel/elf.c

@@ -135,7 +135,7 @@ if (fd == -1) {

printk("Executable file not found: %s\n", fname); return -1; } - int size = file_read(fd, elf_addr, 0); + int size = file_read(fd, elf_addr, 0xFFFF); assert(size != 0); ELF_HEADER *header = (ELF_HEADER*)(elf_addr);
M src/kernel/fat.csrc/kernel/fat.c

@@ -3,6 +3,8 @@ #include "cedos/fat.h"

#include "string.h" #include "assert.h" +#include "cedos/mm/memory.h" + #include <stdint.h> file_operations_t FAT_fops = {

@@ -225,16 +227,40 @@ }

} } -uint32_t FAT_read(file_t *file, void *buffer, int count) { +uint32_t FAT_read(file_t *file, uint8_t *buffer, uint32_t count) { uint16_t cluster = file->fat_cluster; + fpos_t offset = 0; //file->pos; uint32_t size = 0; - while (1) { - buffer = FAT_read_cluster(cluster, buffer); + uint32_t cluster_size = boot_sect->bytes_per_sect * boot_sect->sect_per_cluster; + uint8_t *cluster_buffer = os_kernel_malloc(cluster_size); + + while (offset >= cluster_size) { cluster = FAT_next_cluster(cluster); - size += boot_sect->bytes_per_sect * boot_sect->sect_per_cluster; - + if (cluster == 0xFFF || cluster == 0x000) { return -1; } + offset -= cluster_size; + } + + while (count > 0) { if (cluster == 0xFFF || cluster == 0x000) { break; } + + FAT_read_cluster(cluster, cluster_buffer); + cluster = FAT_next_cluster(cluster); + + uint32_t memcpy_size; + + if (offset + count > cluster_size) { + memcpy_size = (cluster_size - offset); + } else { + memcpy_size = count; + } + + memcpy(buffer, (cluster_buffer + offset), memcpy_size); + + offset = 0; + count -= memcpy_size; + buffer += memcpy_size; + size += memcpy_size; } return size;