6868 kernel_apply /3 ,
6969 longnames /0 ,
7070 protocol_childspecs /0 ,
71- epmd_module /0 ]).
71+ epmd_module /0 ,
72+ dist_listen /0 ]).
7273
7374-export ([disconnect /1 , passive_cnct /1 ]).
7475-export ([hidden_connect_node /1 ]).
@@ -693,7 +694,10 @@ terminate(no_network, State) ->
693694terminate (_Reason , State ) ->
694695 lists :foreach (
695696 fun (# listen {listen = Listen ,module = Mod }) ->
696- Mod :close (Listen )
697+ case Listen of
698+ undefined -> ignore ;
699+ _ -> Mod :close (Listen )
700+ end
697701 end , State # state .listen ),
698702 lists :foreach (
699703 fun (Node ) -> ? nodedown (Node , State )
@@ -1541,6 +1545,18 @@ epmd_module() ->
15411545 erl_epmd
15421546 end .
15431547
1548+ % %
1549+ % % dist_listen() -> whether the erlang distribution should listen for connections
1550+ % %
1551+ dist_listen () ->
1552+ case init :get_argument (dist_listen ) of
1553+ {ok ,[[DoListen ]]} ->
1554+ list_to_atom (DoListen ) =/= false ;
1555+ _ ->
1556+ true
1557+ end .
1558+
1559+
15441560% %
15451561% % Start all protocols
15461562% %
@@ -1553,8 +1569,13 @@ start_protos(Name, Node, CleanHalt) ->
15531569 start_protos (Name , [" inet_tcp" ], Node , CleanHalt )
15541570 end .
15551571
1572+
1573+
15561574start_protos (Name , Ps , Node , CleanHalt ) ->
1557- case start_protos (Name , Ps , Node , [], CleanHalt ) of
1575+ case case dist_listen () of
1576+ false -> start_protos_no_listen (Name , Ps , Node , [], CleanHalt );
1577+ _ -> start_protos (Name , Ps , Node , [], CleanHalt )
1578+ end of
15581579 [] ->
15591580 case CleanHalt of
15601581 true -> halt (1 );
@@ -1564,6 +1585,33 @@ start_protos(Name, Ps, Node, CleanHalt) ->
15641585 {ok , Ls }
15651586 end .
15661587
1588+ start_protos_no_listen (Name , [Proto | Ps ], Node , Ls , CleanHalt ) ->
1589+ Mod = list_to_atom (Proto ++ " _dist" ),
1590+ case set_node (Node , create_creation ()) of
1591+ ok ->
1592+ auth :sync_cookie (),
1593+ L = # listen {
1594+ listen = undefined ,
1595+ address = Mod :address (),
1596+ accept = undefined ,
1597+ module = Mod },
1598+ start_protos_no_listen (Name , Ps , Node , [L |Ls ], CleanHalt );
1599+ _ ->
1600+ S = " invalid node name: " ++ atom_to_list (Node ),
1601+ proto_error (CleanHalt , Proto , S ),
1602+ start_protos_no_listen (Name , Ps , Node , Ls , CleanHalt )
1603+ end ;
1604+ start_protos_no_listen (_Name , [], _Node , Ls , _CleanHalt ) ->
1605+ Ls .
1606+
1607+ create_creation () ->
1608+ try binary :decode_unsigned (crypto :strong_rand_bytes (4 )) of
1609+ Creation ->
1610+ Creation
1611+ catch _ :_ ->
1612+ rand :uniform ((1 bsl 32 )- 1 )
1613+ end .
1614+
15671615start_protos (Name , [Proto | Ps ], Node , Ls , CleanHalt ) ->
15681616 Mod = list_to_atom (Proto ++ " _dist" ),
15691617 case catch Mod :listen (Name ) of
0 commit comments