Mon, 10 Apr 2023 23:11:34 +0200
9 files changed,
63 insertions(+),
8 deletions(-)
M
include/cedos/fat.h
→
include/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.h
→
include/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.c
→
src/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.c
→
src/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.c
→
src/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.c
→
src/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.c
→
src/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.h
→
src/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; + } +}