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

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

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

  1 /*
  2  * linux/fs/ext2/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/ext2_fs.h>
 11 #include <linux/security.h>
 12 #include "xattr.h"
 13 
 14 static size_t
 15 ext2_xattr_security_list(struct inode *inode, char *list, size_t list_size,
 16                          const char *name, size_t name_len)
 17 {
 18         const int prefix_len = sizeof(XATTR_SECURITY_PREFIX)-1;
 19         const size_t total_len = prefix_len + name_len + 1;
 20 
 21         if (list && total_len <= list_size) {
 22                 memcpy(list, XATTR_SECURITY_PREFIX, prefix_len);
 23                 memcpy(list+prefix_len, name, name_len);
 24                 list[prefix_len + name_len] = '\0';
 25         }
 26         return total_len;
 27 }
 28 
 29 static int
 30 ext2_xattr_security_get(struct inode *inode, const char *name,
 31                        void *buffer, size_t size)
 32 {
 33         if (strcmp(name, "") == 0)
 34                 return -EINVAL;
 35         return ext2_xattr_get(inode, EXT2_XATTR_INDEX_SECURITY, name,
 36                               buffer, size);
 37 }
 38 
 39 static int
 40 ext2_xattr_security_set(struct inode *inode, const char *name,
 41                        const void *value, size_t size, int flags)
 42 {
 43         if (strcmp(name, "") == 0)
 44                 return -EINVAL;
 45         return ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY, name,
 46                               value, size, flags);
 47 }
 48 
 49 int
 50 ext2_init_security(struct inode *inode, struct inode *dir)
 51 {
 52         int err;
 53         size_t len;
 54         void *value;
 55         char *name;
 56 
 57         err = security_inode_init_security(inode, dir, &name, &value, &len);
 58         if (err) {
 59                 if (err == -EOPNOTSUPP)
 60                         return 0;
 61                 return err;
 62         }
 63         err = ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY,
 64                              name, value, len, 0);
 65         kfree(name);
 66         kfree(value);
 67         return err;
 68 }
 69 
 70 struct xattr_handler ext2_xattr_security_handler = {
 71         .prefix = XATTR_SECURITY_PREFIX,
 72         .list   = ext2_xattr_security_list,
 73         .get    = ext2_xattr_security_get,
 74         .set    = ext2_xattr_security_set,
 75 };
 76 

~ [ 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.