描述
getdevattrs 子例程从特权设备数据库读取一个或多个属性。 使用 Device 参数指定的设备必须包含设备的完整路径,并且存在于特权设备数据库中。 如果数据库未打开,那么此子例程将执行隐式打开以进行读取。
Attributes 参数包含有关要读取的每个属性的信息。 必须在成功调用
getdevattrs 子例程时检查
属性 参数中的每个元素,以确定是否成功检索了
属性 参数。 成功返回的
SEC_CHAR 或
SEC_LIST 属性的值位于已分配的内存中。 调用者需要在使用后释放此内存。
dbattr_t data 结构包含以下字段:
| 项 |
描述 |
| 属性名 |
目标设备属性的名称。 |
| 属性标识 |
此属性由 getdevattrs 子例程在内部使用。 |
| 属性类型 |
目标属性的类型。 |
| 属性标志 |
读取目标属性的请求的结果。 成功完成时,将返回值 0。 否则,返回非零值。 |
| 属性 |
包含所请求查询的返回值的并集。 |
| 属性域 |
子例程将忽略此字段的任何输入。 如果此字段设置为空,那么子例程将此字段设置为在其中找到设备的域的名称。 |
在
usersec.h 文件中定义了
getdevattrs 子例程的以下有效特权设备属性:
| 姓名 |
描述 |
类型 |
| S_PRIVDEVS |
检索特权设备数据库中的所有设备。 仅当 Device 参数设置为 ALL时才有效。 |
SEC_LIST |
| S_READPRIVS |
从设备读取所需的特权。 可以定义 8 个特权。 允许具有任何读特权的进程从设备读取。 |
SEC_LIST |
| S_WRITEPRIVS |
写入设备所需的特权。 可以定义 8 个特权。 允许具有任何写特权的进程写入设备。 |
SEC_LIST |
以下联合成员分别对应于
usersec.h 文件中的
attr_char,
attr_init,
attr_long 和
attr_llong 宏的定义。
| 项 |
描述 |
| au_char |
成功检索属性时, SEC_CHAR 和 SEC_LIST 类型的属性会存储指向此成员中返回的值的指针。 调用者需要释放此内存。 |
| au_int |
SEC_INT 类型的属性的存储位置。 |
| au_long |
SEC_LONG 类型的属性的存储位置。 |
| au_llong |
SEC_LLONG 类型的属性的存储位置。 |
如果为 Device 参数指定了 ALL , S_PRIVDEVS 属性是 Attribute 参数中显示的唯一有效属性。 指定设备名为 ALL 的任何其他属性会导致 getdevattrs 子例程失败。
参数
| 项 |
描述 |
| 设备 |
指定要读取其属性的设备。 |
| 属性 |
指向 dbattr_t 类型的零个或多个元素的数组的指针。 设备属性的列表在 usersec.h 头文件中定义。 |
| COUNT |
Attributes 参数中的数组元素数。 |
安全性
访问的文件:
| 文件 |
方式 |
| /etc/security/privdevs |
r |
返回值
如果特权设备数据库中存在由 Device 参数指定的设备,那么 getdevattrs 子例程将返回零。 成功完成时,必须检查 Attributes 参数中每个元素的 attr_flag 属性以确定是否已成功检索。 如果失败,则返回值为-1,并设置errno值来指示错误。
错误代码
如果
getdevattrs子程序返回-1,则会设置以下其中一个
errno值:
| 项 |
描述 |
| EINVAL |
Device 参数为 NULL 或 default。 |
| EINVAL |
Device 参数为 ALL,但 Attributes 参数包含除 S_PRIVDEVS以外的属性。 |
| EINVAL |
Count 参数小于零。 |
| EINVAL |
Device 参数为 NULL , Count 参数大于零。 |
| ENOENT |
Device 参数中指定的设备不存在。 |
| EPERM |
不允许该操作。 |
如果
getdevattrs 子例程无法查询属性,那么会将下列其中一个错误返回到相应
Attributes 元素的
attr_flag 字段中:
| 项 |
描述 |
| EACCES |
调用者无权访问 attr_name 字段中指定的属性。 |
| EINVAL |
Attributes 参数中的 attr_name 字段不是可识别的设备属性。 |
| EINVAL |
Attributes 参数中的 attr_type 字段包含无效的类型。 |
| EINVAL |
Attributes 参数中的 attr_un 字段未指向有效缓冲区。 |
| ENOATTR |
Attributes 参数中的 attr_name 字段指定有效的属性,但没有为此设备定义任何值。 |
| ENOMEM |
无法分配内存来存储返回值。 |