9ns: Support SYS_access (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 1 Mar 2018 20:37:48 +0000 (15:37 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:31:44 +0000 (14:31 -0400)
Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/include/ros/fs.h
kern/src/ns/util.c
kern/src/syscall.c

index 1a4390e..ff96b08 100644 (file)
@@ -860,6 +860,7 @@ uint64_t ns2fastticks(uint64_t);
 int okaddr(uint32_t, uint32_t, int);
 int omode_to_rwx(int);
 int omode_to_9p_accmode(int open_flags);
+int access_bits_to_omode(int access_bits);
 struct block *packblock(struct block *);
 struct block *padblock(struct block *, int);
 
index 4c4c545..3f34935 100644 (file)
@@ -86,6 +86,12 @@ struct kstat {
 /* TODO: have userpsace use our stuff from bits/stats.h */
 #ifdef ROS_KERNEL
 
+/* Access mode bits (unistd.h) */
+#define R_OK 4
+#define W_OK 2
+#define X_OK 1
+#define F_OK 0
+
 /* File creation modes (access controls) */
 #define S_IRWXU 00700  /* user (file owner) has read, write and execute perms */
 #define S_IRUSR 00400  /* user has read permission */
index b3254c6..71ab4cd 100644 (file)
@@ -99,6 +99,19 @@ int omode_to_9p_accmode(int open_flags)
        return acc_opts[open_flags & O_ACCMODE];
 }
 
+int access_bits_to_omode(int access_bits)
+{
+       int omode = 0;
+
+       if (R_OK)
+               omode |= O_READ;
+       if (W_OK)
+               omode |= O_WRITE;
+       if (X_OK)
+               omode |= O_EXEC;
+       return omode;
+}
+
 /* TODO: This assumes UID isn't concurrently changed */
 bool caller_is_username(char *uid)
 {
index daef203..a6cf4b6 100644 (file)
@@ -1964,17 +1964,25 @@ static intreg_t sys_access(struct proc *p, const char *path, size_t path_l,
                            int mode)
 {
        int retval;
+       struct dir *dir;
        char *t_path = copy_in_path(p, path, path_l);
+
        if (!t_path)
                return -1;
-       /* TODO: 9ns support */
        retval = do_access(t_path, mode);
-       free_path(p, t_path);
        printd("Access for path: %s retval: %d\n", path, retval);
        if (retval < 0) {
-               set_errno(-retval);
-               return -1;
+               unset_errno();
+               dir = sysdirstat(t_path);
+               if (!dir)
+                       goto out;
+               if ((mode == F_OK) || caller_has_dir_perms(dir,
+                                            access_bits_to_omode(mode)))
+                       retval = 0;
+               kfree(dir);
        }
+out:
+       free_path(p, t_path);
        return retval;
 }