]> Devi Nivas Git - cs3210-lab1.git/commitdiff
compiling, but untested dup
authorkaashoek <kaashoek>
Sun, 20 Aug 2006 03:33:01 +0000 (03:33 +0000)
committerkaashoek <kaashoek>
Sun, 20 Aug 2006 03:33:01 +0000 (03:33 +0000)
defs.h
fd.c
syscall.c

diff --git a/defs.h b/defs.h
index 18ff4f150cb83e3476e5ddca8f9667ef47aaf4d5..292842834d897b8eca225da6c8703929f43ff8c0 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -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);
diff --git a/fd.c b/fd.c
index 7de4d551447d4ba5c850c49d499c17625bf75bae..e61cab2f216a8ab8b9ba62e4cb417e63a210c9db 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -149,9 +149,3 @@ fd_incref(struct fd *fd)
   fd->ref++;
   release(&fd_table_lock);
 }
-
-int
-fd_dup(struct fd *fd)
-{
-  return -1;
-}
index 5b857bd7eca5cb3b689d52e79fd31d35d03433e3..80d5d8ebff97dd511a0d2e9cdbccd36256d936a1 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -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