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