getdevattrs 子例程

用途

从特权设备数据库检索多个设备属性。

安全性库 (libc.a)

语法

#include <usersec.h>

int getdevattrs(Device, Attributes, Count)
    char *Device;
    dbattr_t *Attributes;
    int Count;

描述

getdevattrs 子例程从特权设备数据库读取一个或多个属性。 使用 Device 参数指定的设备必须包含设备的完整路径,并且存在于特权设备数据库中。 如果数据库未打开,那么此子例程将执行隐式打开以进行读取。

Attributes 参数包含有关要读取的每个属性的信息。 必须在成功调用 getdevattrs 子例程时检查 属性 参数中的每个元素,以确定是否成功检索了 属性 参数。 成功返回的 SEC_CHARSEC_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_charattr_initattr_longattr_llong 宏的定义。
描述
au_char 成功检索属性时, SEC_CHARSEC_LIST 类型的属性会存储指向此成员中返回的值的指针。 调用者需要释放此内存。
au_int SEC_INT 类型的属性的存储位置。
au_long SEC_LONG 类型的属性的存储位置。
au_llong SEC_LLONG 类型的属性的存储位置。

如果为 Device 参数指定了 ALLS_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 参数为 NULLdefault
EINVAL Device 参数为 ALL,但 Attributes 参数包含除 S_PRIVDEVS以外的属性。
EINVAL Count 参数小于零。
EINVAL Device 参数为 NULLCount 参数大于零。
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 无法分配内存来存储返回值。