所以我正在尝试向 NSS(名称服务交换机)添加服务。请注意这里的 GNU指南。我一直在遵循该指南。我需要实现一个与 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,这是我的输出:
username@host:~/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
如您所见,这正如我所期望的那样工作。进行迭代调用以返回用户,然后调用 compat 服务从 /etc/passwd 返回所有用户。
问题是当我调用“getent passwd myuser”时,我得到的返回值为 2,“在数据库中找不到密钥”。这表明我的 _nss_myservice_getpwbynam_r 函数没有被调用。任何想法为什么?如果有帮助,我可以提供完整的代码。