2013-05-03 69 views
9

Vì vậy, tôi đang cố gắng thêm dịch vụ vào NSS (Chuyển đổi dịch vụ tên). Xin lưu ý hướng dẫn GNU về cách thực hiện nó here. Tôi đã làm theo hướng dẫn đó. Tôi cần phải thực hiện một dịch vụ làm việc với cơ sở dữ liệu passwd.Thêm dịch vụ vào dịch vụ chuyển tên dịch vụ

Sự cố tôi gặp phải là mô-đun của tôi không được gọi cho một số chức năng nhất định. Hãy để tôi tái tạo một số mã của tôi ở đây ...

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 là một hàm nội tuyến chỉ đơn giản điền vào kết quả với người dùng giả cho dù PARAMS là gì.

Bây giờ tôi đã thiết lập /etc/nsswitch.conf của tôi như sau:

passwd:   myservice compat 

Và cho đầy đủ ở đây là Makefile của tôi.

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 

Bây giờ sau khi cài đặt mô-đun NSS này tôi chạy getent trên dòng lệnh và đây là kết quả của tôi:

[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 

Như bạn có thể thấy rằng đang làm việc như tôi mong đợi. Cuộc gọi lặp lại được thực hiện để trả về người dùng và sau đó dịch vụ compat được gọi là trả về tất cả người dùng từ/etc/passwd.

Vấn đề là khi tôi thực hiện cuộc gọi này, "getent passwd myuser", tôi nhận được giá trị trả lại là 2, "Khóa không tìm thấy trong cơ sở dữ liệu". Điều này cho thấy hàm _nss_myservice_getpwbynam_r của tôi không được gọi. Bất kỳ ý tưởng tại sao? Tôi có thể cung cấp mã hoàn chỉnh nếu điều đó có thể hữu ích.

+1

gì nếu bạn gọi nó '_nss_myservice_getpwnam_r' để thay thế? Chỉ cần đoán, nhưng tôi thấy có một hàm 'pwd.h' được gọi là' getpwnam_r' –

Trả lời

6

Bạn cần gọi hàm _nss_myservice_getpwnam_r thay vì _nss_myservice_getpwbynam_r.

Sau khi xem xét 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

Cảm ơn, nó hoạt động. Điều này khiến tôi tự hỏi tại sao tài liệu GNU được diễn đạt như vậy. (enum nss_status _nss_DATABASE_getdbbyXX_r (PARAMS, STRUCTURE * kết quả, char * buffer, size_t buflen, int * errnop)) Tôi có thiếu gì đó không? Nếu không, tôi sẽ gửi cho họ một ghi chú ... –

+0

Đây là liên kết trực tiếp tới mã này trong kho lưu trữ nguồn glibc: http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd .h # l35 –

Các vấn đề liên quan