summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-09 19:25:20 +0000
committerkaashoek <kaashoek>2006-08-09 19:25:20 +0000
commit939f9edeac042b2678bd2943a32822fb2eed75b4 (patch)
tree0e7be15b11b6686f406b2bb67aca4781d6792ff7
parent2601de00325bebd850fb74409e77e68d52b7021a (diff)
downloadxv6-labs-939f9edeac042b2678bd2943a32822fb2eed75b4.tar.gz
xv6-labs-939f9edeac042b2678bd2943a32822fb2eed75b4.tar.bz2
xv6-labs-939f9edeac042b2678bd2943a32822fb2eed75b4.zip
iread for T_DEV
O_RDWR, etc. create file
-rw-r--r--fs.c8
-rw-r--r--fs.h4
-rw-r--r--ide.c2
-rw-r--r--syscall.c29
-rw-r--r--userfs.c10
5 files changed, 41 insertions, 12 deletions
diff --git a/fs.c b/fs.c
index d921221..63b480c 100644
--- 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 cce59fb..c3f4e5f 100644
--- 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 af509fc..400b726 100644
--- 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();
diff --git a/syscall.c b/syscall.c
index ba3b25f..eb7ecf3 100644
--- 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);
diff --git a/userfs.c b/userfs.c
index e6dd172..56be4fc 100644
--- 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;