首页 存档 技术 查看内容

Linux自主访问控制机制模块之详细描述-函数实现机制(9)

2018-3-30 13:00 |来自: 互联网 290 0

摘要: ext4_xattr_get_acl() ext4_xattr_get_acl()函数用于将ACL从内存表示形式转换为磁盘表示形式,并将其存放到扩展属性中,最后返回扩展属性所占用的空间的长度,函数头如下所示: static int ext4_xattr_get_acl(stru ...

ext4_xattr_get_acl()

ext4_xattr_get_acl()函数用于将ACL从内存表示形式转换为磁盘表示形式,并将其存放到扩展属性中,最后返回扩展属性所占用的空间的长度,函数头如下所示:


static int ext4_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer,size_t size, int type)


该函数包含5个参数:dentry表示目标文件对应的目录项,name表示扩展属性的名字;buffer表示用于存放扩展属性的缓冲区;size表示缓冲区的长度;type表示ACL的类型。


图2-20 ext4_xattr_get_acl()函数调用流程图


posix_acl_to_xattr()

如图2-20所示,该函数主要通过posix_acl_to_xattr()函数实现,对于其调用的其余函数,上面已经介绍过,所以下面主要针对posix_acl_to_xattr()函数进行分析。posix_acl_to_xattr()函数用于将内存表示形式的ACL转换为磁盘表示形式,并将其存放到扩展属性中,成功执行时返回扩展属性的长度,函数头如下所示:


int posix_acl_to_xattr(const struct posix_acl *acl, void *buffer, size_t size);


如上所示,该函数包含三个参数:acl表示内存形式的访问控制列表;buffer表示存放扩展属性的缓冲区;size表示缓冲区的长度。


图2-21 posix_acl_to_xattr()函数调用流程图


如图2-21所示,下面结合源码对该函数的执行步骤进行说明:

① 使用参数来初始化扩展属性中用于表示访问控制列表的数据结构posix_acl_xattr_header和posix_acl_xattr_entry。

② 调用posix_acl_xattr_size()函数来获取含有指定数量的ACL表项的访问控制列表在扩展属性中占有的存储空间的大小。

③ 调用cpu_to_le32()函数将一个32位的特定于cpu格式的用于表示ACL的a_version域的数据转化为相应的小端格式。

④ 通过循环将ACL中每个ACL表项中的cpu格式的e_tag、e_perm和e_id转换为相应的小端格式,并存放到指定的扩展属性中。

⑤ 结束并返回扩展属性占有的存储空间的大小。


posix_acl_from_xattr()

与该函数相对应一个函数为posix_acl_from_xattr()。posix_acl_from_xattr()函数用于实现和posix_acl_to_xattr()相反的功能,即从扩展属性中获取内存格式的ACL,其函数头如下所示:


struct posix_acl *posix_acl_from_xattr(const void *value, size_t size)


该函数包含两个参数:value表示扩展属性所在缓冲区;size表示缓冲区的长度。


图2-22 posix_acl_from_xattr()函数调用流程图


如图2-22所示,下面结合源码对该函数的执行步骤进行说明:

① 判断参数的合法性。

② 调用posix_acl_xattr_count()函数来获取扩展属性中所包含的ACL表项的数量。

③ 调用posix_acl_alloc()函数为ACL分配用于存放指定数量的列表项的存储空间。

④ 通过循环将扩展属性中的ACL项的磁盘格式的数据转换为内存格式,并赋值给指定的ACL表项。

⑤ 结束并返回对应的acl。


posix_acl_xattr_entry和posix_acl_xattr_header

事实上,内核中就是通过这两个函数来实现扩展属性和ACL的转换,由上面的分析可知,该过程需要两个数据结构:posix_acl_xattr_entry和posix_acl_xattr_header,其定义在include/linux/posix_acl_xattr.h中,具体定义如下所示:


typedef struct {

__le16 e_tag;

__le16 e_perm;

__le32 e_id;

} posix_acl_xattr_entry;


typedef struct {

__le32 a_version;

posix_acl_xattr_entry a_entries[0];

} posix_acl_xattr_header;


如上所示,对于posix_acl_xattr_entry,该结构用来表示扩展属性中的ACL表项,其各字段的含义和posix_acl_entry中定义的相同;对于posix_acl_xattr_header,该结构用来表示扩展属性中ACL首部,其中a_version字段用于存放ACL的版本,a_entries用于存放ACL表项。该文件还同时定义了ACL所在的扩展属性的名字、支持的ACL的版本号及未定义的列表项的e_id:其定义如下所示:


/* Extended attribute names */

#define POSIX_ACL_XATTR_ACCESS "system.posix_acl_access"

#define POSIX_ACL_XATTR_DEFAULT "system.posix_acl_default"


/* Supported ACL a_version fields */

#define POSIX_ACL_XATTR_VERSION 0x0002


/* An undefined entry e_id value */

#define ACL_UNDEFINED_ID (-1)



声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部