#c #syslog #pam
#c #системный журнал #pam
Вопрос:
Мой код использует библиотеку Pam для аутентификации пользователя. При сбое входа в систему. Мне нужно было бы распечатать сообщение системного журнала в определенном формате вместо текущего формата системного журнала в функции pam_vsyslog библиотеки libpam.
Я намерен написать новую функцию, которая будет записывать системный журнал в требуемом формате.
Below are definitions : in file pam_ext.h
extern void PAM_FORMAT((printf, 3, 0)) PAM_NONNULL((3))
pam_kniwx_vsyslog (const pam_handle_t *pamh, int priority,
const char *fmt, va_list args);
extern void PAM_FORMAT((printf, 3, 4)) PAM_NONNULL((3))
pam_kniwx_syslog (const pam_handle_t *pamh, int priority, const char *fmt, ...);
Implementation: libpam/libpam/pam_syslog.c
pam_kniwx_vsyslog (const pam_handle_t *pamh, int priority,
const char *fmt, va_list args)
{
char *msgbuf2 = NULL;
int save_errno = errno;
errno = save_errno;
if (vasprintf (amp;msgbuf2, fmt, args) < 0)
{
syslog (LOG_AUTHPRIV|LOG_ERR, "vasprintf: %m");
_pam_drop (msgbuf1);
return;
}
errno = save_errno;
syslog (LOG_AUTHPRIV|priority, "%s", msgbuf2);
_pam_drop (msgbuf2);
}
void
pam_kniwx_syslog (const pam_handle_t *pamh, int priority,
const char *fmt, ...)
{
va_list args;
va_start (args, fmt);
pam_kniwx_vsyslog (pamh, priority, fmt, args);
va_end (args);
}
В случае сбоя аутентификации я хотел бы вызвать функцию pam_kniwx_syslog из libpam/modules/pam_unix/support.c :
pam_kniwx_syslog(pamh, LOG_NOTICE,
"authentication failure; "
"logname=%s uid=%d euid=%d "
tty=%s ruser=%s rhost=%s "
"%s%s",
new->name, new->uid, new->euid,
tty ? (const char *)tty : "",
ruser ? (const char *)ruser : "",
rhost ? (const char *)rhost : "",
new->user amp;amp; new->user[0] != '')
? " user=" : "",
new->user
);
С этим изменением при компиляции кода я, похоже, сталкиваюсь с неопределенной ссылкой, несмотря на наличие определений и включение файла заголовка.
/usr/src/debug/libpam/1.3.0-r5/libpam-1.3.0/modules/pam_unix/../../../../../../../../libpam/modules/pam_unix/support.c:850: undefined reference to `pam_kniwx_syslog'
collect2: error: ld returned 1 exit status
Makefile:799: recipe for target 'pam_unix.la' failed
make[3]: *** [pam_unix.la] Error 1
make[3]: Leaving directory
Любая помощь в решении проблемы приветствуется.
Комментарии:
1. Вам нужно не только объявить и включить, но и связать с объектным файлом, который реализует эту функцию. Ты?
2. Вы имели в виду, что мне нужно выполнить связывание на уровне функций? Я немного смущен, так как я просто добавляю новую функцию в существующие файлы c библиотеки libpam.
3. Да, но затем вы компилируете свои последующие программы, используя эту библиотеку, против своей измененной копии с новой функцией или неизмененной в обычных s вашей системы
PATH
?4. Определения (libpam/libpam/pam_syslog.c) и вызывающая функция (libpam/modules/pam_unix/support.c) находятся внутри модуля libpam. Я просто изменяю саму библиотеку.