Добавить новую функцию в pam_syslog.c

#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. Я просто изменяю саму библиотеку.