そこで、NSS (Name Service Switch) にサービスを追加しようとしています。方法については、こちらの 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
ご覧のとおり、期待どおりに機能しています。ユーザーを返す反復呼び出しが行われ、次に /etc/passwd からすべてのユーザーを返す compat サービスが呼び出されます。
問題は、「getent passwd myuser」という呼び出しを行うと、「データベースにキーが見つかりません」という戻り値 2 が返されることです。これは、_nss_myservice_getpwbynam_r 関数が呼び出されていないことを示しています。理由はありますか?それが役立つ場合は、完全なコードを提供できます。