Problem 7 von POSIX wurde behoben gethostbyname
, sodass ich nicht mehr gethostbyname("my_hostname")
den kanonischen Hostnamen für meine Maschine erhalten kann. Ich habe versucht, getnameinfo
stattdessen zu verwenden, aber es wurde /etc/hosts
wie folgt angezeigt:
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
Ich komme zurück localhost
(was Sinn macht). gethostbyname("my_hostname")
Kehrt jedoch zurück my_hostname.fqdn
(zumindest sowohl unter musl als auch unter glibc).
Gibt es für meinen Anwendungsfall in Ausgabe 7 einen sinnvollen Ersatz oder habe ich hier Pech gehabt?
Antwort1
Aus der Solaris-Manpage:
DESCRIPTION
These functions are used to obtain entries describing hosts.
An entry can come from any of the sources for hosts speci-
fied in the /etc/nsswitch.conf file. See nsswitch.conf(4).
These functions have been superseded by
getipnodebyname(3SOCKET), getipnodebyaddr(3SOCKET), and
getaddrinfo(3SOCKET), which provide greater portability to
applications when multithreading is performed or technolo-
gies such as IPv6 are used. For example, the functions
described in the following cannot be used with applications
targeted to work with IPv6.
Wie Sie sehen, liegt die Funktion getaddrinfo()
auch dem POSIX-Standard bei und wird unterstützt …
Antwort2
Die aktuelle POSIX-kompatible Methode, den „kanonischen“ FQDN des aktuellen Hosts zu ermitteln (zu versuchen), ist der Aufrufgethostname()
um den konfigurierten Hostnamen zu ermitteln, danngetaddrinfo()
um die entsprechenden Adressinformationen zu ermitteln.
Fehler ignorieren:
char buf[256];
struct addrinfo *res, *cur;
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_CANONNAME;
hints.ai_socktype = SOCK_DGRAM;
gethostname(buf, sizeof(buf));
getaddrinfo(buf, 0, &hints, &res);
for (cur = res; cur; cur = cur->ai_next) {
printf("Host name: %s\n", cur->ai_canonname);
}
Die Ergebnisse sind stark von der System- und Resolverkonfiguration abhängig.