REQUEST_KEY(2)

ИМЯ
request_key - запрашивает ключ из системы управления ключами ядра

ОБЗОР
#include <keyutils.h>

key_serial_t request_key(const char *type, const char *description,
                         const char *callout_info,
                         key_serial_t keyring);

ОПИСАНИЕ
request_key() подает запрос ядру на поиск ключа заданного type, который соответствует указанному описанию description и, если поиск успешен, присоединяет его к указанному keyring и возвращает его серийный номер.

Вызов request_key() выполняет рекурсивный поиск ключа во всех связках ключей в следующем порядке: связки каждой нити, присоединённые к вызвавшему процессу, связки, относящиеся к процессу и связки ключей сеанса.

Если request_key() вызван из программы, вызвавшей request_key() от имени какого-то другого процесс для генерации ключа, то в дальнейшем будет осуществлён поиск по связкам ключей этого другого процесса, используя его UID, GID, группы и контекст безопасности для контроля доступа.

Ключи в каждой связке ищутся и проверяются на совпадение до рекурсивного перехода в дочерние связки. Найдены могут быть только те ключи, которые доступны вызывающему для поиска, и поиск может осуществляться только в доступных для поиска связках ключей.

Если ключ не найден, то, если задан callout_info, эта функция попытается осуществить дальнейший поиск. В этом случае callout_info передаётся службе из пространства пользователя, такой как /sbin/request-key, для генерации ключа.

Если и она завершилась неудачно, то возвращается ошибка, и временный отрицательный ключ будет установлен в назначенную keyring. Он утратит силу через несколько секунд, но пока существует, все последующие вызовы request_key() будут приводить к ошибке.

Серийный номер keyring может задаваться действующей связкой ключей, на которую вызывающий имеет право на запись, или может быть задан специальным ID связки ключей:

KEY_SPEC_THREAD_KEYRING
    Задаёт связку ключей нити вызывающего процесса.

KEY_SPEC_PROCESS_KEYRING
    Задаёт связку ключей процесса.

KEY_SPEC_SESSION_KEYRING
    Задаёт связку ключей сеанса вызывающего процесса.

KEY_SPEC_USER_KEYRING
    Задаёт связку ключей по UID вызывающего процесса.

KEY_SPEC_USER_SESSION_KEYRING
    Задаёт связку ключей по UID сеанса вызывающего процесса.

Если ключ создан, то неважно рабочий он или отрицательный, он будет вытеснять любой другой ключ с тем же типом и описанием из указанной keyring.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении request_key() возвращается серийный номер найденного ключа. В случае ошибки возвращается значение -1, а в errno устанавливается код соответствующей ошибки.

ОШИБКИ

EACCES
    Изменение связки ключей пользователю недоступно.

EINTR
    Запрос был прерван сигналом.

EDQUOT
    Квота на ключи для данного пользователя была бы превышена, если бы этот ключ создался или был бы прицеплен в связку ключей.

EKEYEXPIRED
    Найден просроченный ключ, и замена не может быть получена.

EKEYREJECTED
    Попытка генерации нового ключа была отвергнута.

EKEYREVOKED
    Найден отозванный ключ, и замена не может быть получена.

ENOMEM
    Недостаточно памяти для создания ключа.

ENOKEY
    Искомый ключ не найден.

КОМПОНОВКА
Хотя это и системный вызов Linux, его нет в libc, но его можно найти в libkeyutils. При сборке программы компоновщику нужно указать параметр -lkeyutils.

СМОТРИТЕ ТАКЖЕ
keyctl(1), add_key(2), keyctl(2), request-key(8)