2013-05-03 6 views
9

Итак, я пытаюсь добавить службу в 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 не вызывается. Любые идеи почему? Я могу предоставить полный код, если это поможет.

+1

Что делать, если вы называете это '_nss_myservice_getpwnam_r' вместо этого? Просто догадаться, но я вижу, что есть функция 'pwd.h', называемая' getpwnam_r' –

ответ

6

Вы должны позвонить функции _nss_myservice_getpwnam_r вместо _nss_myservice_getpwbynam_r.

Посмотрев на ftp://ftp.acer-euro.com/gpl/Utility/glibc/glibc-2.2.5.tar/include/pwd.h:

#define DECLARE_NSS_PROTOTYPES(service)     \ 
extern enum nss_status _nss_ ## service ## _setpwent (int);  \ 
extern enum nss_status _nss_ ## service ## _endpwent (void);  \ 
extern enum nss_status _nss_ ## service ## _getpwnam_r   \  <<< this line 
         (const char *name, struct passwd *pwd,  \ 
      char *buffer, size_t buflen, int *errnop); \ 
extern enum nss_status _nss_ ## service ## _getpwuid_r   \ 
         (uid_t uid, struct passwd *pwd,   \ 
      char *buffer, size_t buflen, int *errnop); \ 
extern enum nss_status _nss_ ## service ##_getpwent_r   \ 
         (struct passwd *result, char *buffer,  \ 
      size_t buflen, int *errnop); 
+1

Спасибо, это работает. Это заставляет меня задаться вопросом, почему документация GNU сформулирована так, как есть. (enum nss_status _nss_DATABASE_getdbbyXX_r (PARAMS, STRUCTURE * result, char * buffer, size_t buflen, int * errnop)) Я что-то упустил? Если нет, я пришлю им записку ... –

+0

Прямая ссылка на этот код в хранилище источников glibc: http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd .h # L35 –

 Смежные вопросы

  • Нет связанных вопросов^_^