2013-05-03 74 views
9

所以我试图添加一个服务到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函数没有被调用。任何想法为什么?如果有帮助,我可以提供完整的代码。

+1

,如果你把它叫做'_nss_myservice_getpwnam_r'而不是么?只是一个猜测,但我看到有一个'pwd.h'函数称为'getpwnam_r' – 2013-05-03 23:07:13

回答

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文档是这样写的。 (枚举nss_status _nss_DATABASE_getdbbyXX_r(参数,结构*结果,char *缓冲区,size_t buflen,int * errnop))我错过了什么?如果没有,我会给他们发一个笔记... – 2013-05-04 01:53:21

+0

下面是直接链接到glibc源代码库中的代码:http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd .H#L35 – 2014-09-19 15:02:47