2013-05-03 12 views
9

Also ich versuche, einen Dienst zu NSS (Name Service Switch) hinzuzufügen. Bitte beachten Sie die GNU-Anleitung zur Vorgehensweise here. Ich bin diesem Führer gefolgt. Ich muss einen Service implementieren, der mit der passwd-Datenbank funktioniert.Hinzufügen eines Dienstes zu Name Service Switch

Das Problem, das ich habe, ist mein Modul wird nicht für bestimmte Funktionen aufgerufen. Lassen Sie mich hier einige meiner Code reproduzieren ...

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 ist eine Inline-Funktion, die einfach mit einem Dummy-Benutzer egal im Ergebnis füllt, was die PARAMS sind.

Jetzt habe ich meine /etc/nsswitch.conf Setup wie folgt:

passwd:   myservice compat 

Und der Vollständigkeit halber hier ist mein 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 

Jetzt, nach dieser NSS-Modul Installation Ich betreibe getent auf der Linie Befehl und hier ist meine Ausgabe:

[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 

So wie Sie sehen können, dass so funktioniert, wie ich erwarten würde. Der iterative Aufruf wird ausgeführt, der den Benutzer zurückgibt, und dann wird der compat-Dienst aufgerufen, der den gesamten Benutzer aus/etc/passwd zurückgibt.

Das Problem ist, wenn ich diesen Aufruf, "getent passwd myuser", bekomme ich einen Rückgabewert von 2, "Schlüssel nicht in der Datenbank gefunden". Das zeigt mir, dass meine Funktion _nsss_myservice_getpwbynam_r nicht aufgerufen wird. Irgendwelche Ideen warum? Ich kann den kompletten Code zur Verfügung stellen, wenn das helfen würde.

+1

Was ist, wenn Sie es 'statt _nss_myservice_getpwnam_r' nennen? Nur eine Vermutung, aber ich sehe, es gibt eine "pwd.h" -Funktion namens "getpwnam_r" –

Antwort

6

Sie müssen die Funktion _nss_myservice_getpwnam_r anstelle von _nss_myservice_getpwbynam_r aufrufen.

Nach einem Blick auf 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

Danke, das funktioniert. Was mich wundern lässt, warum die GNU-Dokumentation so formuliert ist, wie sie ist. (enum nss_status _nss_DATABASE_getdbbyXX_r (PARAMS, STRUKTUR * Ergebnis, char * Puffer, size_t buflen, int * errnop)) Fehle ich etwas? Wenn nicht, schicke ich ihnen eine Notiz ... –

+0

Hier ist ein direkter Link zu diesem Code im glibc-Quellen-Repository: http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd .h # l35 –

Verwandte Themen