sys_chmod()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Aug 2010 00:15:33 +0000 (17:15 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:52 +0000 (17:35 -0700)
We don't use the mode for anything, but you can set it now!  Huzzah!

kern/include/vfs.h
kern/src/syscall.c
kern/src/vfs.c
tests/file_test.c

index 7244ea7..2a03c79 100644 (file)
@@ -507,6 +507,7 @@ int do_symlink(char *path, const char *symname, int mode);
 int do_link(char *old_path, char *new_path);
 int do_unlink(char *path);
 int do_file_access(char *path, int mode);
+int do_file_chmod(char *path, int mode);
 struct file *dentry_open(struct dentry *dentry, int flags);
 void file_release(struct kref *kref);
 
index 52e9073..8148196 100644 (file)
@@ -998,12 +998,17 @@ intreg_t sys_umask(struct proc *p, int mask)
 
 intreg_t sys_chmod(struct proc *p, const char *path, size_t path_l, int mode)
 {
-       char* fn = user_strdup_errno(p,path,PGSIZE);
-       if(fn == NULL)
+       int retval;
+       char *t_path = user_strdup_errno(p, path, path_l);
+       if (!t_path)
                return -1;
-       int ret = ufe(chmod,PADDR(fn),mode,0,0);
-       user_memdup_free(p,fn);
-       return ret;
+       retval = do_file_chmod(t_path, mode);
+       user_memdup_free(p, t_path);
+       if (retval < 0) {
+               set_errno(-retval);
+               return -1;
+       }
+       return retval;
 }
 
 static intreg_t sys_lseek(struct proc *p, int fd, off_t offset, int whence)
index 3d84be2..2fa4e47 100644 (file)
@@ -1169,9 +1169,9 @@ out_path_only:
        return retval;
 }
 
-/* Checks to see if path can be accessed via mode.  Doesn't do much now.  This
- * is an example of decent error propagation from the lower levels via int
- * retvals. */
+/* Checks to see if path can be accessed via mode.  Need to actually send the
+ * mode along somehow, so this doesn't do much now.  This is an example of
+ * decent error propagation from the lower levels via int retvals. */
 int do_file_access(char *path, int mode)
 {
        struct nameidata nd_r = {0}, *nd = &nd_r;
@@ -1182,6 +1182,24 @@ int do_file_access(char *path, int mode)
        return retval;
 }
 
+int do_file_chmod(char *path, int mode)
+{
+       struct nameidata nd_r = {0}, *nd = &nd_r;
+       int retval = 0;
+       retval = path_lookup(path, 0, nd);
+       if (!retval) {
+               #if 0
+               /* TODO: when we have notions of uid, check for the proc's uid */
+               if (nd->dentry->d_inode->i_uid != UID_OF_ME)
+                       retval = -EPERM;
+               else
+               #endif
+                       nd->dentry->d_inode->i_mode = mode & 0777;
+       }
+       path_release(nd);       
+       return retval;
+}
+
 /* Opens and returns the file specified by dentry */
 struct file *dentry_open(struct dentry *dentry, int flags)
 {
index 24ccf97..610a1ea 100644 (file)
@@ -151,5 +151,11 @@ int main()
                printf("Got CWD (/dir1/dir1-1/): %s\n", cwd);
        free(cwd);
 
+       /* Try a chmod() */
+       printf("Trying a chmod\n");
+       retval = chmod("/dir1/dir1-1/f1-1.txt", S_IRWXO);
+       if (retval < 0)
+               printf("WARNING! chmod failed with %d!\n", retval);
+
        breakpoint();
 }