summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c29
1 files changed, 19 insertions, 10 deletions
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);