NSS'ye (Ad Hizmeti Anahtarı) bir hizmet eklemeye çalışıyorum. Lütfen GNU rehberine nasıl yapılacağını unutmayın here. Bu rehberi takip ediyorum. Şifreli veri tabanı ile çalışan bir hizmeti uygulamam gerekiyor.Ad Hizmet Anahtarına Hizmet Ekleme
Sahip olduğum sorun, bazı işlevler için modülüm aranmıyor.
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
basitçe olursa olsun PARAMS ne bir kukla kullanıcı ile sonucu doldurur bir satır içi işlevi olduğunu ... beni burada kodumu bazıları yeniden edelim. aşağıdaki gibiŞimdi benim /etc/nsswitch.conf kurulum var:
passwd: myservice compat
Ve tamamlamak için burada benim Makefile olduğunu.
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
Şimdi bu nss modülü yükledikten sonra komut satırında getent çalıştırın ve burada benim çıkış şudur: Ben beklediğiniz gibi o çalıştığını gördüğünüz gibi
[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
. Kullanıcıyı döndüren yinelemeli çağrı yapılır ve daha sonra/etc/passwd'den tüm kullanıcıyı döndüren vatandaşlık hizmeti çağrılır.
Sorun şu ki, "getent passwd myuser" bu çağrıyı yaptığımda, "Veritabanında anahtar bulunamadı" 2 değerini döndürdüm. Bu bana _nss_myservice_getpwbynam_r işlevinin çağrılmadığını gösterir. Herhangi bir fikir neden? Eğer yardım ederse tam kodu sağlayabilirim.
Ne o 'yerine _nss_myservice_getpwnam_r' çağırırsanız? Sadece bir tahmin, ama bir 'pwd.h' işlevi var' getpwnam_r' –