描述
putdevattrs子程序修改特权设备数据库中的一个或多个属性。 如果数据库未打开,那么此子例程将执行隐式打开以进行读取和写入。 设备参数指定的设备必须包含设备的完整路径,并存在于特权设备数据库中。
putdevattrs子程序仅用于修改数据库中现有设备的属性。 要创建或删除设备条目,请使用putdevattr子程序。 由putdevattrs子程序更改的数据必须通过调用putdevattr子程序显式提交,并在类型参数中指定 SEC_COMMIT。 在所有数据提交之前,只有进程中的getdevattr和getdevattrs子程序会返回修改后的数据。 在使用setkst设备将整个数据库发送到内核安全表之前,对特权设备数据库所做的更改不会影响安全考虑。
属性参数包含要更新的每个属性的信息。 在成功调用
putdevattrs子程序时,必须检查
属性参数中指定的每个值,以确定
属性参数是否已成功写入。
dbattr_t 数据结构包含以下字段:
| 项 |
描述 |
| attr_name |
要更新的设备属性的名称。 |
| attr_idx |
该属性由putdevattrs子程序内部使用。 |
| attr_type |
要更新的属性的类型。 |
| attr _flag |
请求更新所需属性的结果。 成功时,将返回值 0。 否则,返回非零值。 |
| attr_un |
包含用于更新所请求属性的值的并集。 |
| attr_domain |
putdevattrs子程序将忽略该字段。 |
以下用于
putdevattrs子程序的有效特权设备属性在
usersec.h文件中定义:
| 名称 |
描述 |
类型 |
| S_READPRIVS |
从设备读取所需的特权。 可以定义 8 个特权。 允许具有任何读特权的进程从设备读取。 |
SEC_LIST |
| S_WRITEPRIVS |
写入设备所需的特权。 可以定义 8 个特权。 允许具有任何写特权的进程写入设备。 |
SEC_LIST |
下面的联合成员分别对应于
usersec.h文件中 "
attr_char, attr_int, attr_long和 "
attr_llong 宏的定义。
| 项 |
描述 |
| au_char |
指向要写入SEC_CHAR和SEC_LIST类型属性值的字符指针。 |
| au_int |
要写入SEC_INT类型属性的整数值。 |
| au_long |
为SEC_LONG类型属性写入的长值。 |
| au_llong |
为SEC_LLONG类型属性写入的长数值。 |
参数
| 项 |
描述 |
| 设备 |
指定要更新其属性的设备名。 |
| 属性 |
指向由 0 个或多个dbattr_t类型元素组成的数组的指针。 设备属性列表在usersec.h头文件中定义。 |
| COUNT |
属性参数中数组元素的个数。 |
安全性
访问的文件:
| 文件 |
方式 |
| /etc/security/privdevs |
rw |
返回值
如果Device参数指定的设备存在于特权设备数据库中,则putdevattrs子程序返回 0,即使Attributes参数中没有任何属性被成功更新。 成功后,必须检查Attributes参数中每个元素的attr_flag属性,以确定是否已成功更新。 如果失败,则返回值为-1,并设置errno值来指示错误。
错误代码
如果
putdevattrs子例程返回-1,则可以设置下列
errno值之一:
| 项 |
描述 |
| EINVAL |
设备参数为NULL、默认或ALL。 |
| EINVAL |
Count 参数小于零。 |
| EINVAL |
属性参数为空,计数 参数大于零。 |
| EINVAL |
Attributes 参数未指向所请求属性的有效数据。 |
| ENOENT |
设备参数中指定的设备不存在。 |
| EPERM |
不允许该操作。 |
如果
putdevattrs子程序更新属性失败,则会在 Attributes 条目指定的值对应的
attr_flag字段中返回以下错误之一:
| 项 |
描述 |
| EACCES |
调用者对特权设备数据库没有写访问权。 |
| EINVAL |
属性"条目中的attr_name字段不是公认的特权设备属性。 |
| EINVAL |
属性 条目中的attr_type字段包含无效类型。 |
| EINVAL |
属性 "条目中的attr_un字段未指向有效缓冲区或此类属性的有效数据。 |