2013-05-03 38 views
9

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.

+1

Ne o 'yerine _nss_myservice_getpwnam_r' çağırırsanız? Sadece bir tahmin, ama bir 'pwd.h' işlevi var' getpwnam_r' –

cevap

6

_nss_myservice_getpwbynam_r yerine _nss_myservice_getpwnam_r işlevini çağırmanız gerekir. ftp://ftp.acer-euro.com/gpl/Utility/glibc/glibc-2.2.5.tar/include/pwd.h baktıktan sonra

:

#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

Teşekkürler görüyoruz, bu çalışır. Bu, GNU belgelerinin neden olduğu gibi durduğunu merak ediyor. (enum nss_status _nss_DATABASE_getdbbyXX_r (PARAMS, YAPI * sonuç, char * arabellek, size_t buflen, int * errnop)) Bir şeyi özledim mi? Değilse onlara bir not göndereceğiz ... –

+0

Bu kodun glibc kaynak deposunda doğrudan bağlantısı: http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd .h # L35 –