aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2018-04-09 12:54:52 +0200
committerMicael Karlberg <[email protected]>2018-09-18 13:01:37 +0200
commit9e6fda01b1af0c42cee9f983d5bddecc7eb7e240 (patch)
treef452ccfc553ada516a53947f6e62fe0f0d584347 /erts/emulator
parente752b4a8187903da609004c56f0f019b1d7b7605 (diff)
downloadotp-9e6fda01b1af0c42cee9f983d5bddecc7eb7e240.tar.gz
otp-9e6fda01b1af0c42cee9f983d5bddecc7eb7e240.tar.bz2
otp-9e6fda01b1af0c42cee9f983d5bddecc7eb7e240.zip
[socket-nif] Completed listen
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/nifs/common/socket_nif.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c
index a702e35a0d..88fb2206e4 100644
--- a/erts/emulator/nifs/common/socket_nif.c
+++ b/erts/emulator/nifs/common/socket_nif.c
@@ -322,6 +322,7 @@ typedef unsigned long long llu_t;
#define sock_getopt(s,t,n,v,l) getsockopt((s),(t),(n),(v),(l))
#define sock_htons(x) htons((x))
#define sock_htonl(x) htonl((x))
+#define sock_listen(s, b) listen((s), (b))
#define sock_name(s, addr, len) getsockname((s), (addr), (len))
#define sock_open(domain, type, proto) \
make_noninheritable_handle(socket((domain), (type), (proto)))
@@ -341,6 +342,7 @@ static unsigned long one_value = 1;
#define sock_getopt(s,t,n,v,l) getsockopt((s),(t),(n),(v),(l))
#define sock_htons(x) htons((x))
#define sock_htonl(x) htonl((x))
+#define sock_listen(s, b) listen((s), (b))
#define sock_name(s, addr, len) getsockname((s), (addr), (len))
#define sock_open(domain, type, proto) socket((domain), (type), (proto))
@@ -551,6 +553,9 @@ static ERL_NIF_TERM nconnect(ErlNifEnv* env,
SocketDescriptor* descP,
const ERL_NIF_TERM* addr,
int port);
+static ERL_NIF_TERM nlisten(ErlNifEnv* env,
+ SocketDescriptor* descP,
+ int backlog);
static ERL_NIF_TERM nfinalize_connection(ErlNifEnv* env,
SocketDescriptor* descP);
@@ -1611,6 +1616,59 @@ BOOLEAN_T verify_is_connected(SocketDescriptor* descP, int* err)
/* ----------------------------------------------------------------------
+ * nif_listen
+ *
+ * Description:
+ * Listen for connections on a socket.
+ *
+ * Arguments:
+ * Socket (ref) - Points to the socket descriptor.
+ * Backlog - The maximum length to which the queue of pending
+ * connections for socket may grow.
+ */
+static
+ERL_NIF_TERM nif_listen(ErlNifEnv* env,
+ int argc,
+ const ERL_NIF_TERM argv[])
+{
+ SocketDescriptor* descP;
+ int backlog;
+
+ /* Extract arguments and perform preliminary validation */
+
+ if ((argc != 2) ||
+ !enif_get_resource(env, argv[0], sockets, (void**) &descP) ||
+ !GET_INT(env, argv[1], &backlog)) {
+ return enif_make_badarg(env);
+ }
+
+ return nlisten(env, descP, backlog);
+}
+
+
+
+static
+ERL_NIF_TERM nlisten(ErlNifEnv* env,
+ SocketDescriptor* descP,
+ int backlog)
+{
+ if (descP->state == SOCKET_STATE_CLOSED)
+ return make_error(env, atom_exbadstate);
+
+ if (!IS_OPEN(descP))
+ return make_error(env, atom_exbadstate);
+
+ if (IS_SOCKET_ERROR(sock_listen(descP->sock, backlog)))
+ return make_error2(env, sock_errno());
+
+ descP->state = SOCKET_STATE_LISTENING;
+
+ return atom_ok;
+}
+
+
+
+/* ----------------------------------------------------------------------
* U t i l i t y F u n c t i o n s
* ----------------------------------------------------------------------
*/