summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/syscall.c b/syscall.c
index c27c226..6343531 100644
--- a/syscall.c
+++ b/syscall.c
@@ -91,7 +91,7 @@ sys_pipe()
int
sys_write()
{
- int fd, n;
+ int fd, n, ret;
unsigned addr;
struct proc *p = curproc[cpu()];
@@ -103,13 +103,14 @@ sys_write()
return -1;
if(addr + n > p->sz)
return -1;
- return fd_write(p->fds[fd], p->mem + addr, n);
+ ret = fd_write(p->fds[fd], p->mem + addr, n);
+ return ret;
}
int
sys_read()
{
- int fd, n;
+ int fd, n, ret;
unsigned addr;
struct proc *p = curproc[cpu()];
@@ -121,7 +122,25 @@ sys_read()
return -1;
if(addr + n > p->sz)
return -1;
- return fd_read(p->fds[fd], p->mem + addr, n);
+ ret = fd_read(p->fds[fd], p->mem + addr, n);
+ return ret;
+}
+
+int
+sys_close()
+{
+ int fd;
+ struct proc *p = curproc[cpu()];
+
+ if(fetcharg(0, &fd) < 0)
+ return -1;
+ if(fd < 0 || fd >= NOFILE)
+ return -1;
+ if(p->fds[fd] == 0)
+ return -1;
+ fd_close(p->fds[fd]);
+ p->fds[fd] = 0;
+ return 0;
}
int
@@ -138,6 +157,14 @@ sys_exit()
{
struct proc *p;
struct proc *cp = curproc[cpu()];
+ int fd;
+
+ for(fd = 0; fd < NOFILE; fd++){
+ if(cp->fds[fd]){
+ fd_close(cp->fds[fd]);
+ cp->fds[fd] = 0;
+ }
+ }
cp->state = ZOMBIE;
@@ -227,6 +254,9 @@ syscall()
case SYS_read:
ret = sys_read();
break;
+ case SYS_close:
+ ret = sys_close();
+ break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault