diff options
author | Micael Karlberg <bmk@erlang.org> | 2019-11-20 12:59:32 +0100 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2019-11-25 18:28:27 +0100 |
commit | d2a2057abd3ef9e743aff00d8654f0414cb4c2fa (patch) | |
tree | ced3c8bface6ace2ff252ff5cc69e9d1846aeb70 | |
parent | bbfbed5055bd6ddefbefd214fe687803741b7429 (diff) | |
download | erlang-d2a2057abd3ef9e743aff00d8654f0414cb4c2fa.tar.gz |
[enet] Physical Address as a binary
OTP-16212
-rw-r--r-- | erts/emulator/nifs/common/socket_util.c | 38 |
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; |