原标题:Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍
2.4.4.6 核心代码注释
1 posix_acl_permission()
int(struct*, const struct*, int)
{
......
/*
* 通过FOREACH_ACL_ENTRY()宏来遍历ACL的列表项,并根据列表项中指定的
* ACL的实体类型进行不同的处理
*/
(,,) {
switch(->) {
case:
if (->==())
goto;
break;
......
.case:
/* 判断组id是否等于当前进程的fsgid,如果不等,接着 * 判断该gid是否位于进程的附加组中
*/
if ((->)) {
= 1;
if ((->&) ==)
goto;
}
break;
......
}
}
return -;
/* 查找ACL的有效权限实体,并对请求的权限进行判断 */
:for (=+1;!=;++) {
if (->==) {
if ((->&->&) ==)
return 0;
return -;
}
}
:/* 如果ACL表项中设置了相应的表项则返回0 */
if ((->&) ==)
return 0;
return -;
}
2.4.5 文件五acl.c2.4.5.1文件描述acl.c的完整文件名称为fs/ext4/acl.c,该文件定义了ACL在ext4文件系统中相关操作的具体实现。
2.4.5.2主要变量及宏定义
对于该文件中涉及的变量及宏的含义参见2.3小节,这里不再赘述。
2.4.5.3结构体定义
对于该文件使用的结构体如posix_acl等参见2.3小节,这里不再赘述。
2.4.5.4 外部函数
对于该文件涉及的外部函数,详见2.3小节,这里不再赘述。
2.4.5.5 内部函数
对于该文件定义的相关函数,下面进行详细解释:
1.ext4_acl_from_disk()
函数原型:static struct*(const void *,);
函数参数:value表示磁盘格式的ACL在缓存中的地址;size表示ACL的长度。
函数功能:将ACL的磁盘表示格式转化为内存表示格式。
返回值:成功执行时返回指向ACL内存表示形式的指针;失败时返回指向相应的错误信息的指针。
2.ext4_acl_to_disk()
函数原型:static void *(const struct*,*);
函数参数:acl指向内存格式的ACL;size表示存放访问控制列表的内存空间的长度。
函数功能:将ACL从内存表示形式转化为磁盘表示形式。
返回值:成功时返回指向磁盘格式的ACL指针;失败时返回相应的指向错误信息的指针。
3.ext4_get_acl()
函数原型:struct*(struct*, int);
函数参数:inode表示要操作的目标文件;type表示访问控制列表的类型。
函数功能:根据参数type指定的类型获取指定索引节点的ACL属性。
返回值:成功时返回指向相应ACL的指针;失败时返回指向错误信息的指针。
4.ext4_set_acl
函数原型:static int(*, struct*, int, struct*);
函数参数:handle表示用于日志处理的原子更新操作;inode表示用于设置的目标文件; type表示访问控制列表的类型;acl指向文件的新的访问控制列表。
函数功能:根据参数acl设置文件的指定类型的访问控制列表ACL。
返回值:成功时返回相应的内部调用函数的返回值;失败时返回相应的错误码。
5.ext4_init_acl()
函数原型:int(*, struct*, struct*);
函数参数:handle表示用于日志处理的原子更新操作;inode表示指向新建文件的索引节点;dir表示文件所属目录的索引节点。
函数功能:初始化一个新文件的ACL。
返回值:成功时返回相应的内部调用函数的返回值;失败时返回相应的错误码。
6.ext4_acl_chmod()
函数原型:int(struct*);
函数参数:inode表示待设置的目标索引节点。
函数功能:在调用chmod命令修改文件的权限时,根据指定的权限来修改目标文件中用于访问控制的ACL。
返回值:成功时返回0;失败时返回相应的错误码。
7.ext4_xattr_list_acl_access()
函数原型:static(struct*, char *,, const char *,, int);
函数参数:dentry指向目标文件对应的目录项;list指向存放扩展属性名字的存储空间;list_len表示存储扩展属性的名字的存储空间的长度;name表示扩展属性的名字;name_len表示扩展属性的名字的长度;type表示访问控制列表的类型。
函数功能:将用于访问控制的ACL对应的扩展属性的名字拷贝到list中。
返回值:返回拷贝的字节数。
8.ext4_xattr_list_acl_default()
函数原型:static(struct*, char *,,const char *,, int);
函数参数:dentry指向目标文件对应的目录项;list指向存放扩展属性名字的存储空间;list_len表示存储扩展属性的名字的存储空间的长度;name表示扩展属性的名字;name_len表示扩展属性的名字的长度;type表示访问控制列表的类型。
函数功能:将文件的默认ACL对应的扩展属性的名字拷贝到list中。
返回值:返回拷贝的字节数。
9.ext4_xattr_get_acl()
函数原型:static int(struct*, const char *, void *,, int);
函数参数:dentry表示目标文件对应的目录项,name表示扩展属性的名字;buffer表示存放扩展属性的缓冲区;size表示缓冲区的长度;type表示ACL的类型。
函数功能:将ACL从内存表示形式转换为磁盘表示形式,并将其存放到扩展属性中。
返回值:返回扩展属性所占用的实际空间的长度。
10.ext4_xattr_set_acl()
函数原型:static int(struct*, const char *, const void *,, int, int);
函数参数:dentry表示目标文件对应的目录项,name表示扩展属性的名字;value表示存放扩展属性的缓冲区;size表示缓冲区的长度;flags表示相应的操作标志,在该函数中未使用该参数;type表示ACL的类型。
函数功能:从扩展属性中获取指定文件的内存表示形式的ACL,并用其设置目标文件的指定类型的ACL属性。
返回值:成功时返回相应的内部调用函数的返回值;失败时返回相应的错误码。返回搜狐,查看更多
责任编辑: