2013-05-03 6 views
9

पर सेवा जोड़ना तो मैं एनएसएस (नाम सेवा स्विच) में एक सेवा जोड़ने की कोशिश कर रहा हूं। कृपया इसे कैसे करें here पर जीएनयू गाइड पर ध्यान दें। मैं उस गाइड का पालन कर रहा हूं। मुझे एक सेवा को लागू करने की आवश्यकता है जो 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 एक इनलाइन समारोह है कि बस कोई बात नहीं क्या पैरामीटर हैं एक डमी उपयोगकर्ता के साथ परिणाम में भर जाता है है।

अब मैं अपने /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 

अब इस एनएसएस मॉड्यूल स्थापित करने के बाद मैं कमांड लाइन पर getent चलाने के लिए और यहाँ मेरी उत्पादन होता है:

[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 

तो जैसा कि आप देख सकते हैं कि के रूप में मैं उम्मीद करेंगे काम कर रहा है। पुनरावर्तक कॉल किया जाता है जो उपयोगकर्ता को लौटाता है और फिर कंपैट सेवा कहा जाता है जो सभी उपयोगकर्ता/etc/passwd से लौटाता है।

समस्या यह है कि जब मैं यह कॉल करता हूं, "getent passwd myuser", मुझे 2 का रिटर्न मान मिलता है, "डेटाबेस में कुंजी नहीं मिली"। यह मुझे दिखाता है कि मेरा _nss_myservice_getpwbynam_r फ़ंक्शन नहीं कहा जा रहा है। कोई विचार क्यों? अगर वह मदद करेगा तो मैं पूरा कोड प्रदान कर सकता हूं।

+1

क्या होगा अगर आप इसे 'बजाय _nss_myservice_getpwnam_r' कहते हैं? बस एक अनुमान है, लेकिन मुझे लगता है कि 'getpwnam_r' –

उत्तर

6

आपको _nss_myservice_getpwbynam_r के बजाय फ़ंक्शन _nss_myservice_getpwnam_r पर कॉल करने की आवश्यकता है।

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

नामक एक' pwd.h' फ़ंक्शन है, जो काम करता है। जो मुझे आश्चर्यचकित करता है कि जीएनयू दस्तावेज को क्यों कहा जाता है। (enum nss_status _nss_DATABASE_getdbbyXX_r (पैरा, संरचना * परिणाम, char * buffer, size_t buflen, int * errnop)) क्या मुझे कुछ याद आ रही है? यदि नहीं, तो मैं उन्हें एक नोट भेजूंगा ... –

+0

यहां ग्लिब स्रोत स्रोत में इस कोड का सीधा लिंक है: http://repo.or.cz/w/glibc.git/blob/HEAD:/include/pwd ज # L35 –

संबंधित मुद्दे