summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2019-11-20 12:59:32 +0100
committerMicael Karlberg <bmk@erlang.org>2019-11-25 18:28:27 +0100
commitd2a2057abd3ef9e743aff00d8654f0414cb4c2fa (patch)
treeced3c8bface6ace2ff252ff5cc69e9d1846aeb70
parentbbfbed5055bd6ddefbefd214fe687803741b7429 (diff)
downloaderlang-d2a2057abd3ef9e743aff00d8654f0414cb4c2fa.tar.gz
[enet] Physical Address as a binary
OTP-16212
-rw-r--r--erts/emulator/nifs/common/socket_util.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/erts/emulator/nifs/common/socket_util.c b/erts/emulator/nifs/common/socket_util.c
index 6e60da2f07..5514ef217a 100644
--- a/erts/emulator/nifs/common/socket_util.c
+++ b/erts/emulator/nifs/common/socket_util.c
@@ -39,6 +39,17 @@
#include "config.h"
#endif
+#ifdef HAVE_SOCKLEN_T
+# define SOCKLEN_T socklen_t
+#else
+# define SOCKLEN_T size_t
+#endif
+
+#ifdef __WIN32__
+#define SOCKOPTLEN_T int
+#else
+#define SOCKOPTLEN_T SOCKLEN_T
+#endif
/* We don't have a "debug flag" to check here, so we
* should use the compile debug flag, whatever that is...
@@ -61,6 +72,11 @@ extern char* erl_errno_id(int error); /* THIS IS JUST TEMPORARY??? */
#endif
+static void esock_encode_packet_addr_tuple(ErlNifEnv* env,
+ unsigned char len,
+ unsigned char* addr,
+ ERL_NIF_TERM* eAddr);
+
static char* make_sockaddr_in4(ErlNifEnv* env,
ERL_NIF_TERM port,
ERL_NIF_TERM addr,
@@ -1490,6 +1506,28 @@ void esock_encode_packet_addr(ErlNifEnv* env,
unsigned char* addr,
ERL_NIF_TERM* eAddr)
{
+#if defined(ESOCK_PACKET_ADDRESS_AS_TUPLE)
+ esock_encode_packet_addr_tuple(env, len, addr, eAddr);
+#else
+ SOCKOPTLEN_T vsz = len;
+ ErlNifBinary val;
+
+ if (ALLOC_BIN(vsz, &val)) {
+ sys_memcpy(val.data, addr, len);
+ *eAddr = MKBIN(env, &val);
+ } else {
+ esock_encode_packet_addr_tuple(env, len, addr, eAddr);
+ }
+#endif
+}
+
+
+static
+void esock_encode_packet_addr_tuple(ErlNifEnv* env,
+ unsigned char len,
+ unsigned char* addr,
+ ERL_NIF_TERM* eAddr)
+{
ERL_NIF_TERM array[len];
unsigned char i;