C语言 添加服务到名称业务交换机



所以我试图添加一个服务到NSS(名称服务开关)。请注意这里关于如何做的GNU指南。我一直在遵循这个指南。我需要实现一个与passwd数据库一起工作的服务。

我遇到的问题是我的模块没有被调用某些函数。让我在这里复制一些我的代码…

enum nss_status
_nss_myservice_setpwent (void) {
 printf( "@ %sn", __FUNCTION__ ) ;
 return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_endpwent (void) {
 printf( "@ %sn", __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( "@ %sn", __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 %sn", __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 %sn", __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函数没有被调用。知道为什么吗?如果有帮助的话,我可以提供完整的代码。

您需要调用函数_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);

相关内容

  • 没有找到相关文章

最新更新