request_key - запрашивает ключ из системы управления ключами ядра
request_key(2)
запрашивает ключ из системы управления ключами ядра
ОБЗОР
#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
Запрос был прерван сигналом; смотрите signal(7).
EDQUOT
Квота на ключи для данного пользователя была бы превышена, если бы этот ключ
создался или был бы прицеплен в связку ключей.
EKEYEXPIRED
Найден просроченный ключ, и замена не может быть получена.
EKEYREJECTED
Попытка генерации нового ключа была отвергнута.
EKEYREVOKED
Найден отозванный ключ, и замена не может быть получена.
ENOMEM
Недостаточно памяти для создания ключа.
ENOKEY
Искомый ключ не найден.
КОМПОНОВКА
Хотя это и системный вызов Linux, его нет в
libc, но его можно найти в
libkeyutils. При сборке программы компоновщику нужно указать параметр
-lkeyutils.