diff --git a/Makefile.build b/Makefile.build index 06c26277e141eb0fe57b90c142ff71a6405e16b0..c54f871c82dabe39e188a5015efd728a413cc9cd 100644 --- a/Makefile.build +++ b/Makefile.build @@ -74,6 +74,8 @@ userprog_SRC += userprog/file_descriptors_map.c 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 b38eccabd22439f474267dc7ae12b07bcf7e4bd5..845508adf10abcae3b2da8702c162ead639ca67a 100644 --- a/userprog/syscall.c +++ b/userprog/syscall.c @@ -88,6 +88,12 @@ syscall_handler (struct intr_frame *f UNUSED) case SYSCALL_TELL: syscall_tell(f); break; + 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 651173b53910e646cfe56c9417fe49a87d495939..8508962b192b2548c16d014234cc2c19b29f37aa 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 new file mode 100644 index 0000000000000000000000000000000000000000..9a665a14a14c72a36a04c1fea7b5766130fdf09b --- /dev/null +++ b/userprog/syscall_seek.c @@ -0,0 +1,22 @@ +/* +* Changes the next byte to be read or written in open file fd to position, +* Expressed in bytes from the beginning of the file. (Thus, a position of 0 +* Is the file�s start.) +* +* Authored by Alex Stratford +*/ + +#include "system_calls.h" +#include <stddef.h> // Dependency for NULL +#include "threads/interrupt.h" // Dependency for intr_frame struct +#include "filesys/file.h" // Dependency for file struct and file_seek function + +void syscall_seek(struct intr_frame *f) { + // pop off first int argument from interrupt frame + int file_descriptor = *((int*)f->esp + 1); + // pop off second int argument from interrupt frame + 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); +} diff --git a/userprog/system_calls.h b/userprog/system_calls.h index ebeed4c37da16c0d0dfdec3ce5df30f25719bc5e..49b8145675f486ef12405293fa3d3678426006d5 100644 --- a/userprog/system_calls.h +++ b/userprog/system_calls.h @@ -75,6 +75,19 @@ void syscall_remove(struct intr_frame *f); */ void syscall_tell(struct intr_frame *f); +/* +* Changes the next byte to be read or written in open file fd to position, +* Expressed in bytes from the beginning of the file. (Thus, a position of 0 +* Is the file�s start.) +*/ +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 */