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.
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
.
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.
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.
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; }