Como consultar meu fqdn no POSIX 2018

Como consultar meu fqdn no POSIX 2018

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 getnameinfoem vez disso, mas dado /etc/hostscomo

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.

informação relacionada