Проверить права доступа
#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 );
libc
Функция iofunc_check_access() проверяет, доступен ли ресурс для клиента, описанном в info, с режимом доступа checkmode. Режим доступа ресурса определяется полями attr->mode, attr->uid и attr->gid.
Аргумент checkmode определяет, какие проверки нужно выполнить. Состоит из побитового ИЛИ следующих констант:
0700
). Если эффективный UID клиента не совпадает с attr->uid, и эффективный GID клиента совпадает с attr->gid или одним из дополнительных GID клиента, то проверка проводится по полю разрешений группы attr->mode (восьмеричная маска 0070
). Если группы не совпадают, то проверка выполняется по полю разрешений для остальных attr->mode (восьмеричная маска 0007
). S_IREAD
, только проверяется разрешение записи. 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)
NULL
.ЗОСРВ «Нейтрино»
struct _client_info, iofunc_client_info(), iofunc_open(), iofunc_read_verify(), iofunc_write_verify(), resmgr_context_t
Предыдущий раздел: Описание API системной библиотеки