CeDOS - Commit cd629198

Added syscall for iterating through directory
Celina Sophie Kalus
Mon, 10 Apr 2023 23:11:34 +0200
9 files changed, 63 insertions(+), 8 deletions(-)
M include/cedos/fat.hinclude/cedos/fat.h

@@ -4,10 +4,11 @@

#include <stdint.h> void FAT_init(); -void *FAT_read_sector_offset(uint32_t lba, uint32_t *offset); -void *FAT_read_cluster(uint16_t cluster, void *buffer); -uint16_t FAT_next_cluster(uint16_t cluster); +//void *FAT_read_sector_offset(uint32_t lba, uint32_t *offset); +//void *FAT_read_cluster(uint16_t cluster, void *buffer); +//uint16_t FAT_next_cluster(uint16_t cluster); int FAT_root_dir_next(int index, char *fname_buffer, uint16_t *first_cluster, uint32_t *file_size); uint32_t FAT_read_file(const char *fname, void *buffer); +int FAT_dir_next(int fd, int index, char *fname_buffer); #endif
M include/cedos/file.hinclude/cedos/file.h

@@ -9,5 +9,6 @@ int file_open(const char *pathname, int flags);

int file_openat(int fd, const char *fname, int flags); int file_read(int fd, char *buffer, uint32_t size); int file_write(int fd, char *buffer, uint32_t size); +int file_dir_next(int fd, int index, char *fname_buffer); #endif
M src/kernel/elf.csrc/kernel/elf.c

@@ -129,7 +129,10 @@ PRINT_DBG("Loading ELF executable \"%s\".\n", fname);

VIRT_ADDR elf_addr = (VIRT_ADDR*)(0xA0000000); // TODO: needs to change when we have other file systems int fd = file_open(fname, 0); - assert(fd != -1); + if (fd == -1) { + printk("Executable file not found: %s\n", fname); + return -1; + } int size = file_read(fd, elf_addr, 0); assert(size != 0);
M src/kernel/fat.csrc/kernel/fat.c

@@ -90,7 +90,7 @@ return (void*)((uint8_t*)(buffer) + cluster_size);

} int FAT_root_dir_next(int index, char *fname_buffer, uint16_t *first_cluster, uint32_t *file_size) { - memset(fname_buffer, 0, sizeof(fname_buffer)); + //memset(fname_buffer, 0, sizeof(fname_buffer)); while (1) { // index overflow

@@ -137,7 +137,9 @@ continue;

} if (index == 0 && (dir_entry->file_attr & 0x08) && dir_entry->file_size == 0) { - // volume label + // volume label + index++; + continue; } else if ((dir_entry->file_attr & 0x10) && dir_entry->file_size == 0) { // subdirectory

@@ -163,6 +165,17 @@ fname_buffer[12] = 0;

} return index + 1; + } +} + +int FAT_dir_next(int fd, int index, char *fname_buffer) { + uint16_t first_cluster; + uint32_t file_size; + + if (fd == 0x1000) { + return FAT_root_dir_next(index, fname_buffer, &first_cluster, &file_size); + } else { + return -1; } }
M src/kernel/file.csrc/kernel/file.c

@@ -48,4 +48,12 @@ for (uint32_t i = 0; i < size; i++) {

std_con->write_c(buffer[i]); } return size; -}+} + +int file_dir_next(int fd, int index, char *fname_buffer) { + if (fd & 0x1000) { + return FAT_dir_next(fd, index, fname_buffer); + } else { + return -1; + } +}
M src/kernel/syscall.csrc/kernel/syscall.c

@@ -17,7 +17,8 @@ sched_spawn,

sched_wait, file_open, graphics_set_mode, - hard_reset + hard_reset, + file_dir_next }; extern void syscall_interrupt(void);
M src/libcedos/cedos.csrc/libcedos/cedos.c

@@ -63,4 +63,11 @@

void hard_reset() { volatile uint32_t res = 0; interrupt(0x30, res, 8, 0, 0, 0); +} + +int dir_next(int fd, int index, char *fname_buffer) { + void *pointer = (void*)(0); + volatile uint32_t res = 0; + interrupt(0x30, res, 9, fd, index, fname_buffer); + return res; }
M src/libcedos/include/cedos.hsrc/libcedos/include/cedos.h

@@ -19,5 +19,7 @@ int sc_file_openat(int fd, char *buffer, uint32_t size);

void hard_reset(); +int dir_next(int fd, int index, char *fname_buffer); + #endif
A src/shell/ls.c

@@ -0,0 +1,19 @@

+#include "cedos.h" +#include "stdio.h" + +#include <stdint.h> + +void main(char *args) { + char buffer[256]; + + int index = 0; + + while (1) { + int next = dir_next(0x1000, index, buffer); + + if (next == -1) { return; } + + printf("%s\n", buffer); + index = next; + } +}