~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux-2.6.16/fs/ext3/xattr_security.c

Version: ~ [ 2.6.16 ] ~ [ 2.6.17 ] ~
Architecture: ~ [ ia64 ] ~ [ i386 ] ~ [ arm ] ~ [ ppc ] ~ [ sparc64 ] ~

  1 /*
  2  * linux/fs/ext3/xattr_security.c
  3  * Handler for storing security labels as extended attributes.
  4  */
  5 
  6 #include <linux/module.h>
  7 #include <linux/string.h>
  8 #include <linux/fs.h>
  9 #include <linux/smp_lock.h>
 10 #include <linux/ext3_jbd.h>
 11 #include <linux/ext3_fs.h>
 12 #include <linux/security.h>
 13 #include "xattr.h"
 14 
 15 static size_t
 16 ext3_xattr_security_list(struct inode *inode, char *list, size_t list_size,
 17                          const char *name, size_t name_len)
 18 {
 19         const size_t prefix_len = sizeof(XATTR_SECURITY_PREFIX)-1;
 20         const size_t total_len = prefix_len + name_len + 1;
 21 
 22 
 23         if (list && total_len <= list_size) {
 24                 memcpy(list, XATTR_SECURITY_PREFIX, prefix_len);
 25                 memcpy(list+prefix_len, name, name_len);
 26                 list[prefix_len + name_len] = '\0';
 27         }
 28         return total_len;
 29 }
 30 
 31 static int
 32 ext3_xattr_security_get(struct inode *inode, const char *name,
 33                        void *buffer, size_t size)
 34 {
 35         if (strcmp(name, "") == 0)
 36                 return -EINVAL;
 37         return ext3_xattr_get(inode, EXT3_XATTR_INDEX_SECURITY, name,
 38                               buffer, size);
 39 }
 40 
 41 static int
 42 ext3_xattr_security_set(struct inode *inode, const char *name,
 43                        const void *value, size_t size, int flags)
 44 {
 45         if (strcmp(name, "") == 0)
 46                 return -EINVAL;
 47         return ext3_xattr_set(inode, EXT3_XATTR_INDEX_SECURITY, name,
 48                               value, size, flags);
 49 }
 50 
 51 int
 52 ext3_init_security(handle_t *handle, struct inode *inode, struct inode *dir)
 53 {
 54         int err;
 55         size_t len;
 56         void *value;
 57         char *name;
 58 
 59         err = security_inode_init_security(inode, dir, &name, &value, &len);
 60         if (err) {
 61                 if (err == -EOPNOTSUPP)
 62                         return 0;
 63                 return err;
 64         }
 65         err = ext3_xattr_set_handle(handle, inode, EXT3_XATTR_INDEX_SECURITY,
 66                                     name, value, len, 0);
 67         kfree(name);
 68         kfree(value);
 69         return err;
 70 }
 71 
 72 struct xattr_handler ext3_xattr_security_handler = {
 73         .prefix = XATTR_SECURITY_PREFIX,
 74         .list   = ext3_xattr_security_list,
 75         .get    = ext3_xattr_security_get,
 76         .set    = ext3_xattr_security_set,
 77 };
 78 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.