chacl 或 fchacl 子例程

用途

更改文件的 AIXC ACL 类型访问控制信息。

标准 C 库 (libc.a)

语法

#include <sys/acl.h>
#include <sys/mode.h>
int chacl ( Path ACL ACLSize)
char *Path;
struct acl *ACL;
int ACLSize;
int fchacl ( FileDescriptorACLACLSize)
int FileDescriptor;
struct acl *ACL;
int ACLSize;

描述

chaclfchacl 子例程根据 ACL 参数指向的 AIXC ACL 访问控制表 (ACL) 结构来设置文件的访问控制属性。 请注意,如果与文件系统对象相关联的当前 ACL 的类型不同,或者底层物理文件系统不支持 AIXC ACL 类型,那么这些例程可能会失败。 强烈建议应用程序停止使用这些接口,而改为使用 aclx_get /aclx_fgetaclx_put/aclx_fput 子例程来更改 ACL。

参数

描述
路径 指定文件的路径名。
ACL 指定要在文件上建立的 AIXC ACL。 AIXC ACL 的格式在 sys/acl.h 文件中定义,并包含以下成员:
acl_len
指定 ACL (访问控制表) 的大小 (以字节计) ,包括基本条目。

注: 文件的整个 ACL 不能超过一个内存页 (4096 字节)。
acl_mode
指定了文件方式。

acl_mode 成员中的以下位是在 sys/mode.h 文件中定义的,对于此子例程很重要:

S_ISUID
对可执行文件启用 setuid 属性。
S_ISGID
对可执行文件启用 setgid 属性。 在目录上启用组继承属性。
S_ISVTX
启用对目录的链接限制。
S_IXACL
启用扩展 ACL 条目处理。 如果未设置此属性,那么仅基本条目 (所有者,组和缺省值) 用于访问授权检查。

将忽略该方式中的其他位,包括以下位:

u_access
指定文件所有者的访问许可权。
g_access
指定文件组的访问许可权。
o_access
指定 others的缺省类的访问许可权。
acl_ext []
指定此访问控制表的扩展条目的数组。

基本 ACL (所有者,组和其他) 的成员可以包含以下位,这些位在 sys/access.h 文件中定义:

R_ACC
允许读许可权。
W_ACC
允许写许可权。
X_ACC
允许执行或搜索许可权。
FileDescriptor 指定打开文件的文件描述符。
ACLSize 指定包含 ACL 的缓冲区的大小。
注: chacl 子例程需要 PathACLACLSize 参数。 fchacl子程序需要FileDescriptorACLACLSize参数。

chacl 的 ACL 数据结构

每个访问控制表结构都由一个 struct acl 结构组成,该结构包含一个或多个具有一个或多个 struct ace_id 结构的 struct acl_entry 结构。

如果 struct ace_id 结构将 id_type 设置为 ACEID_USERACEID_GROUP,那么只有一个 id_data 元素。 要向 ACL 添加多个标识,必须在 id_type 设置为 ACEID_USERACEID_GROUP时指定多个 struct ace_id 结构。 在这种情况下,不会对多个元素返回任何错误,并且访问检查仅检查第一个元素。 具体而言,不会返回 errno 值 EINVAL ,因为 ACL 结构中的 acl_len 不正确,尽管指定了多个 uid 或 gid。

返回值

成功完成后, chaclfchacl 子例程将返回值 0。 如果chaclfchacl子程序失败,则返回值为-1,并设置errno全局变量来指示错误。

错误代码

chacl 子例程失败,如果下列一项或多项为真,那么文件的访问控制信息保持不变:

描述
ENOTDIR Path 前缀的组件不是目录。
ENOENT Path 的组件不存在或具有不允许截断属性 (请参阅 ulimit 子例程)。
ENOENT Path 参数为空。
EACCES 拒绝对 Path 前缀的组件的搜索许可权。
Efault Path 参数指向进程的已分配地址空间外部的位置。
ESTALE 进程的根目录或当前目录位于已卸载的虚拟文件系统中。
ELOOP 转换 Path 参数时迂到太多符号链接。
ENOENT 指定了符号链接,但它所引用的文件不存在。
ENAMETOOLONG Path 参数的组件超过 255 个字符,或者整个 Path 参数超过 1023 个字符。

chaclfchacl 子例程失败,如果满足下列一个或多个条件,那么文件的访问控制信息保持不变:

描述
EROFS Path 参数指定的文件位于只读文件系统上。
Efault ACL 参数指向进程的已分配地址空间外部的位置。
EINVAL ACL 参数未指向有效的 ACL
EINVAL acl_lenACL 中的成员无效。
EIO 操作期间发生 I/O 错误。
ENOSPC ACL 参数的大小超过了一个内存页面 (4KB) 的系统限制。
EPERM 有效用户标识与文件所有者的标识不匹配,并且调用者没有 root 用户权限。

fchacl 子例程失败,如果以下情况成立,那么文件许可权保持不变:

描述
EBADF 文件描述符 FileDescriptor 无效。

如果在系统上安装了网络文件系统 (NFS) ,那么如果满足以下条件,那么 chaclfchacl 子例程也可能失败:

描述
ETIMEDOUT 连接超时。

安全性

访问控制: 调用者必须具有 Path 前缀的所有组件的搜索许可权。

审计事件:

事件 信息
chacl 路径
fchacl FileDescriptor