inet_res.erl

Klacke <>
Mon Nov 25 15:44:50 CET 2002


Folks,

I was looking at inet_res.erl because I wanted to have
gethostbyname/4 with the last arg being the searchlist
for the resolver.

While doing that, I found a couple of bugs in the code as well.
It's almost amusing, but the fact is that nobody has ever run
dns gethostbyname/3 (with a timeout) .. The code is +5 years old :-)

Here's a patch with the bugs fixed + gethostbyname/4.


/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 --------------
*** inet_res.erl.orig	2002-11-25 14:38:13.000000000 +0100
--- inet_res.erl	2002-11-25 14:28:04.000000000 +0100
***************
*** 26,37 ****
  %% (the example is for tcsh)
  
  
! -export([gethostbyname/1, gethostbyname/2, gethostbyname/3,
  	 gethostbyname_tm/3]).
  -export([gethostbyaddr/1, gethostbyaddr/2,
  	 gethostbyaddr_tm/2]).
! -export([getbyname/2, getbyname/3,
! 	 getbyname_tm/3]).
  
  -export([nslookup/3, nslookup/4]).
  -export([nnslookup/4, nnslookup/5]).
--- 26,38 ----
  %% (the example is for tcsh)
  
  
! -export([gethostbyname/1, gethostbyname/2, 
! 	 gethostbyname/3,gethostbyname/4,
  	 gethostbyname_tm/3]).
  -export([gethostbyaddr/1, gethostbyaddr/2,
  	 gethostbyaddr_tm/2]).
! -export([getbyname/2, getbyname/3,getbyname/4,
! 	 getbyname_tm/3, getbyname_tm/4]).
  
  -export([nslookup/3, nslookup/4]).
  -export([nnslookup/4, nnslookup/5]).
***************
*** 43,48 ****
--- 44,50 ----
  -include("inet_dns.hrl").
  -include("inet_int.hrl").
  
+ 
  -ifdef(DEBUG).
  -define(dbg(Fmt, Args), io:format(Fmt, Args)).
  -else.
***************
*** 117,123 ****
  gethostbyaddr(IP,Timeout) ->
      Timer = inet:start_timer(Timeout),
      Res = gethostbyaddr_tm(IP,Timer),
!     inet:stop_timer(Timeout),
      Res.    
  
  gethostbyaddr_tm({A,B,C,D}, Timer) when ?ip(A,B,C,D) ->
--- 119,125 ----
  gethostbyaddr(IP,Timeout) ->
      Timer = inet:start_timer(Timeout),
      Res = gethostbyaddr_tm(IP,Timer),
!     inet:stop_timer(Timer),
      Res.    
  
  gethostbyaddr_tm({A,B,C,D}, Timer) when ?ip(A,B,C,D) ->
***************
*** 201,219 ****
  gethostbyname(Name,Family) ->
      gethostbyname_tm(Name,Family,false).
  
  gethostbyname(Name,Family,Timeout) ->
      Timer = inet:start_timer(Timeout),    
      Res = gethostbyname_tm(Name,Family,Timer),
!     inet:stop_timer(Timeout),
      Res.
!     
! gethostbyname_tm(Name,inet,Timer) ->
!     getbyname_tm(Name,?S_A,Timer);
! gethostbyname_tm(Name,inet6,Timer) ->
!     case getbyname_tm(Name,?S_AAAA,Timer) of
  	{ok,HEnt} -> {ok,HEnt};
  	{error,nxdomain} ->
! 	    case getbyname_tm(Name, ?S_A,Timer) of
  		{ok, HEnt} ->
  		    %% rewrite to a ipv4 only ipv6 address
  		    {ok,
--- 203,233 ----
  gethostbyname(Name,Family) ->
      gethostbyname_tm(Name,Family,false).
  
+ 
  gethostbyname(Name,Family,Timeout) ->
      Timer = inet:start_timer(Timeout),    
      Res = gethostbyname_tm(Name,Family,Timer),
!     inet:stop_timer(Timer),
      Res.
! gethostbyname(Name,Family,Timeout, SearchList) ->
!     Timer = inet:start_timer(Timeout),    
!     Res = gethostbyname_tm(Name,Family,Timer, SearchList),
!     inet:stop_timer(Timer),
!     Res.
! 
! 
! 
! 
! gethostbyname_tm(Name, Family, Timer) ->
!     gethostbyname_tm(Name, Family, Timer, get_searchlist()).
! 
! gethostbyname_tm(Name,inet,Timer, SearchList) ->
!     getbyname_tm(Name,?S_A,Timer, SearchList);
! gethostbyname_tm(Name,inet6,Timer,SearchList) ->
!     case getbyname_tm(Name,?S_AAAA,Timer, SearchList) of
  	{ok,HEnt} -> {ok,HEnt};
  	{error,nxdomain} ->
! 	    case getbyname_tm(Name, ?S_A,Timer, SearchList) of
  		{ok, HEnt} ->
  		    %% rewrite to a ipv4 only ipv6 address
  		    {ok,
***************
*** 232,238 ****
  	Error ->
  	    Error
      end;
! gethostbyname_tm(Name,Family,Timer) ->
      {error, einval}.
  	    
  %% --------------------------------------------------------------------------
--- 246,252 ----
  	Error ->
  	    Error
      end;
! gethostbyname_tm(Name,Family,Timer, SearchList) ->
      {error, einval}.
  	    
  %% --------------------------------------------------------------------------
***************
*** 246,259 ****
  
  getbyname(Name, Type) -> 
      getbyname_tm(Name,Type,false).
- 
  getbyname(Name, Type, Timeout) ->
      Timer = inet:start_timer(Timeout),
!     Res = getbyname_tm(Name, Type, Timer),
!     inet:stop_timer(Timeout),
      Res.
  
! getbyname_tm(Name, Type, Timer) when list(Name) ->
      case type_p(Type) of
  	true ->
  	    case inet_parse:visible_string(Name) of
--- 260,279 ----
  
  getbyname(Name, Type) -> 
      getbyname_tm(Name,Type,false).
  getbyname(Name, Type, Timeout) ->
+     getbyname(Name, Type, Timeout, get_searchlist()).
+ 
+ getbyname(Name, Type, Timeout, Slist) ->
      Timer = inet:start_timer(Timeout),
!     Res = getbyname_tm(Name, Type, Timer, Slist),
!     inet:stop_timer(Timer),
      Res.
  
! 
! getbyname_tm(Name, Type, Timer)  ->
!     getbyname_tm(Name, Type, Timer, get_searchlist()).
! 
! getbyname_tm(Name, Type, Timer, SearchList) when list(Name) ->
      case type_p(Type) of
  	true ->
  	    case inet_parse:visible_string(Name) of
***************
*** 261,275 ****
  		true ->
  		    case inet_db:getbyname(Name,Type) of
  			{ok, HEnt} -> {ok, HEnt};
! 			_ -> res_getbyname(Name,Type,Timer)
  		    end
  	    end;
  	false ->
  	    {error, formerr}
      end;
! getbyname_tm(Name,Type,Timer) when atom(Name) ->
!     getbyname_tm(atom_to_list(Name), Type,Timer);
! getbyname_tm(_, _, _) -> {error, formerr}.
  
  type_p(Type) ->
      lists:member(Type, [?S_A, ?S_AAAA, ?S_MX, ?S_NS,
--- 281,295 ----
  		true ->
  		    case inet_db:getbyname(Name,Type) of
  			{ok, HEnt} -> {ok, HEnt};
! 			_ -> res_getbyname(Name,Type,Timer, SearchList)
  		    end
  	    end;
  	false ->
  	    {error, formerr}
      end;
! getbyname_tm(Name,Type,Timer, SearchList) when atom(Name) ->
!     getbyname_tm(atom_to_list(Name), Type,Timer, SearchList);
! getbyname_tm(_, _, _,_) -> {error, formerr}.
  
  type_p(Type) ->
      lists:member(Type, [?S_A, ?S_AAAA, ?S_MX, ?S_NS,
***************
*** 278,293 ****
  		        ?S_WKS, ?S_HINFO, ?S_TXT, ?S_SRV,
  		        ?S_UINFO, ?S_UID, ?S_GID]).
  	    
! res_getbyname(Name,Type,Timer) ->
      case dots(Name) of
  	{0, Dot} ->
  	    res_getby_search(Name, Dot,
! 			     get_searchlist(),nxdomain,Type,Timer);
  	{_,Dot} ->
  	    case res_getby_query_alt(Name,Type,Timer) of
  		{error,Reason} ->
  		    res_getby_search(Name, Dot,
! 				     get_searchlist(),nxdomain,Type,Timer);
  		Other -> Other
  	    end
      end.
--- 298,313 ----
  		        ?S_WKS, ?S_HINFO, ?S_TXT, ?S_SRV,
  		        ?S_UINFO, ?S_UID, ?S_GID]).
  	    
! res_getbyname(Name,Type,Timer, SearchList) ->
      case dots(Name) of
  	{0, Dot} ->
  	    res_getby_search(Name, Dot,
! 			     SearchList,nxdomain,Type,Timer);
  	{_,Dot} ->
  	    case res_getby_query_alt(Name,Type,Timer) of
  		{error,Reason} ->
  		    res_getby_search(Name, Dot,
! 				     SearchList,nxdomain,Type,Timer);
  		Other -> Other
  	    end
      end.


More information about the erlang-questions mailing list