Член conv()
является указателем на функцию диалога, которая принимает сообщения для передачи пользователю в структуру struct pam_message
и возвращает введенную пользователем информацию в структуру struct pam_response
. Библиотека libpam_misc
предлагает функцию диалога misc_conv
, которая отвечает за работу с текстовыми консольными приложениями. Чтобы использовать ее (мы рекомендуем вам делать это по мере возможности), вам нужно будет включить заголовочный файл
и присвоить члену conv
значение misc_conv
. Этот простой механизм использован в программе pamexample
, представленной в конце этой главы.
Как вариант, вам будет необходимо реализовать свою собственную функцию диалога. Для этого вы должны разобраться еще с двумя структурами данных.
struct pam_message {
int msg_style;
const char * msg;
};
struct pam_response {
char * resp;
int resp_retcode; /*пока что не используется, ожидается нулевое значение*/
};
Функции диалога передается массив указателей на структуры pam_message
и массив указателей на структуры pam_response, каждый из которых имеет длину num_msg
. При получении отклика его необходимо передавать каждой структуре pam_message
в структуре pam_response
с одним и тем же индексом массива, msg_style
может принимать одно из перечисленных ниже значений.
PAM_PROMPT_ECHO_OFF | Выводит текст, определенный в msg как информационный (например, в стандартном дескрипторе выходного файла), просит пользователя об отклике, не отображая введенные символы (например, пароль), и возвращает текст в новую сформированную строку символов, хранящуюся в соответствующей структуре resp pam_response . |
PAM_PROMPT_ECHO_ON | Выводит текст, определенный в msg как информационный (например, в стандартном дескрипторе выходного файла), просит пользователя об отклике, отображая введенные символы (например, имя пользователя), и возвращает текст в новую сформированную строку символов, хранящуюся в соответствующей структуре resp pam_response . |
PAM_ERROR_MSG | Выводит текст, определенный в msg как текст ошибки (например, стандартный дескриптор файла ошибок), присваивает соответствующей структуре resp pam_response значение NULL . |
PAM_TEXT_INFO | Выводит текст, определенный в msg как информационный (например, стандартный дескриптор выходного файла), присваивает структуре resp pam_response значение NULL . |
Остальные значения могут быть определены как расширения стандарта; ваша функция диалога должна игнорировать их, если они не записываются для последующей их обработки, и должна просто передавать им NULL
-отклик. РАМ (вернее, модуль РАМ, производящий запрос) отвечает за освобождение каждой строки resp
, не содержащей NULL
, а также массивов структур pam_message
и pam_response
.
Член appdate_ptr
, который задается в структуре диалога, передается функции диалога. Это будет полезно в тех случаях, когда вы используете одну функцию диалога в нескольких контекстах, или если вы хотите передать контекстную информацию функции диалога. Эта информация может включать спецификацию дисплея X, внутреннюю структуру данных, в которой хранятся описатели файлов для соединения, или любые другие данные, которые могут быть полезны для вашего приложения. В любом случае, эта информация не интерпретируется библиотекой РАМ.
Функция диалога должна вернуть PAM_CONVERR
, если во время выполнения возникнет ошибка, в противном случае — PAM_SUCCESS
.
28.2.2. Действия РАМ