Esta não será uma resposta completa, só quero compartilhar minhas descobertas, e é muito longa para caber nos comentários ...
Primeiro, se você quiser responder em getent
, você precisa ter a configuração correta em /etc/nsswitch.conf
, /etc/resolv.conf
, /etc/hosts
, etc. Eu tenho um Fedora 22 e ele tem a seguinte linha em /etc/nsswitch.conf
.
hosts: files mdns4_minimal [NUTFOUND=return] dns myhostname
getent hosts localhost
e getent hosts LOCALHOST
fornecem resultados diferentes. Mas depois que eu mudei /etc/nsswitch.conf
para ter hosts: files
, eles deram o mesmo resultado.
Acho que quando você tem várias fontes para pesquisar, elas podem tratar o caso de forma diferente e fornecer resultados inconsistentes.
Em segundo lugar, você pode querer experimentar getent ahost
. Usa getaddrinfo()
em vez de gethostbyname2()
. Dá respostas mais consistentes, pelo menos no meu caso. Consulte man getent
.
Em terceiro lugar, achei interessante ler o código-fonte getent.c e observar o rastreamento por %código%. Lá você pode ver ltrace getent hosts localhost
e inet_pton()
. Você também pode rastrear chamadas do sistema por gethostbyname2()
e você pode ver quais arquivos estão abertos, como ltrace -S
.
Abaixo está a saída de /etc/hosts
. AF_INET6 (10) é tentado antes de AF_INET (2).
[a@localhost ~]$ ltrace getent hosts LOCALHOST
__libc_start_main([ "getent", "hosts", "LOCALHOST" ] <unfinished ...>
mtrace() = <void>
setlocale(LC_ALL, "") = "en_US.UTF-8"
textdomain("libc") = "libc"
argp_parse(0x606440, 3, 0x7ffc1cf8a7c8, 0) = 0
strcmp("hosts", "hosts") = 0
inet_pton(10, 0x7ffc1cf8c67a, 0x7ffc1cf8a680, 0) = 0
inet_pton(2, 0x7ffc1cf8c67a, 0x7ffc1cf8a680, 0x658e2f20) = 0
gethostbyname2(0x7ffc1cf8c67a, 10, 0x7ffc1cf8a680, 0x658e2f20) = 0
gethostbyname2(0x7ffc1cf8c67a, 2, -20, 0x7f166586c8f5) = 0x7f1665b16260
inet_ntop(2, 0xc47000, 0x7ffc1cf8a620, 46) = 0x7ffc1cf8a620
printf("%-15s %s", "127.0.0.1", "localhost.localdomain") = 37
__overflow(0x7f1665b13620, 32, 0, 0x7fffffda) = 32
fputs_unlocked(0xc47041, 0x7f1665b13620, 0x7f1665d36025, 0xfbad2a84) = 1
__overflow(0x7f1665b13620, 10, 0xc47050, 0x74736f686c61636f127.0.0.1 localhost.localdomain localhost
) = 10
+++ exited (status 0) +++
Por fim, minha sugestão é 1) controlar a origem de ltrace
em getent
; ou 2) mantenha seu próprio banco de dados / dicionário.