Se eliminó el problema 7 de posix gethostbyname
, por lo que ya no puedo gethostbyname("my_hostname")
obtener el nombre de host canónico para mi máquina. Intenté usarlo getnameinfo
en su lugar, pero me dio /etc/hosts
como
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
Regresaré localhost
(lo cual tiene sentido). Sin embargo, gethostbyname("my_hostname")
regresa my_hostname.fqdn
(al menos tanto en musl como en glibc).
¿Existe un reemplazo razonable para mi caso de uso en el número 7 o no tengo suerte con este?
Respuesta1
Desde la página de manual de Solaris:
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.
Como puede ver, la función getaddrinfo()
también está en el estándar POSIX y es compatible...
Respuesta2
La forma actual compatible con POSIX de (intentar) determinar el FQDN "canónico" del host actual es llamargethostname()
para determinar el nombre de host configurado, luegogetaddrinfo()
para determinar la información de dirección correspondiente.
Ignorando errores:
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);
}
Los resultados dependen en gran medida del sistema y de la configuración del resolutor.