所以我试图添加一个服务到NSS(名称服务交换机)。请注意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
因此,大家可以看到,在工作,我期望的那样。迭代调用返回用户,然后调用compat服务,它将从/ etc/passwd返回所有用户。
问题是当我打电话时,“getent passwd myuser”,我得到2的返回值,“在数据库中找不到密钥”。这表明我的_nss_myservice_getpwbynam_r函数没有被调用。任何想法为什么?如果有帮助,我可以提供完整的代码。
,如果你把它叫做'_nss_myservice_getpwnam_r'而不是么?只是一个猜测,但我看到有一个'pwd.h'函数称为'getpwnam_r' – 2013-05-03 23:07:13