From 1df54429d71495c3833fc74d29c894a3091e3b7d Mon Sep 17 00:00:00 2001 From: Joshua Saxby <joshua.a.saxby@gmail.com> Date: Thu, 5 Dec 2019 08:29:39 +0000 Subject: [PATCH] Fix both the close() and seek() system calls --- Makefile.build | 1 + userprog/syscall.c | 3 +++ userprog/syscall_close.c | 4 ++-- userprog/syscall_seek.c | 6 +++--- userprog/system_calls.h | 6 ++++++ 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Makefile.build b/Makefile.build index 79cfbd7..c54f871 100644 --- a/Makefile.build +++ b/Makefile.build @@ -75,6 +75,7 @@ userprog_SRC += userprog/syscall_read.c userprog_SRC += userprog/syscall_filesize.c userprog_SRC += userprog/syscall_tell.c userprog_SRC += userprog/syscall_seek.c +userprog_SRC += userprog/syscall_close.c # No virtual memory code yet. #vm_SRC = vm/file.c # Some file. diff --git a/userprog/syscall.c b/userprog/syscall.c index c429f13..845508a 100644 --- a/userprog/syscall.c +++ b/userprog/syscall.c @@ -91,6 +91,9 @@ syscall_handler (struct intr_frame *f UNUSED) case SYSCALL_SEEK: syscall_seek(f); break; + case SYSCALL_CLOSE: + syscall_close(f); + break; default: printf ("WARNING: Invalid Syscall (%d)\n", syscall_number); thread_exit (); diff --git a/userprog/syscall_close.c b/userprog/syscall_close.c index 651173b..8508962 100644 --- a/userprog/syscall_close.c +++ b/userprog/syscall_close.c @@ -14,7 +14,7 @@ void syscall_close(struct intr_frame *f) { // pop off first int argument from interrupt frame - int* file_descriptor = (void*)(*(int*)f->esp + 1); + int file_descriptor = *((int*)f->esp + 1); // Get file associated with file_descriptor struct file *file = get_associated_file_pointer(file_descriptor); if (file == NULL) { // Checking if file is empty or non-existent @@ -25,4 +25,4 @@ void syscall_close(struct intr_frame *f) { file_close(file); // Remove the file_descriptor disassociate_file_descriptor(file_descriptor); -} \ No newline at end of file +} diff --git a/userprog/syscall_seek.c b/userprog/syscall_seek.c index a623496..9a665a1 100644 --- a/userprog/syscall_seek.c +++ b/userprog/syscall_seek.c @@ -13,10 +13,10 @@ void syscall_seek(struct intr_frame *f) { // pop off first int argument from interrupt frame - int* file_descriptor = (void*)*((int*)f->esp + 1); + int file_descriptor = *((int*)f->esp + 1); // pop off second int argument from interrupt frame - int* file_pos = (void*)(*(int*)f->esp + 2); + unsigned file_pos = *((unsigned*)((int*)f->esp + 2)); struct file *file = get_associated_file_pointer(file_descriptor); // Seek through the file file_seek(file, file_pos); -} \ No newline at end of file +} diff --git a/userprog/system_calls.h b/userprog/system_calls.h index 4f955ad..49b8145 100644 --- a/userprog/system_calls.h +++ b/userprog/system_calls.h @@ -82,6 +82,12 @@ void syscall_tell(struct intr_frame *f); */ void syscall_seek(struct intr_frame *f); +/* + * Closes file descriptor fd. Exiting or terminating a process implicitly closes + * all its open file descriptors, as if by calling this function for each one. + */ +void syscall_close(struct intr_frame *f); + /* * special additional stuff for handling file descriptors because they're annoying */ -- GitLab