summaryrefslogtreecommitdiff
path: root/erts
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2019-11-22 19:03:17 +0100
committerMicael Karlberg <bmk@erlang.org>2019-11-28 17:24:52 +0100
commit81f14ebb23936c3960aed0adc87345c369ec2171 (patch)
treec827b3751f462a0d1bb23834bf4d4e5b02d8c918 /erts
parent5e984bd0f2ef933b25ee5a4199cb0934aa87016f (diff)
downloaderlang-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.c92
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