diff options
author | rtm <rtm> | 2006-07-01 21:26:01 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-07-01 21:26:01 +0000 |
commit | 8b4e2a08febc8b957b44732dbc7da831479a0005 (patch) | |
tree | 46c3b079ec65f0efbd1f3b603f1b11a3ae09e56d /syscall.c | |
parent | f7cea12b38a86e9b37fa5bc635310d3f85e5f8db (diff) | |
download | xv6-labs-8b4e2a08febc8b957b44732dbc7da831479a0005.tar.gz xv6-labs-8b4e2a08febc8b957b44732dbc7da831479a0005.tar.bz2 xv6-labs-8b4e2a08febc8b957b44732dbc7da831479a0005.zip |
swtch saves callee-saved registers
swtch idles on per-CPU stack, not on calling process's stack
fix pipe bugs
usertest.c tests pipes, fork, exit, close
Diffstat (limited to 'syscall.c')
-rw-r--r-- | syscall.c | 38 |
1 files changed, 34 insertions, 4 deletions
@@ -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 |