diff options
author | Micael Karlberg <bmk@erlang.org> | 2019-11-22 19:03:17 +0100 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2019-11-28 17:24:52 +0100 |
commit | 81f14ebb23936c3960aed0adc87345c369ec2171 (patch) | |
tree | c827b3751f462a0d1bb23834bf4d4e5b02d8c918 /erts | |
parent | 5e984bd0f2ef933b25ee5a4199cb0934aa87016f (diff) | |
download | erlang-81f14ebb23936c3960aed0adc87345c369ec2171.tar.gz |
[esock] Add domain, type and protocol to the socket info
OTP-16311
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/nifs/common/socket_nif.c | 92 |
1 files changed, 89 insertions, 3 deletions
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c index e36cd38ece..56b8a5a980 100644 --- a/erts/emulator/nifs/common/socket_nif.c +++ b/erts/emulator/nifs/common/socket_nif.c @@ -1043,6 +1043,12 @@ static ERL_NIF_TERM esock_command_debug(ErlNifEnv* env, ERL_NIF_TERM ecdata); static ERL_NIF_TERM esock_global_info(ErlNifEnv* env); static ERL_NIF_TERM esock_socket_info(ErlNifEnv* env, ESockDescriptor* descP); +static ERL_NIF_TERM esock_socket_info_domain(ErlNifEnv* env, + ESockDescriptor* descP); +static ERL_NIF_TERM esock_socket_info_type(ErlNifEnv* env, + ESockDescriptor* descP); +static ERL_NIF_TERM esock_socket_info_protocol(ErlNifEnv* env, + ESockDescriptor* descP); static ERL_NIF_TERM esock_socket_info_counters(ErlNifEnv* env, ESockDescriptor* descP); #define ESOCK_SOCKET_INFO_REQ_FUNCS \ @@ -3263,6 +3269,14 @@ ERL_NIF_TERM esock_global_info(ErlNifEnv* env) /* * This function return a property *map*. The properties are: + * domain: The domain of the socket + * type: The type of the socket + * protocol: The protocol of the socket + * (ctrl: Controlling process of the socket) + * (readable: Is the socket readable) + * (writable: Is the socket writable) + * (connected: Is the socket connected) + * (remote: (socket) Address of the peer (if connected)) * counters: A list of each socket counter and there current values * readers: The number of current and waiting readers * writers: The number of current and waiting writers @@ -3272,13 +3286,31 @@ static ERL_NIF_TERM esock_socket_info(ErlNifEnv* env, ESockDescriptor* descP) { + ERL_NIF_TERM domain = esock_socket_info_domain(env, descP); + ERL_NIF_TERM type = esock_socket_info_type(env, descP); + ERL_NIF_TERM protocol = esock_socket_info_protocol(env, descP); + // ERL_NIF_TERM ctrlPid = MKPID(env, &descP->ctrlPid); + // ERL_NIF_TERM readable = esock_encode_bool(descP->isReadable); + // ERL_NIF_TERM writable = esock_encode_bool(descP->isWritable); + // ERL_NIF_TERM connected = esock_encode_bool(descP->isConnected); ERL_NIF_TERM counters = esock_socket_info_counters(env, descP); ERL_NIF_TERM readers = esock_socket_info_readers(env, descP); ERL_NIF_TERM writers = esock_socket_info_writers(env, descP); ERL_NIF_TERM acceptors = esock_socket_info_acceptors(env, descP); - ERL_NIF_TERM keys[] = {atom_counters, atom_num_readers, - atom_num_writers, atom_num_acceptors}; - ERL_NIF_TERM vals[] = {counters, readers, writers, acceptors}; + ERL_NIF_TERM keys[] = {esock_atom_domain, + esock_atom_type, + esock_atom_protocol, + atom_counters, + atom_num_readers, + atom_num_writers, + atom_num_acceptors}; + ERL_NIF_TERM vals[] = {domain, + type, + protocol, + counters, + readers, + writers, + acceptors}; ERL_NIF_TERM info; unsigned int numKeys = sizeof(keys) / sizeof(ERL_NIF_TERM); unsigned int numVals = sizeof(vals) / sizeof(ERL_NIF_TERM); @@ -3303,6 +3335,60 @@ ERL_NIF_TERM esock_socket_info(ErlNifEnv* env, /* + * Encode the socket domain + */ +static +ERL_NIF_TERM esock_socket_info_domain(ErlNifEnv* env, + ESockDescriptor* descP) +{ + int domain = descP->domain; + ERL_NIF_TERM edomain; + + if (NULL != esock_encode_domain(env, domain, &edomain)) { + edomain = MKI(env, domain); + } + + return edomain; +} + + +/* + * Encode the socket type + */ +static +ERL_NIF_TERM esock_socket_info_type(ErlNifEnv* env, + ESockDescriptor* descP) +{ + int type = descP->type; + ERL_NIF_TERM etype; + + if (NULL != esock_encode_type(env, type, &etype)) { + etype = MKI(env, type); + } + + return etype; +} + + +/* + * Encode the socket protocol + */ +static +ERL_NIF_TERM esock_socket_info_protocol(ErlNifEnv* env, + ESockDescriptor* descP) +{ + int proto = descP->protocol; + ERL_NIF_TERM eproto; + + if (NULL != esock_encode_protocol(env, proto, &eproto)) { + eproto = MKI(env, proto); + } + + return eproto; +} + + +/* * Collect all counters for a socket. */ static |