sys_umask()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 19 Aug 2010 23:34:40 +0000 (16:34 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:52 +0000 (17:35 -0700)
Too bad we don't use the masks or modes for much of anything yet.

kern/src/process.c
kern/src/syscall.c
kern/src/vfs.c

index a5e900a..345f72f 100644 (file)
@@ -320,7 +320,7 @@ error_t proc_alloc(struct proc **pp, struct proc *parent)
        kref_get(&default_ns.kref, 1);
        p->ns = &default_ns;
        spinlock_init(&p->fs_env.lock);
-       p->fs_env.umask = parent ? parent->fs_env.umask : 0002;
+       p->fs_env.umask = parent ? parent->fs_env.umask : S_IWGRP | S_IWOTH;
        p->fs_env.root = p->ns->root->mnt_root;
        kref_get(&p->fs_env.root->d_kref, 1);
        p->fs_env.pwd = parent ? parent->fs_env.pwd : p->fs_env.root;
index b21d0e2..52e9073 100644 (file)
@@ -991,7 +991,9 @@ static intreg_t sys_access(struct proc *p, const char *path, size_t path_l,
 
 intreg_t sys_umask(struct proc *p, int mask)
 {
-       return ufe(umask,mask,0,0,0);
+       int old_mask = p->fs_env.umask;
+       p->fs_env.umask = mask & 0777;
+       return old_mask;
 }
 
 intreg_t sys_chmod(struct proc *p, const char *path, size_t path_l, int mode)
index 37bf96a..3d84be2 100644 (file)
@@ -974,8 +974,10 @@ struct file *do_file_open(char *path, int flags, int mode)
                /* Create the inode/file.  get a fresh dentry too: */
                file_d = get_dentry(nd->dentry->d_sb, nd->dentry, nd->last.name);
                parent_i = nd->dentry->d_inode;
-               /* TODO: mode should be & ~umask.  Note that mode technically should
-                * only apply to future opens, though we apply it immediately. */
+               /* Note that the mode technically should only apply to future opens,
+                * but we apply it immediately. */
+               if (current)
+                       mode &= ~current->fs_env.umask;
                if (create_file(parent_i, file_d, mode)) {
                        kref_put(&file_d->d_kref);
                        path_release(nd);