Récupération du suffixe de domaine atsortingbué par DHCP dans Linux C

J’essaie de récupérer le suffixe de domaine local de mon hôte par programmation dans ANSI C (Linux). Par exemple: ma machine est ironside.0ffnet.net, je voudrais récupérer “0ffnet.net”.

J’ai vu un certain nombre de messages traitant de cela en utilisant getnameinfo () et getaddrinfo (), mais il semble que ces fonctions extraient leurs informations du fichier / etc / hosts pour toutes les adresses d’interface locales de la machine.

Si une adresse (et le suffixe de domaine correspondant) est atsortingbuée à ma machine via DHCP, le fichier / etc / hosts ne sera pas mis à jour, mais cette information est stockée dans /etc/resolv.conf, par exemple:

dfex@ironside:~/hush$cat /etc/resolv.conf domain 0ffnet.net search 0ffnet.net nameserver 139.130.4.4 

Par conséquent, getnameinfo () et getaddrinfo () renvoient simplement le nom d’hôte de la machine, sans le suffixe, en utilisant les informations / etc / hosts, qui ressemblent à ceci:

 dfex@ironside:~/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 

Est-ce que quelqu’un connaît une fonction qui va extraire cette information sans avoir recours aux appels system ()? J’ai parcouru le guide de Beej sans grand succès.

Je vais devoir briser cette question et répondre aux parties séparément. D’abord la question du titre.

Domaine DHCP

La seule façon de vraiment savoir ce que le client DHCP a reçu du serveur DHCP est de lire les fichiers laissés par le client dans /var/lib/dhcp . Le domaine de recherche suggéré par DHCP pourrait ne pas être utilisé du tout, si quelque chose d’autre a pris le contrôle de resolv.conf .

“le suffixe de domaine local de mon hôte”

Un hôte peut appartenir à plusieurs domaines, ou aucun, ce qui en fait un concept difficile à définir. resolv.conf spécifie les domaines qui seront recherchés pour les noms d’hôte que vous résolvez; Il n’y a aucune garantie fondamentale que la recherche réussisse lorsqu’elle est appliquée à votre propre nom d’hôte.

Peu importe! La liste de recherche du résolveur est ce que je veux vraiment. Comment puis-je l’obtenir?

Appelez res_init , puis regardez _res.dnsrch et / ou _res.defdname . Ou parsing toi-même resolv.conf ; c’est un format assez simple et stable.

Alors, quel est getdomainname () pour?

C’est pour NIS (YP), que vous ne voulez probablement pas.

Vous pourriez essayer d’utiliser:

 int getdomainname(char *name, size_t len); 

Essayez de lancer ce programme:

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

MODIFIER:

Non, après de nombreux essais, je pense que vous devrez utiliser un appel système et un mauvais parsingur C (utiliser AWK dans le popen aurait rendu ce code un peu plus court).

Ce code semble fonctionner pour moi:

 #include  #include  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; } 

Merci @ alan-curry qui m’a définitivement orienté dans la bonne direction. Res_init est certainement la voie à suivre pour quiconque se débat avec cela. Voici un moyen rapide d’obtenir le suffixe de domaine local:

 #include  #include  int main (int argc, char *argv[]) { res_init(); printf ("Default domain: %s\n", _res.defdname); return 0; }