पर सेवा जोड़ना तो मैं एनएसएस (नाम सेवा स्विच) में एक सेवा जोड़ने की कोशिश कर रहा हूं। कृपया इसे कैसे करें 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 फ़ंक्शन नहीं कहा जा रहा है। कोई विचार क्यों? अगर वह मदद करेगा तो मैं पूरा कोड प्रदान कर सकता हूं।
क्या होगा अगर आप इसे 'बजाय _nss_myservice_getpwnam_r' कहते हैं? बस एक अनुमान है, लेकिन मुझे लगता है कि 'getpwnam_r' –