2009-10-22 9 views
5

का उपयोग कैसे करें मैंने कुछ शोध किया है और मैं अभी भी पासवाइड संरचना के साथ संघर्ष कर रहा हूं।यूनिक्स प्रोग्रामिंग। सुनिश्चित नहीं है कि passwd संरचना

http://www.opengroup.org/onlinepubs/000095399/basedefs/pwd.h.html

मैं हालांकि मुझे लगता है कि मैं बिल्कुल भी यह समझने उपयोग कर रहा हूँ न यूजर आईडी प्राप्त करने के लिए की जरूरत है।

int getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **);

यह विधि कॉल एक संरचना को एक बिंदु देता है जिसमें मुझे आवश्यक सभी डेटा शामिल होंगे। मैं पैरामीटर पर काफी उलझन में हूँ।

संरचना passwd। क्या मुझे इसे पहले घोषित करने की ज़रूरत है? संरचना passwd passwd?

मैं इसका उपयोग करने के तरीके पर पूरी तरह खो गया हूं।

आखिरकार, जब मैं अपना पॉइंटर भरता हूं। डेटा प्राप्त करने के लिए मैं किस कॉल का उपयोग करूंगा? किसी भी मदद के लिए धन्यवाद।

उत्तर

6

getpwuid_r हस्ताक्षर में:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp); 

uid एक इनपुट पैरामीटर है - यह उपयोगकर्ता है कि आप को देखने के लिए चाहते हैं का UID है। शेष अनिवार्य रूप से आउटपुट पैरामीटर हैं: pwbuf द्वारा निर्धारित संरचना पासवर्ड जानकारी से भरी जाएगी, और pwbufp द्वारा इंगित पॉइंटर pwbuf के मान पर सेट किया जाएगा यदि कॉल सफल हुआ (और NULL यदि यह नहीं था)। buf और buflen पैरामीटर की जोड़ी उपयोगकर्ता द्वारा आपूर्ति किए गए बफर निर्दिष्ट करती है जिसका उपयोग struct passwd संरचना के सदस्यों द्वारा इंगित तारों को संग्रहीत करने के लिए किया जाएगा।

तुम इतनी है कि यह प्रयोग करेंगे (इस यूआईडी 101 के साथ उपयोगकर्ता की खोज करता है):

struct passwd pwent; 
    struct passwd *pwentp; 
    char buf[1024]; 

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp)) 
    { 
      perror("getpwuid_r"); 
    } 
    else 
    { 
      printf("Username: %s\n", pwent.pw_name); 
      printf("Real Name: %s\n", pwent.pw_gecos); 
      printf("Home Directory: %s\n", pwent.pw_dir); 
    } 

instread आप अपने आईडी मिल जाए, getpwnam_r का उपयोग करें और pw_uid की जांच करने के नाम से एक उपयोगकर्ता को देखने के लिए चाहते हैं लौटाई गई संरचना का क्षेत्रफल।

+0

अच्छा, मैं getpwuid इस्तेमाल किया है, और आप getpwuid_r इस्तेमाल किया। उम्मीद है कि ओपी की तलाश इन जवाबों में से एक है! – Cascabel

1

ठीक है, सबसे पहले, मुझे पूरा यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं - आपने कहा कि आपको यूआईडी प्राप्त करने की आवश्यकता है, लेकिन Getpwuid यूआईडी के आधार पर अन्य जानकारी देखने के लिए है। क्या आप शायद getpwnam चाहते हैं, जो उपयोगकर्ता नाम के आधार पर दिखता है? और फिर आपको किसी अन्य फ़ंक्शन के लिए यूआईडी का उपयोग करने की आवश्यकता है?

किसी भी मामले में, जो कुछ भी मैं नीचे कहता हूं वह दोनों getpwnam और getpwuid पर लागू होता है - उपयोगकर्ता नाम तर्क के लिए केवल यूआईडी तर्क को स्वैप करें।

आपने अपने दस्तावेज़ को थोड़ा सा मिश्रित कर लिया है। आदमी पृष्ठ से एक लगभग-बोली:

struct passwd *getpwuid(uid_t uid); 

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp); 

getpwuid() फ़ंक्शन एक संरचना पासवर्ड डेटाबेस है कि यूजर आईडी uid मैचों में रिकॉर्ड की टूट-आउट क्षेत्रों युक्त करने के लिए एक सूचक देता है।

getpwuid_r() फ़ंक्शन एक ही जानकारी प्राप्त करता है, लेकिन pwbuf द्वारा इंगित स्थान में पुनर्प्राप्त पासवाइड संरचना को संग्रहीत करता है।

ऐसा लगता है कि आप बस थोड़ा सामान्य रूप में संकेत पर फजी कर रहे हैं।

struct passwd * my_passwd; 
my_passwd = getpwuid(uid); 
// or: 
// my_passwd = getpwnam(username); 

if (my_passwd == NULL) { 
    // the lookup failed - handle the error! 
} else { 
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name); 
    printf("User password: %s\n", my_passwd->pw_passwd); 
    ... 
} 

ध्यान दें कि इस मामले में आप सूचक के लिए स्मृति को आबंटित करने की जरूरत नहीं है: हालांकि, अगर आप इस काम के लिए यह की तरह अपने उद्देश्यों के लिए सरल संस्करण ठीक हो सकता है लगता है के लिए बहुत ज्यादा चिंता की जरूरत नहीं है , क्योंकि getpwuid आवंटित स्मृति और संग्रहीत जानकारी के साथ संरचना में एक सूचक देता है।

संरचना की पूर्ण परिभाषा (अन्य सदस्यों के नाम) मैन पेज में है।

दूसरा रूप है, getpwuid_r, और अधिक सावधान त्रुटि हैंडलिंग और स्मृति प्रबंधन के लिए बेहतर है, लेकिन अगर तुम सब करने की जरूरत है एक त्वरित देखने है, यह ठीक होना चाहिए।

+0

मैं हर किसी की पेशकश की सभी मदद की सराहना करता हूं। मुझे अभी ठीक होना चाहिए। किसी ने मुझे अलग तरीके से समझाया और मैं मूल रूप से शुरू करने के लिए सही रास्ते पर था। यदि आप सोच रहे थे कि मेरे पास एक यूनिक्स प्रोग्रामिंग प्रोजेक्ट है जिसे उसकी निर्देशिका में सभी फ़ाइलों के लिए सभी उपयोगकर्ता अनुमति प्रदर्शित करने की आवश्यकता है। –

2

सबसे पहले, यदि आप यूआईडी प्राप्त करना चाहते हैं, तो संभवतः आपके पास उपयोगकर्ता नाम है, इस मामले में आपको getpwnam_r() का उपयोग करना चाहिए। इस समारोह वास्तव में getpwuid_r() की तरह दूसरे प्रयोग किया जाता है, सिवाय इसके कि आप इसे एक नाम (char *) पहली बार एक पैरामीटर के रूप में गुजरती हैं।

, आप घोषित करने के लिए `struct पासवर्ड 'की जरूरत नहीं है। जब आप pwd.h.

शामिल यह घोषित किया जाता है

तीसरा, समारोह के सटीक हस्ताक्षर है:

int getpwnam_r(const char *name, struct passwd *pwd, 
       char *buf, size_t buflen, struct passwd **result); 

ऊपर में, लोक निर्माण विभाग के एक उत्पादन पैरामीटर है वहीं समारोह अपना पासवर्ड प्रविष्टि देता है, अगर यह पाया जाता है

।।

अन्त में, वहाँ कैसे लिनक्स getpwnam_r मैनपेज में getpwnam_r, here सुलभ उपयोग करने के लिए की एक पूरी उदाहरण है।

1: http://manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html यहाँ

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