iofunc_check_access()

Проверить права доступа

Прототип:

#include <sys/iofunc.h>
int iofunc_check_access( resmgr_context_t *ctp,
const iofunc_attr_t *attr,
mode_t checkmode,
const struct _client_info *info );

Аргументы:

ctp
Указатель на структуру resmgr_context_t, которую библиотека менеджера ресурсов использует для передачи контекстной информации между функциями.
attr
Указатель на атрибутную запись iofunc_attr_t, которая определяет характеристики устройства, связанного с менеджером ресурсов.
checkmode
Тип и разрешения доступа, которые необходимо проверить.
info
Указатель на структуру struct _client_info который содержит информацию о клиентском соединении. Получить эту структуру можно вызвав функцию iofunc_client_info().

Библиотека:

libc

Описание:

Функция iofunc_check_access() проверяет, доступен ли ресурс для клиента, описанном в info, с режимом доступа checkmode. Режим доступа ресурса определяется полями attr->mode, attr->uid и attr->gid.

Аргумент checkmode определяет, какие проверки нужно выполнить. Состоит из побитового ИЛИ следующих констант:

S_ISUID
Проверяет, что эффективный идентификатор пользователя (UID) клиента равняется UID указанному в attr->uid.
S_ISGID
Проверяет, что эффективный ID группы (GID) или один из дополнительных GID клиента равняется указанному в attr->gid.
S_IREAD
Проверяет, что клиент имеет разрешение для чтения ресурса в соответствии с attr->mode. Если эффективный UID клиента совпадает с attr->uid, то проверка разрешений выполняется по полю владельца attr->mode (восьмеричная маска 0700). Если эффективный UID клиента не совпадает с attr->uid, и эффективный GID клиента совпадает с attr->gid или одним из дополнительных GID клиента, то проверка проводится по полю разрешений группы attr->mode (восьмеричная маска 0070). Если группы не совпадают, то проверка выполняется по полю разрешений для остальных attr->mode (восьмеричная маска 0007).
S_IWRITE
То же, что и S_IREAD, только проверяется разрешение записи.
S_IEXEC
То же, что и S_IREAD, только проверяется разрешение на запуск исполняемого кода (EXECUTE). Обратите внимание, что поскольку большинство менеджеров ресурсов на самом деле не запускают испольняемый код, это разрешение обычно используется для проверки доступности директории.

Флаги S_ISUID и S_ISGID являются взаимоисключающими, пользователь может указать только один из них. В связке с флагами S_ISUID и S_ISGID можно указать флаги: S_IREAD, S_IWRITE, и S_IEXEC. Если флаги не указаны, проверки разрешений выполняются для привилегированного (root) доступа.

Пример с псевдо-кодом для лучшего объяснения:

if superuser:
return (EOK)
if S_ISUID и эффективный UID == UID файла:
return (EOK)
if S_ISGID и эффективный GID == GID файла:
return (EOK)
if S_IREAD или S_IWRITE или S_IEXEC:
if UID вызвавшего == эффективный UID:
if все разрешения установлены в битах разрешений владельца файла:
return (EOK)
else:
return (EACCESS)
if ( GID или дополнительный GID вызвавшего) == эффективный GID:
if все разрешения установлены в битах разрешений группы:
return (EOK)
else:
return (EACCESS)
if все разрешения установлены в битах разрешений для остальных:
return (EOK)
else:
return (EACCESS)
return (EPERM)

Возвращаемое значение:

EACCES
У клиента нет прав доступа для этой операции.
ENOSYS
В аргумент info был передан NULL.
EOK
Успешное завершение.
EPERM
GID или UID не совпадают.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

struct _client_info, iofunc_client_info(), iofunc_open(), iofunc_read_verify(), iofunc_write_verify(), resmgr_context_t




Предыдущий раздел: Описание API системной библиотеки