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 ( FileDescriptor, ACL, ACLSize)
int FileDescriptor;
struct acl *ACL;
int ACLSize; 描述
chacl 和 fchacl 子例程根据 ACL 参数指向的 AIXC ACL 访问控制表 (ACL) 结构来设置文件的访问控制属性。 请注意,如果与文件系统对象相关联的当前 ACL 的类型不同,或者底层物理文件系统不支持 AIXC ACL 类型,那么这些例程可能会失败。 强烈建议应用程序停止使用这些接口,而改为使用 aclx_get /aclx_fget 和 aclx_put/aclx_fput 子例程来更改 ACL。
参数
| 项 | 描述 |
|---|---|
| 路径 | 指定文件的路径名。 |
| ACL | 指定要在文件上建立的 AIXC ACL。 AIXC ACL 的格式在 sys/acl.h 文件中定义,并包含以下成员:
acl_mode 成员中的以下位是在 sys/mode.h 文件中定义的,对于此子例程很重要:
将忽略该方式中的其他位,包括以下位:
基本 ACL (所有者,组和其他) 的成员可以包含以下位,这些位在 sys/access.h 文件中定义:
|
| FileDescriptor | 指定打开文件的文件描述符。 |
| ACLSize | 指定包含 ACL 的缓冲区的大小。 |
chacl 的 ACL 数据结构
每个访问控制表结构都由一个 struct acl 结构组成,该结构包含一个或多个具有一个或多个 struct ace_id 结构的 struct acl_entry 结构。
如果 struct ace_id 结构将 id_type 设置为 ACEID_USER 或 ACEID_GROUP,那么只有一个 id_data 元素。 要向 ACL 添加多个标识,必须在 id_type 设置为 ACEID_USER 或 ACEID_GROUP时指定多个 struct ace_id 结构。 在这种情况下,不会对多个元素返回任何错误,并且访问检查仅检查第一个元素。 具体而言,不会返回 errno 值 EINVAL ,因为 ACL 结构中的 acl_len 不正确,尽管指定了多个 uid 或 gid。
返回值
成功完成后, chacl 和 fchacl 子例程将返回值 0。 如果chacl或fchacl子程序失败,则返回值为-1,并设置errno全局变量来指示错误。
错误代码
chacl 子例程失败,如果下列一项或多项为真,那么文件的访问控制信息保持不变:
| 项 | 描述 |
|---|---|
| ENOTDIR | Path 前缀的组件不是目录。 |
| ENOENT | Path 的组件不存在或具有不允许截断属性 (请参阅 ulimit 子例程)。 |
| ENOENT | Path 参数为空。 |
| EACCES | 拒绝对 Path 前缀的组件的搜索许可权。 |
| Efault | Path 参数指向进程的已分配地址空间外部的位置。 |
| ESTALE | 进程的根目录或当前目录位于已卸载的虚拟文件系统中。 |
| ELOOP | 转换 Path 参数时迂到太多符号链接。 |
| ENOENT | 指定了符号链接,但它所引用的文件不存在。 |
| ENAMETOOLONG | Path 参数的组件超过 255 个字符,或者整个 Path 参数超过 1023 个字符。 |
chacl 或 fchacl 子例程失败,如果满足下列一个或多个条件,那么文件的访问控制信息保持不变:
| 项 | 描述 |
|---|---|
| EROFS | 由 Path 参数指定的文件位于只读文件系统上。 |
| Efault | ACL 参数指向进程的已分配地址空间外部的位置。 |
| EINVAL | ACL 参数未指向有效的 ACL。 |
| EINVAL | 该acl_lenACL 中的成员无效。 |
| EIO | 操作期间发生 I/O 错误。 |
| ENOSPC | ACL 参数的大小超过了一个内存页面 (4KB) 的系统限制。 |
| EPERM | 有效用户标识与文件所有者的标识不匹配,并且调用者没有 root 用户权限。 |
fchacl 子例程失败,如果以下情况成立,那么文件许可权保持不变:
| 项 | 描述 |
|---|---|
| EBADF | 文件描述符 FileDescriptor 无效。 |
如果在系统上安装了网络文件系统 (NFS) ,那么如果满足以下条件,那么 chacl 和 fchacl 子例程也可能失败:
| 项 | 描述 |
|---|---|
| ETIMEDOUT | 连接超时。 |
安全性
访问控制: 调用者必须具有 Path 前缀的所有组件的搜索许可权。
审计事件:
| 事件 | 信息 |
|---|---|
| chacl | 路径 |
| fchacl | FileDescriptor |