O problema 7 do posix foi removido gethostbyname
, então não posso mais gethostbyname("my_hostname")
obter o nome de host canônico para minha máquina. Eu tentei usar getnameinfo
em vez disso, mas dado /etc/hosts
como
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
Estou voltando localhost
(o que faz sentido). No entanto gethostbyname("my_hostname")
, retorna my_hostname.fqdn
(pelo menos tanto em musl quanto em glibc).
Existe um substituto razoável para o meu caso de uso na edição 7 ou estou sem sorte neste?
Responder1
Na página de manual do 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 você pode ver, a função getaddrinfo()
também está no padrão POSIX e é suportada...
Responder2
A maneira atual compatível com POSIX de (tentar) determinar o FQDN “canônico” do host atual é chamargethostname()
para determinar o nome do host configurado, entãogetaddrinfo()
para determinar as informações de endereço correspondentes.
Ignorando erros:
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);
}
Os resultados são altamente dependentes da configuração do sistema e do resolvedor.