connecting using aliased hostname

Ulf Wiger (AL/EAB) <>
Thu Dec 1 15:44:49 CET 2005


We played around a little with the -kernel inetrc
option, and tried to use a user-defined alias
to connect to a node on another machine

E.g. if the official hostname is, say "gandalf",
but we want to use the alias "saruman", we 
specify in our inetrc file

{lookup, [file,native]}.
{host, {10,10,10,10}, "gandalf", ["saruman"]}.

and then start an erlang node with 

erl -kernel inetrc '"./myinetrc"' -sname n -setcookie frodo

and try net:ping(), it doesn't work.
It seems to go wrong in recv_challenge, since 
the other node calls himself ''.

The patch to dist_util.erl below makes us lookup
the hostent record and proceed if the hostname
given by the other node is either the official
name (most likely) or a known alias.

I admit that it is usually not terribly useful,
and perhaps sometimes quite confusing to allow
aliased hostnames, but on occasion, I think it 
can be quite nice to have.

Say, for example that we have a node that connects
to a system under test ("sut"). We can consistently 
use the nodename  in our test program.
Wonderfully convenient!

(Ok, crummy example. Mostly, I was curious to see if
it could be made to work, after having satisfied my 
initial curiosity in establishing that it didn't in
fact work.)

/Uffe
BTW, the patch isn't quite generic. It assumes 'inet'.


*** $OTP_ROOT/lib/kernel-2.10.10/src/dist_util.erl    Tue Aug 30
05:05:28 2005
--- dist_util.erl       Thu Dec  1 15:29:31 2005
***************
*** 33,38 ****
--- 33,40 ----
  
  -include("dist_util.hrl").
  -include("dist.hrl").
+ -include("inet.hrl").
+ 
  
  -define(to_port(FSend, Socket, Data),
        case FSend(Socket, Data) of
***************
*** 324,332 ****
      send_name(HSData),
      recv_status(HSData),
      {PreOtherFlags, NodeA, VersionA, ChallengeA} =
recv_challenge(HSData),
!     if Node =/= NodeA -> ?shutdown(no_node);
!        Version =/= VersionA -> ?shutdown(no_node);
!        true -> true
      end,
      {ThisFlags, OtherFlags} = adjust_flags(PreThisFlags,
                                           PreOtherFlags),
--- 326,340 ----
      send_name(HSData),
      recv_status(HSData),
      {PreOtherFlags, NodeA, VersionA, ChallengeA} =
recv_challenge(HSData),
!     GoodNode =
!       if Node =/= NodeA ->
!               is_alias(NodeA);
!          true -> true
!       end,
!     GoodVsn = (Version == VersionA),
!     if (GoodNode and GoodVsn) -> true;
!        true ->
!           ?shutdown(no_node)
      end,
      {ThisFlags, OtherFlags} = adjust_flags(PreThisFlags,
                                           PreOtherFlags),
***************
*** 341,346 ****
--- 349,375 ----
      reset_timer(NewHSData#hs_data.timer),
      recv_challenge_ack(NewHSData, MyChallenge, MyCookie),
      connection(NewHSData).
+ 
+ is_alias(Node) ->
+     case split_node(atom_to_list(Node), $@, []) of
+       [Name|Tail] ->
+           Host = lists:append(Tail),
+           case inet:gethostbyname(Host, inet) of
+               {ok, #hostent{h_name = OfficialName,
+                             h_aliases = Aliases}} ->
+                       lists:member(Host, [OfficialName|Aliases]);
+               _ ->
+                   false
+           end;
+       _ ->
+           false
+     end.
+ 
+ 
+ split_node([Chr|T], Chr, Ack) -> [lists:reverse(Ack)|split_node(T,
Chr, [])];
+ split_node([H|T], Chr, Ack)   -> split_node(T, Chr, [H|Ack]);
+ split_node([], _, Ack)        -> [lists:reverse(Ack)].
+ 
  
  %% --------------------------------------------------------------
  %% The connection has been established.



More information about the erlang-questions mailing list