From klacke@REDACTED Fri Jun 6 13:09:35 2003 From: klacke@REDACTED (Klacke) Date: Fri, 6 Jun 2003 13:09:35 +0200 Subject: resolver ... again Message-ID: <20030606110935.GA16458@bluetail.com> Howdy, The code in inet_config.erl is not quite right. On linux, the code in the inet_config:init/0 reads /etc/hosts.conf (only) The glibc resolver reads both the /etc/host.conf aswell as /etc/nsswitch.conf A very old system [root@REDACTED /root]# cat /etc/redhat-release Red Hat Linux release 6.2 (Zoot) [root@REDACTED /root]# strace ping -c 1 www.erlang.org 2>&1 | grep '/etc/.*.conf' open("/etc/resolv.conf", O_RDONLY) = 4 open("/etc/nsswitch.conf", O_RDONLY) = 4 read(4, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1767 open("/etc/host.conf", O_RDONLY) = 4 Slightly newer .... # cat /etc/redhat-release Red Hat Linux release 7.3 (Valhalla) # strace ping -c 1 www.erlang.org 2>&1 | grep '/etc/.*.conf' open("/etc/resolv.conf", O_RDONLY) = 3 open("/etc/nsswitch.conf", O_RDONLY) = 3 read(3, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1682 open("/etc/host.conf", O_RDONLY) = 3 And then to the boring part: tita root # uname -a Linux tita 2.4.20-gentoo-r5-1 #1 SMP Wed Jun 4 16:51:01 CEST 2003 i686 Intel(R) Pentium(R) 4 CPU 2.20GHz GenuineIntel GNU/Linux tita root # strace ping -c 1 www.erlang.org 2>&1 | grep '/etc/.*.conf' open("/etc/nsswitch.conf", O_RDONLY) = 3 read(3, "# /etc/nsswitch.conf:\n# $Header:"..., 4096) = 498 open("/etc/resolv.conf", O_RDONLY) = 4 open("/etc/host.conf", O_RDONLY) = -1 ENOENT (No such file or directory) Gentoo doesn't have the /etc/host.conf file. This does indeed make sence, having two _different_ files controling the behaviour of the resolver is broken. The erlang code _only_ reads the /etc/host.conf file, in order to a) work on gentoo b) be more glibc like We should at least also read the /etc/nsswitch.conf file. Preferable we should first read /etc/nsswitch.conf and then if that fails read /etc/host.conf The /etc/hosts.conf file is an old BSDism and I think that very few tools (except OTP then :-) works with that file. Here's a possible patch, reading /etc/hosts.conf first and then /etc/nsswitch.conf But as I wrote, even better would be to read nsswitch before hosts. People are probably more accustomed to changing the nsswitch file than the host file. Enjoy. /klacke -- Claes Wikstrom -- Caps lock is nowhere and Alteon WebSystems -- everything is under control http://www.bluetail.com/~klacke cellphone: +46 70 2097763 -------------- next part -------------- Index: inet_config.erl =================================================================== RCS file: /home/share/erlang/cvsroot/otp/lib/kernel/src/inet_config.erl,v retrieving revision 1.5 diff -c -b -r1.5 inet_config.erl *** inet_config.erl 25 Feb 2003 13:37:22 -0000 1.5 --- inet_config.erl 6 Jun 2003 11:00:35 -0000 *************** *** 82,88 **** 'bsd/os' -> load_resolv(filename:join(Etc,"irs.conf"), host_conf_bsdos); linux -> ! load_resolv(filename:join(Etc,"host.conf"),host_conf_linux), % It may be the case that the domain name was not set % because the hostname was short. But we can now look it --- 82,93 ---- 'bsd/os' -> load_resolv(filename:join(Etc,"irs.conf"), host_conf_bsdos); linux -> ! case load_resolv(filename:join(Etc,"host.conf"),host_conf_linux) of ! ok -> ! ok; ! _Other -> ! load_resolv(filename:join(Etc,"nsswitch.conf"), nsswitch_conf) ! end, % It may be the case that the domain name was not set % because the hostname was short. But we can now look it *************** *** 296,305 **** case apply(inet_parse, Func, [File,{chars,Bin}]) of {ok, Ls} -> inet_db:add_rc_list(Ls); {error, Reason} -> ! error("parse error in file ~s: ~p", [File, Reason]) end; Error -> ! warning("file not found ~s~n", [File]) end. %% --- 301,312 ---- case apply(inet_parse, Func, [File,{chars,Bin}]) of {ok, Ls} -> inet_db:add_rc_list(Ls); {error, Reason} -> ! error("parse error in file ~s: ~p", [File, Reason]), ! {error, Reason} end; Error -> ! warning("file not found ~s~n", [File]), ! Error end. %%