Scroll to navigation

REQUEST_KEY(2) Вызовы системы управления ключами Linux 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 связки ключей:

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

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается request_key() возвращает серийный номер найденного ключа. В случае ошибки возвращается значение -1, а в errno устанавливается код соответствующей ошибки.

ОШИБКИ

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

КОМПОНОВКА

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

СМОТРИТЕ ТАКЖЕ

keyctl(1), add_key(2), keyctl(2), request-key(8)

2010-02-25 Linux