Handle file creation
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 20 Jan 2014 00:20:48 +0000 (16:20 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 20 Jan 2014 00:20:48 +0000 (16:20 -0800)
Unlike in our nxm port, we handle it in syscall.c.  Aside from it being
easier, inferno's create takes the third parameter (file mode in VFS,
perm in inferno).  We weren't doing a good job in nxm of dealing with
file creation modes either.

Anyway, this gets us into a dev's create method.  Now we need devices
that don't just error out on create.

kern/src/syscall.c

index ca4ea3a..f0dd657 100644 (file)
@@ -1214,6 +1214,18 @@ static intreg_t sys_open(struct proc *p, const char *path, size_t path_l,
        } else {
                unset_errno();  /* Go can't handle extra errnos */
                fd = sysopen(t_path, oflag);
+               /* successful lookup with CREATE and EXCL is an error */
+               if (fd != -1) {
+                       if ((oflag & O_CREATE) && (oflag & O_EXCL)) {
+                               set_errno(EEXIST);
+                               sysclose(fd);
+                               user_memdup_free(p, t_path);
+                               return -1;
+                       }
+               } else {
+                       if (oflag & O_CREATE)
+                               fd = syscreate(t_path, oflag, mode);
+               }
        }
        user_memdup_free(p, t_path);
        printd("File %s Open, fd=%d\n", path, fd);