Estou tentando resolver um nome de host para um endereço IP usando /etc/hosts
apenas o arquivo.
Isto é, se o nome não puder ser resolvido localmente, ele deve falhar (ou seja, nenhuma solicitação DNS enviada). A maneira padrão de resolver um nome é com getaddrinfo
, mas isso retornará ao DNS.
gethostent_r
parece um bom candidato, pois retorna registros do arquivo de hosts locais, mas infelizmente não recebo registros IPv6, apenas IPv4.
Como posso resolver um nome para um endereço IPv4 ou IPv6 com base apenas no arquivo local /etc/hosts?
Isso não parece certo para mim. Ele deveria retornar ambos os tipos, assumindo que eles estejam realmente em /etc/hosts – mas provavelmente os retornará como duas entradas separadas, conforme ele percorre o arquivo linha por linha.
Outros métodos:
Se você estiver usando glibc, poderá chamar
__nss_configure_lookup("hosts", "files")
– uma função glibc interna que agetent
ferramenta usa para implementar sua-s
opção (como em{"getent", "-s", "hosts", arg}
).Um método um pouco melhor, também para glibc, é diretamente
dlopen()
o módulo "backend" libnss correspondente que é responsável por fornecer pesquisa de nome de host de /etc/hosts; isto é,libnss_files.so.2
. A interface entre glibc e os módulos libnss é um pouco confusa (especialmente as várias funções "hostname" diferentes), mas é estável.Qualquer um deles pode ser preferível a escrever seu próprio analisador, embora não devido ao uso da CPU – mas sim devido à grande chance de seu analisador personalizado ficar incompleto e não corresponder à maneira como o próprio glibc analisa /etc/hosts. Certifique-se de testar seu analisador com múltiplos mapeamentos de endereço para o mesmo nome; múltiplos nomes para o mesmo endereço; mapeamentos mistos de IPv4 e IPv6 para o mesmo nome; etc. Caso contrário, usuários/administradores de sistemas podem ficar muito irritados.
O sistema realmente não "já fez" isso. Na maioria dos sistemas Linux, não há cache central para /etc/hosts; ele é analisado independentemente por cada processo. ( Alguns sistemas podem ter o daemon de cache de pesquisa de nomes de propósito geral 'nscd' em execução, mas isso é incomum.) Então, se você fizer gethostbyname() e deixar libc ler /etc/hosts, isso é realmente o mesmo que analisá-lo você mesmo.