diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/core/idt.c | 2 | ||||
-rw-r--r-- | src/kernel/core/kmain.c | 4 | ||||
-rw-r--r-- | src/kernel/include/sct.h (renamed from src/kernel/include/syscall.h) | 2 | ||||
-rw-r--r-- | src/kernel/user/nullfs.c | 58 | ||||
-rw-r--r-- | src/kernel/user/syscall.c | 4 |
5 files changed, 44 insertions, 26 deletions
diff --git a/src/kernel/core/idt.c b/src/kernel/core/idt.c index 0459a21..abab3cc 100644 --- a/src/kernel/core/idt.c +++ b/src/kernel/core/idt.c @@ -4,7 +4,7 @@ #include <string.h> #include <dbglog.h> #include <thread.h> -#include <syscall.h> +#include <sct.h> struct idt_entry { uint16_t base_lo; //Low part of address to jump to diff --git a/src/kernel/core/kmain.c b/src/kernel/core/kmain.c index 9b9a050..73f7610 100644 --- a/src/kernel/core/kmain.c +++ b/src/kernel/core/kmain.c @@ -17,7 +17,7 @@ #include <nullfs.h> #include <process.h> #include <elf.h> -#include <syscall.h> +#include <sct.h> #include <slab_alloc.h> #include <string.h> @@ -102,7 +102,7 @@ void kmain(multiboot_info_t *mbd, int32_t mb_magic) { dbg_printf("Kernel malloc setup ok.\n"); TEST_PLACEHOLDER_AFTER_KMALLOC; - setup_syscalls(); + setup_syscall_table(); dbg_printf("System calls setup ok.\n"); // enter multi-threading mode diff --git a/src/kernel/include/syscall.h b/src/kernel/include/sct.h index 045205f..2d6acd5 100644 --- a/src/kernel/include/syscall.h +++ b/src/kernel/include/sct.h @@ -3,7 +3,7 @@ #include <idt.h> #include <syscallproto.h> -void setup_syscalls(); +void setup_syscall_table(); void syscall_handler(registers_t *regs); diff --git a/src/kernel/user/nullfs.c b/src/kernel/user/nullfs.c index 3065192..50baeff 100644 --- a/src/kernel/user/nullfs.c +++ b/src/kernel/user/nullfs.c @@ -102,14 +102,15 @@ typedef struct { nullfs_item_t *items_list; hashtbl_t *items_idx; - mutex_t lock; // always locked when open (cannot create/delete/move) + mutex_t lock; nullfs_t *fs; } nullfs_dir_t; typedef struct { - nullfs_item_t *it; nullfs_dir_t *d; + int nitems, i; + dirent_t *items; } nullfs_dh_t; typedef struct { @@ -118,7 +119,7 @@ typedef struct { bool own_data; int ok_modes; - mutex_t lock; + mutex_t lock; // locked on open } nullfs_file_t; // No nullfs_file_handle_t struct, we don't need it. The handle's data @@ -241,19 +242,45 @@ bool nullfs_d_open(fs_node_ptr n, int mode, fs_handle_t *s) { if (!got_lock) return false; nullfs_dh_t *h = (nullfs_dh_t*)malloc(sizeof(nullfs_dh_t)); - if (h == 0) { - mutex_unlock(&d->lock); - return false; + if (h == 0) goto fail; + + h->nitems = hashtbl_count(d->items_idx); + if (h->nitems > 0) { + h->items = (dirent_t*)malloc(h->nitems * sizeof(dirent_t)); + if (h->nitems == 0) goto fail; + + int i = 0; + for (nullfs_item_t *it = d->items_list; it != 0; it = it->next) { + strncpy(h->items[i].name, it->name, DIR_MAX); + h->items[i].name[DIR_MAX-1] = 0; // make sur it's null-terminated + if (it->ops->stat) { + it->ops->stat(it->data, &h->items[i].st); + } else { + // no stat operation : should we do something else ? + memset(&h->items[i].st, 0, sizeof(stat_t)); + } + + i++; + } + ASSERT(i == h->nitems); } - h->it = d->items_list; h->d = d; + h->i = 0; s->data = h; s->ops = &nullfs_dh_ops; s->mode = FM_READDIR; + mutex_unlock(&d->lock); + return true; + +fail: + mutex_unlock(&d->lock); + if (h && h->items) free(h->items); + if (h) free(h); + return false; } bool nullfs_d_stat(fs_node_ptr n, stat_t *st) { @@ -445,19 +472,11 @@ void nullfs_d_dispose(fs_node_ptr n) { bool nullfs_dh_readdir(fs_handle_ptr f, dirent_t *d) { nullfs_dh_t *h = (nullfs_dh_t*)f; - if (h->it == 0) { + if (h->i >= h->nitems) { return false; } else { - strncpy(d->name, h->it->name, DIR_MAX); - d->name[DIR_MAX-1] = 0; // make sur it's null-terminated - if (h->it->ops->stat) { - h->it->ops->stat(h->it->data, &d->st); - } else { - // no stat operation : should we do something else ? - memset(&d->st, 0, sizeof(stat_t)); - } - h->it = h->it->next; - + memcpy(d, &h->items[h->i], sizeof(dirent_t)); + h->i++; return true; } } @@ -465,8 +484,7 @@ bool nullfs_dh_readdir(fs_handle_ptr f, dirent_t *d) { void nullfs_dh_close(fs_handle_ptr f) { nullfs_dh_t *h = (nullfs_dh_t*)f; - mutex_unlock(&h->d->lock); - + if (h->items) free(h->items); free(h); } diff --git a/src/kernel/user/syscall.c b/src/kernel/user/syscall.c index eee65d6..8a2cf18 100644 --- a/src/kernel/user/syscall.c +++ b/src/kernel/user/syscall.c @@ -2,7 +2,7 @@ #include <process.h> #include <vfs.h> -#include <syscall.h> +#include <sct.h> typedef struct { uint32_t sc_id, a, b, c, d, e; // a: ebx, b: ecx, c: edx, d: esi, e: edi @@ -274,7 +274,7 @@ static uint32_t get_mode_sc(sc_args_t args) { // SYSCALLS SETUP ROUTINE // // ====================== // -void setup_syscalls() { +void setup_syscall_table() { sc_handlers[SC_EXIT] = exit_sc; sc_handlers[SC_YIELD] = yield_sc; sc_handlers[SC_DBG_PRINT] = dbg_print_sc; |