summaryrefslogtreecommitdiff
path: root/lib/kernel/src/inet.erl
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2021-04-21 15:29:28 +0200
committerMicael Karlberg <bmk@erlang.org>2021-04-28 09:20:36 +0200
commit8836b32310be19af1af4a1d861bd0b2864a27c40 (patch)
tree1677300219295293c69af3d1b84f61b93e62b0c8 /lib/kernel/src/inet.erl
parentfa5d955e4e818a16a3bffdf061a50a3d72ffa033 (diff)
downloaderlang-8836b32310be19af1af4a1d861bd0b2864a27c40.tar.gz
[kernel] inet:i/0 now also reports tcp compat sockets
OTP-17157
Diffstat (limited to 'lib/kernel/src/inet.erl')
-rw-r--r--lib/kernel/src/inet.erl65
1 files changed, 64 insertions, 1 deletions
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 17c278923f..2b9d12d453 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -1721,6 +1721,53 @@ upper(C) when C >= $a, C =< $z -> (C-$a) + $A;
upper(C) -> C.
+info({'$inet', GenSocketMod, _} = S, F, Proto) when is_atom(GenSocketMod) ->
+ case F of
+ owner ->
+ case GenSocketMod:info(S) of
+ #{owner := Owner} when is_pid(Owner) -> pid_to_list(Owner);
+ _ -> " "
+ end;
+ port ->
+ "esock"; %% We should really skip this
+ sent ->
+ case GenSocketMod:getstat(S, [send_oct]) of
+ {ok, [{send_oct, N}]} -> integer_to_list(N);
+ _ -> " "
+ end;
+ recv ->
+ case GenSocketMod:getstat(S, [recv_oct]) of
+ {ok, [{recv_oct, N}]} -> integer_to_list(N);
+ _ -> " "
+ end;
+ local_address ->
+ fmt_addr(GenSocketMod:sockname(S), Proto);
+ foreign_address ->
+ fmt_addr(GenSocketMod:peername(S), Proto);
+ state ->
+ case GenSocketMod:info(S) of
+ #{rstates := RStates,
+ wstates := WStates} -> fmt_compat_status(RStates, WStates);
+ _ -> " "
+ end;
+ packet ->
+ case GenSocketMod:which_packet_type(S) of
+ {ok, Type} -> atom_to_list(Type);
+ _ -> " "
+ end;
+ type ->
+ case GenSocketMod:info(S) of
+ #{type := stream} -> "STREAM";
+ _ -> " "
+ end;
+ fd ->
+ case GenSocketMod:getopts(S, [fd]) of
+ {ok, [{fd, Fd}]} -> integer_to_list(Fd);
+ _ -> " "
+ end;
+ module ->
+ atom_to_list(GenSocketMod)
+ end;
info(S, F, Proto) ->
case F of
owner ->
@@ -1776,6 +1823,7 @@ info(S, F, Proto) ->
_ -> "prim_inet"
end
end.
+
%% Possible flags: (sorted)
%% [accepting,bound,busy,connected,connecting,listen,listening,open]
%% Actually, we no longer gets listening...
@@ -1794,6 +1842,19 @@ fmt_status(Flags) ->
Sorted -> fmt_status2(Sorted)
end.
+fmt_compat_status(RFlags, WFlags) ->
+ fmt_status(fmt_compat_status_merge(RFlags, WFlags)).
+
+fmt_compat_status_merge(RFlags, WFlags) ->
+ fmt_compat_status_merge(RFlags, WFlags, []).
+
+fmt_compat_status_merge([], WFlags, Merged) ->
+ Merged ++ WFlags;
+fmt_compat_status_merge([RFlag|RFlags], WFlags, Merged) ->
+ fmt_compat_status_merge(RFlags,
+ lists:delete(RFlag, WFlags),
+ [RFlag|Merged]).
+
fmt_status2([H]) ->
fmt_status3(H);
fmt_status2([H|T]) ->
@@ -1815,6 +1876,8 @@ fmt_status3(listening) ->
"LG";
fmt_status3(open) ->
"O";
+fmt_status3(selected) ->
+ "SD";
fmt_status3(X) when is_atom(X) ->
string:uppercase(atom_to_list(X)).
@@ -1839,7 +1902,7 @@ fmt_port(N, Proto) ->
end.
%% Return a list of all tcp sockets
-tcp_sockets() -> port_list("tcp_inet").
+tcp_sockets() -> port_list("tcp_inet") ++ gen_tcp_socket:which_sockets().
udp_sockets() -> port_list("udp_inet").
sctp_sockets() -> port_list("sctp_inet").