]> Devi Nivas Git - cs3210-lab0.git/commitdiff
iread for T_DEV
authorkaashoek <kaashoek>
Wed, 9 Aug 2006 19:25:20 +0000 (19:25 +0000)
committerkaashoek <kaashoek>
Wed, 9 Aug 2006 19:25:20 +0000 (19:25 +0000)
O_RDWR, etc.
create file

fs.c
fs.h
ide.c
syscall.c
userfs.c

diff --git a/fs.c b/fs.c
index d921221a325f2bb968be60a31221b44141b8915f..63b480c4d88fd04aa33659b049a8096fbeb4c54c 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -239,6 +239,12 @@ readi(struct inode *ip, void *xdst, uint off, uint n)
   uint target = n, n1;
   struct buf *bp;
 
+  if (ip->type == T_DEV) {
+    if (ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].d_read)
+      return -1;
+    return devsw[ip->major].d_read (ip->minor, xdst, n);
+  }
+
   while(n > 0 && off < ip->size){
     bp = bread(ip->dev, bmap(ip, off / BSIZE));
     n1 = min(n, ip->size - off);
@@ -257,6 +263,8 @@ int
 writei(struct inode *ip, void *addr, uint n)
 {
   if (ip->type == T_DEV) {
+    if (ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].d_write)
+      return -1;
     return devsw[ip->major].d_write (ip->minor, addr, n);
   } else {
     panic ("writei: unknown type\n");
diff --git a/fs.h b/fs.h
index cce59fbb81a372b73936467004d5db598382d297..c3f4e5f85f8e48786e1fe379150af4802dfbd68c 100644 (file)
--- a/fs.h
+++ b/fs.h
@@ -37,3 +37,7 @@ struct dirent {
   char name[DIRSIZ];
 };
 
+#define O_CREATE  0x200
+#define O_RDONLY  0x000
+#define O_WRONLY  0x001
+#define O_RDWR    0x002
diff --git a/ide.c b/ide.c
index af509fcfeaead10413b0c92a9c443482d57eb2c0..400b726efe9e6d787702226945e9bc9a8db6b29d 100644 (file)
--- a/ide.c
+++ b/ide.c
@@ -58,7 +58,7 @@ void
 ide_intr(void)
 {
   acquire(&ide_lock);
-  cprintf("cpu%d: ide_intr\n", cpu());
+  //  cprintf("cpu%d: ide_intr\n", cpu());
   wakeup(&request[tail]);
   release(&ide_lock);
   lapic_eoi();
index ba3b25fe848b5a0759dc2e078229d40c029e475c..eb7ecf36933eb7e243203cf00df8ce8d60163c09 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -252,18 +252,28 @@ sys_open(void)
   uint arg0, arg1;
   int ufd;
   struct fd *fd;
+  struct inode *dp;
+  int l;
 
   if(fetcharg(0, &arg0) < 0 || fetcharg(1, &arg1) < 0)
     return -1;
-  if(checkstring(arg0) < 0)
-    return -1;
-  if((ip = namei(cp->mem + arg0)) == 0)
+  if((l = checkstring(arg0)) < 0)
     return -1;
+  if((ip = namei(cp->mem + arg0)) == 0) {
+    if (arg1 & O_CREATE) {
+      if (l >= DIRSIZ)
+       return -1;
+      dp = iget(rootdev, 1);  // XXX should parse name
+      if (dp->type != T_DIR) 
+       return -1;
+      if ((ip = mknod (dp, cp->mem + arg0, T_FILE, 0, 0)) == 0)
+       return -1;
+    } else return -1;
+  }
   if((fd = fd_alloc()) == 0){
     iput(ip);
     return -1;
   }
-
   if((ufd = fd_ualloc()) < 0){
     iput(ip);
     fd_close(fd);
@@ -272,9 +282,12 @@ sys_open(void)
 
   iunlock(ip);
   fd->type = FD_FILE;
-  if (arg1) {
+  if (arg1 & O_RDWR) {
     fd->readable = 1;
     fd->writeable = 1;
+  } else if (arg1 & O_WRONLY) {
+    fd->readable = 0;
+    fd->writeable = 1;
   } else {
     fd->readable = 1;
     fd->writeable = 0;
@@ -304,13 +317,9 @@ sys_mknod(void)
   if(l >= DIRSIZ)
     return -1;
 
-  dp = iget(rootdev, 1);
-
-  cprintf("root inode type: %d\n", dp->type);
-
+  dp = iget(rootdev, 1);    // XXX should parse name
   if (dp->type != T_DIR) 
     return -1;
-  
   nip = mknod (dp, cp->mem + arg0, (short) arg1, (short) arg2, 
                   (short) arg3);
 
index e6dd1726cd7662985553b257e08d0cf82f7a1737..56be4fc5b57470c05d1fd74be3245bd032611f32 100644 (file)
--- a/userfs.c
+++ b/userfs.c
@@ -20,7 +20,7 @@ main(void)
     puts ("mknod failed\n");
   else
     puts ("made a node\n");
-  fd = open("console", 1);
+  fd = open("console", O_WRONLY);
   if(fd >= 0){
     puts("open console ok\n");
   } else {
@@ -45,6 +45,14 @@ main(void)
   } else {
     puts("open doesnotexist failed\n");
   }
+
+  fd = open("doesnotexist", O_CREATE|O_RDWR);
+  if(fd >= 0){
+    puts("creat doesnotexist succeeded\n");
+  } else {
+    puts("error: creat doesnotexist failed!\n");
+  }
+  close(fd);
   //exec("echo", echo_args);
   exec("cat", cat_args);
   return 0;