diff options
author | kaashoek <kaashoek> | 2006-08-20 03:33:01 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-20 03:33:01 +0000 |
commit | f18ab5c04e5380e0fb27f63e8335e5d621315c1d (patch) | |
tree | a18b3e82b414d98277a8f00c842335f7583370c8 | |
parent | 16083d4462b9a57ec1e1fc81cea73da9479982a5 (diff) | |
download | xv6-labs-f18ab5c04e5380e0fb27f63e8335e5d621315c1d.tar.gz xv6-labs-f18ab5c04e5380e0fb27f63e8335e5d621315c1d.tar.bz2 xv6-labs-f18ab5c04e5380e0fb27f63e8335e5d621315c1d.zip |
compiling, but untested dup
-rw-r--r-- | defs.h | 1 | ||||
-rw-r--r-- | fd.c | 6 | ||||
-rw-r--r-- | syscall.c | 29 |
3 files changed, 24 insertions, 12 deletions
@@ -94,7 +94,6 @@ int fd_read(struct fd *fd, char *addr, int n); int fd_write(struct fd *fd, char *addr, int n); int fd_stat(struct fd *fd, struct stat *); void fd_incref(struct fd *fd); -int fd_dup(struct fd *fd); // ide.c void ide_init(void); @@ -149,9 +149,3 @@ fd_incref(struct fd *fd) fd->ref++; release(&fd_table_lock); } - -int -fd_dup(struct fd *fd) -{ - return -1; -} @@ -402,17 +402,36 @@ int sys_dup(void) { struct proc *cp = curproc[cpu()]; - uint fd; - int r; + uint fd, ufd1; + struct fd *fd1; if(fetcharg(0, &fd) < 0) return -1; if(fd < 0 || fd >= NOFILE) return -1; - if(cp->fds[fd] == 0) + if(cp->fds[fd] == 0) return -1; - r = fd_dup (cp->fds[fd]); - return r; + if (cp->fds[fd]->type != FD_PIPE && cp->fds[fd]->type != FD_FILE) + return -1; + + if ((fd1 = fd_alloc()) == 0) { + return -1; + } + if ((ufd1 = fd_ualloc()) < 0) { + fd_close(fd1); + return -1; + } + fd1->type = cp->fds[fd]->type; + fd1->readable = cp->fds[fd]->readable; + fd1->writeable = cp->fds[fd]->writeable; + if (cp->fds[fd]->type == FD_FILE) { + fd1->ip = cp->fds[fd]->ip; + iincref(fd1->ip); + } else if (cp->fds[fd]->type == FD_PIPE) { + fd1->pipe = cp->fds[fd]->pipe; + } + fd1->off = cp->fds[fd]->off; + return ufd1; } int |