Итак, я пытаюсь добавить службу в NSS (Name Service Switch). Обратите внимание на руководство GNU о том, как это сделать. here. Я слежу за этим руководством. Мне нужно реализовать службу, которая работает с базой данных passwd.Добавление службы в сервисный коммутатор имен
Проблема, с которой я столкнулся, это мой модуль, который не вызывается для определенных функций. Позвольте мне воспроизвести некоторые из моего кода здесь ...
enum nss_status
_nss_myservice_setpwent (void) {
printf("@ %s\n", __FUNCTION__) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_endpwent (void) {
printf("@ %s\n", __FUNCTION__) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_getpwent_r (struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
static int i = 0 ;
if(i++ == 0) {
printf("@ %s\n", __FUNCTION__) ;
return init_result(result, buffer, buflen, errnop) ;
} else {
i = 0 ;
return NSS_STATUS_NOTFOUND ;
}
} ;
enum nss_status
_nss_myservice_getpwbynam (const char *nam, struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
printf("@ %s with name %s\n", __FUNCTION__, nam) ;
return init_result(result, buffer, buflen, errnop) ;
} ;
enum nss_status
_nss_myservice_getpwbynam_r (const char *nam, struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
printf("@ %s with name_r %s\n", __FUNCTION__, nam) ;
return init_result(result, buffer, buflen, errnop) ;
} ;
Init_result является встроенной функцией, которая просто заполняет в результате фиктивным пользователя, независимо от того, какого PARAMS есть.
Теперь у меня есть мои настройки /etc/nsswitch.conf следующим образом:
passwd: myservice compat
И для полноты картины вот мой Makefile.
all:
gcc -fPIC -shared -o libnss_myservice.so.2 -Wl,-soname,libnss_myservice.so.2 myservice.c
install:
sudo install -m 0644 libnss_myservice.so.2 /lib
sudo /sbin/ldconfig -n /lib /usr/lib
clean:
/bin/rf -rf libnss_myservice.so.2
Теперь после установки этого модуля NSS бегаю getent в командной строке и вот мой результат:
[email protected]:~/nss$ getent passwd
@ _nss_myservice_setpwent
@ _nss_myservice_getpwent_r
myuser:mypass:1:1:realname::
root:x:0:0:root:/root:/bin/bash
...
@ _nss_myservice_endpwent
Так как вы можете видеть, что это работает, как я бы ожидать. Итериальный вызов выполняется, который возвращает пользователя, а затем вызывается служба сопоставления, которая возвращает всех пользователей из/etc/passwd.
Проблема заключается в том, когда я делаю этот вызов, «getent passwd myuser», я получаю возвращаемое значение 2, «Key not found in database». Это показывает, что моя функция _nss_myservice_getpwbynam_r не вызывается. Любые идеи почему? Я могу предоставить полный код, если это поможет.
Что делать, если вы называете это '_nss_myservice_getpwnam_r' вместо этого? Просто догадаться, но я вижу, что есть функция 'pwd.h', называемая' getpwnam_r' –