लिनक्स सी में DHCP- आबंटित डोमेन प्रत्यय प्राप्त करना




linux dns (2)

मैं अपने होस्ट के स्थानीय डोमेन प्रत्यय को एएनएसआई सी (लिनक्स) में प्रोग्राम के रूप में पुनर्प्राप्त करने की कोशिश कर रहा हूं। उदाहरण: मेरी मशीन ironside.0ffnet.net है, मैं "0ffnet.net" को पुनः प्राप्त करना चाहता हूं।

मैंने getnameinfo () और getaddrinfo () का उपयोग करते हुए यह कई पदों को देखा है, हालांकि ऐसा प्रतीत होता है कि इन फ़ंक्शन ने अपनी जानकारी को / etc / hosts फ़ाइल से किसी भी इंटरफ़ेस के लिए मशीन में स्थानीय पते पर खींच लिया है।

अगर मेरे मशीन को एक पता (और संबंधित डोमेन प्रत्यय) को DHCP के द्वारा आवंटित किया जाता है, तो / etc / hosts फ़ाइल अद्यतन नहीं होती है, इसके बजाय यह सूचना /etc/resolv.conf में संग्रहीत है:

[email protected]:~/hush$cat /etc/resolv.conf 
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4

नतीजतन, getnameinfo () और getaddrinfo () दोनों, मशीन के होस्टनाम को प्रत्यय के बिना, / etc / hosts जानकारी का उपयोग करते हुए वापस आते हैं, जो ऐसा दिखता है:

[email protected]:~/hush$ cat /etc/hosts
::1             ironside localhost6.localdomain6 localhost6
127.0.1.1       ironside
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback

क्या किसी को एक समारोह के बारे में पता है जो सिस्टम () कॉल के सहारे बिना इस जानकारी को खींच देगा? मैं बहुत सफलता के बिना बीज की मार्गदर्शिका के माध्यम से तलाशी ले रहा हूं


आप उपयोग करने का प्रयास कर सकते हैं:

int getdomainname(char *name, size_t len);

इस प्रोग्राम को चलाने का प्रयास करें:

#include <unistd.h>
#include <stdio.h>

int main()
{
 char buf[255];
 getdomainname(buf, 255);
 printf("Domain: %s\n", buf);
 return 0; 
}

संपादित करें:

नहीं, कई प्रयासों के बाद मुझे संदेह है कि आपको एक syscall और बदसूरत सी पार्सर का उपयोग करना होगा ( popen अंदर एडब्ल्यूके का उपयोग करके इस कोड को थोड़ी सी कम कर दिया होता)

यह कोड मेरे लिए काम करता है:

#include <stdio.h>
#include <string.h>

int main()
{
 char buf[255];
 const char reqhostname[255] = "ENTER_YOUR_HOSTNAME_HERE";

 FILE *fd;
 char readbuf[255];
 char *pch;
 int token_counter = 0;

 memset(buf, 0, 255);
 strcat(buf, "host ");
 strcat(buf, reqhostname);
 fd = popen(buf, "r");
 fgets(readbuf, 255, fd);
 printf("Host returned: %s\n", readbuf);
 pclose(fd);

 pch = strtok(readbuf, " ");
 while (pch != NULL)
   {
        strcpy(buf, pch);
        break;
   }

 memset(buf2, 0, 255);
 pch = strtok(buf, ".");
 while (pch != NULL)
   {
        pch = strtok(NULL, ".");
        if (pch == NULL)
           {
                memset(buf, 0, 255);
                strncpy(buf, buf2, strlen(buf2) - 1);
                break;
           }
        token_counter++;
        strcat(buf2, pch);
        strcat(buf2, ".");
   }

 printf("Domain: %s\n", buf);

 return 0;
}

मुझे इस सवाल को अलग करना होगा और भागों के अलग से जवाब देना होगा। पहला शीर्षक प्रश्न

DHCP डोमेन

DHCP सर्वर से DHCP क्लाइंट को क्या प्राप्त हुआ है, यह वास्तव में जानने का एकमात्र तरीका है कि क्लाइंट ने /var/lib/dhcp में छोड़ी गई फ़ाइलों को पढ़ने के लिए है DHCP द्वारा सुझाए गए खोज डोमेन का उपयोग बिल्कुल नहीं किया जा सकता है, अगर कुछ और ने resolv.conf नियंत्रण किया है

"मेरे होस्ट के स्थानीय डोमेन प्रत्यय"

एक मेजबान कई डोमेन, या कोई भी हो सकता है, जिससे यह परिभाषित करने के लिए एक कठिन अवधारणा हो। resolv.conf उन डोमेन को निर्दिष्ट करता है जिन्हें होस्ट नामों के लिए खोजा जाएगा जिन्हें आप हल कर रहे हैं; कोई मौलिक गारंटी नहीं है कि खोज सफल हो जाएगा जब आपके खुद के होस्टनाम पर लागू होगा

जो कुछ! रिज़ॉल्वर खोज सूची मैं वास्तव में क्या चाहता हूं मैं इसे कैसे लूं?

कॉल res_init और फिर _res.dnsrch और / या _res.defdname । या खुद को resolv.conf पार्स; यह एक बहुत सरल और स्थिर प्रारूप है

तो इसके लिए getdomainname () क्या है?

यह एनआईएस (वाईपी) के लिए है, जिसे आप शायद नहीं चाहते हैं





network-programming