aboutsummaryrefslogtreecommitdiffstats
path: root/lib/orber/src/orber_socket.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2014-09-29 08:59:53 +0200
committerErlang/OTP <[email protected]>2014-09-29 08:59:53 +0200
commit2b9c37facb2cad36d5bc6ced4ed4a3a4b2c3f09c (patch)
tree2b19a5e6e698f79858581334b4030c95a1432a50 /lib/orber/src/orber_socket.erl
parent2f3e63e49d196a733f876ddfab3862fa6ea49c9a (diff)
parentcd14f6b5489060fb22c08e14ab0f74e7f09aa599 (diff)
downloadotp-2b9c37facb2cad36d5bc6ced4ed4a3a4b2c3f09c.tar.gz
otp-2b9c37facb2cad36d5bc6ced4ed4a3a4b2c3f09c.tar.bz2
otp-2b9c37facb2cad36d5bc6ced4ed4a3a4b2c3f09c.zip
Merge branch 'lars/orber/ipv6-service-context/OTP-12193' into maint-17
* lars/orber/ipv6-service-context/OTP-12193: [orber] Fix problem with IPv6 addresses in service context
Diffstat (limited to 'lib/orber/src/orber_socket.erl')
-rw-r--r--lib/orber/src/orber_socket.erl41
1 files changed, 39 insertions, 2 deletions
diff --git a/lib/orber/src/orber_socket.erl b/lib/orber/src/orber_socket.erl
index c8d2f0636b..4507d90cce 100644
--- a/lib/orber/src/orber_socket.erl
+++ b/lib/orber/src/orber_socket.erl
@@ -37,7 +37,8 @@
-export([start/0, connect/4, listen/3, listen/4, accept/2, accept/3, write/3,
controlling_process/3, close/2, peername/2, sockname/2,
peerdata/2, peercert/2, sockdata/2, setopts/3,
- clear/2, shutdown/3, post_accept/2, post_accept/3]).
+ clear/2, shutdown/3, post_accept/2, post_accept/3,
+ get_ip_family_opts/1]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -491,4 +492,40 @@ check_options(ssl, Options, Generation) ->
end.
-
+%%-----------------------------------------------------------------
+%% Check IP Family.
+get_ip_family_opts(Host) ->
+ case inet:parse_address(Host) of
+ {ok, {_,_,_,_}} ->
+ [inet];
+ {ok, {_,_,_,_,_,_,_,_}} ->
+ [inet6];
+ {error, einval} ->
+ check_family_for_name(Host, orber_env:ip_version())
+ end.
+
+check_family_for_name(Host, inet) ->
+ case inet:getaddr(Host, inet) of
+ {ok, _Address} ->
+ [inet];
+ {error, _} ->
+ case inet:getaddr(Host, inet6) of
+ {ok, _Address} ->
+ [inet6];
+ {error, _} ->
+ [inet]
+ end
+ end;
+check_family_for_name(Host, inet6) ->
+ case inet:getaddr(Host, inet6) of
+ {ok, _Address} ->
+ [inet6];
+ {error, _} ->
+ case inet:getaddr(Host, inet) of
+ {ok, _Address} ->
+ [inet];
+ {error, _} ->
+ [inet6]
+ end
+ end.
+