aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/nifs/common/socket_nif.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/nifs/common/socket_nif.c')
-rw-r--r--erts/emulator/nifs/common/socket_nif.c79
1 files changed, 34 insertions, 45 deletions
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c
index 44aa44f5fc..9375e9c005 100644
--- a/erts/emulator/nifs/common/socket_nif.c
+++ b/erts/emulator/nifs/common/socket_nif.c
@@ -4250,6 +4250,12 @@ ERL_NIF_TERM nopen(ErlNifEnv* env,
descP->type = type;
descP->protocol = protocol;
+ /* Does this apply to other types? Such as RAW? */
+ if (type == SOCK_DGRAM) {
+ descP->isReadable = TRUE;
+ descP->isWritable = TRUE;
+ }
+
/*
* Should we keep track of sockets (resources) in some way?
* Doing it here will require mutex to ensure data integrity,
@@ -4544,20 +4550,27 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env,
{
int code, save_errno = 0;
- /* Verify that we are where in the proper state */
+ /*
+ * <KOLLA>
+ *
+ * We should look both the read and write mutex:es...
+ *
+ * </KOLLA>
+ *
+ * Verify that we are where in the proper state */
if (!IS_OPEN(descP)) {
- SSDBG( descP, ("SOCKET", "nif_sendto -> not open\r\n") );
+ SSDBG( descP, ("SOCKET", "nif_connect -> not open\r\n") );
return esock_make_error(env, atom_exbadstate);
}
if (IS_CONNECTED(descP)) {
- SSDBG( descP, ("SOCKET", "nif_sendto -> already connected\r\n") );
+ SSDBG( descP, ("SOCKET", "nif_connect -> already connected\r\n") );
return esock_make_error(env, atom_eisconn);
}
if (IS_CONNECTING(descP)) {
- SSDBG( descP, ("SOCKET", "nif_sendto -> already connecting\r\n") );
+ SSDBG( descP, ("SOCKET", "nif_connect -> already connecting\r\n") );
return esock_make_error(env, esock_atom_einval);
}
@@ -4566,7 +4579,7 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env,
descP->addrLen);
save_errno = sock_errno();
- SSDBG( descP, ("SOCKET", "nif_sendto -> connect result: %d, %d\r\n",
+ SSDBG( descP, ("SOCKET", "nif_connect -> connect result: %d, %d\r\n",
code, save_errno) );
if (IS_SOCKET_ERROR(code) &&
@@ -4580,7 +4593,9 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env,
descP, NULL, ref);
return esock_make_ok2(env, ref);
} else if (code == 0) { /* ok we are connected */
- descP->state = SOCKET_STATE_CONNECTED;
+ descP->state = SOCKET_STATE_CONNECTED;
+ descP->isReadable = TRUE;
+ descP->isWritable = TRUE;
/* Do we need to do somthing for "active" mode?
* Is there even such a thing *here*?
*/
@@ -4637,7 +4652,9 @@ ERL_NIF_TERM nfinalize_connection(ErlNifEnv* env,
return esock_make_error_errno(env, error);
}
- descP->state = SOCKET_STATE_CONNECTED;
+ descP->state = SOCKET_STATE_CONNECTED;
+ descP->isReadable = TRUE;
+ descP->isWritable = TRUE;
return esock_atom_ok;
}
@@ -4968,7 +4985,9 @@ ERL_NIF_TERM naccept_listening(ErlNifEnv* env,
descP, NULL, esock_atom_undefined);
#endif
- accDescP->state = SOCKET_STATE_CONNECTED;
+ accDescP->state = SOCKET_STATE_CONNECTED;
+ accDescP->isReadable = TRUE;
+ accDescP->isWritable = TRUE;
return esock_make_ok2(env, accRef);
}
@@ -5108,7 +5127,9 @@ ERL_NIF_TERM naccept_accepting(ErlNifEnv* env,
descP, NULL, esock_atom_undefined);
#endif
- accDescP->state = SOCKET_STATE_CONNECTED;
+ accDescP->state = SOCKET_STATE_CONNECTED;
+ accDescP->isReadable = TRUE;
+ accDescP->isWritable = TRUE;
/* Check if there are waiting acceptors (popping the acceptor queue) */
@@ -5182,9 +5203,6 @@ ERL_NIF_TERM nif_send(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
SSDBG( descP,
("SOCKET", "nif_send -> args when sock = %d:"
"\r\n Socket: %T"
@@ -5193,9 +5211,6 @@ ERL_NIF_TERM nif_send(ErlNifEnv* env,
"\r\n eFlags: %d"
"\r\n", descP->sock, sockRef, sendRef, sndData.size, eflags) );
- if (!IS_CONNECTED(descP))
- return esock_make_error(env, atom_enotconn);
-
if (!esendflags2sendflags(eflags, &flags))
return enif_make_badarg(env);
@@ -5315,9 +5330,6 @@ ERL_NIF_TERM nif_sendto(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
SSDBG( descP,
("SOCKET", "nif_sendto -> args when sock = %d:"
"\r\n Socket: %T"
@@ -5328,12 +5340,6 @@ ERL_NIF_TERM nif_sendto(ErlNifEnv* env,
"\r\n",
descP->sock, sockRef, sendRef, sndData.size, eSockAddr, eflags) );
- /* THIS TEST IS NOT CORRECT!!! */
- if (!IS_OPEN(descP)) {
- SSDBG( descP, ("SOCKET", "nif_sendto -> not open (%u)\r\n", descP->state) );
- return esock_make_error(env, esock_atom_einval);
- }
-
if (!esendflags2sendflags(eflags, &flags)) {
SSDBG( descP, ("SOCKET", "nif_sendto -> sendflags decode failed\r\n") );
return esock_make_error(env, esock_atom_einval);
@@ -5447,9 +5453,6 @@ ERL_NIF_TERM nif_sendmsg(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
SSDBG( descP,
("SOCKET", "nif_sendmsg -> args when sock = %d:"
"\r\n Socket: %T"
@@ -5458,10 +5461,6 @@ ERL_NIF_TERM nif_sendmsg(ErlNifEnv* env,
"\r\n",
descP->sock, argv[0], sendRef, eflags) );
- /* THIS TEST IS NOT CORRECT!!! */
- if (!IS_OPEN(descP))
- return esock_make_error(env, esock_atom_einval);
-
if (!esendflags2sendflags(eflags, &flags))
return esock_make_error(env, esock_atom_einval);
@@ -5745,12 +5744,6 @@ ERL_NIF_TERM nif_recv(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
- if (!IS_CONNECTED(descP))
- return esock_make_error(env, atom_enotconn);
-
if (!erecvflags2recvflags(eflags, &flags))
return enif_make_badarg(env);
@@ -5893,9 +5886,6 @@ ERL_NIF_TERM nif_recvfrom(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
SSDBG( descP,
("SOCKET", "nif_recvfrom -> args when sock = %d:"
"\r\n Socket: %T"
@@ -6062,9 +6052,6 @@ ERL_NIF_TERM nif_recvmsg(ErlNifEnv* env,
return enif_make_badarg(env);
}
- if (IS_CLOSED(descP) || IS_CLOSING(descP))
- return esock_make_error(env, atom_closed);
-
SSDBG( descP,
("SOCKET", "nif_recvmsg -> args when sock = %d:"
"\r\n Socket: %T"
@@ -6292,6 +6279,8 @@ ERL_NIF_TERM nclose(ErlNifEnv* env,
descP->closeLocal = TRUE;
descP->state = SOCKET_STATE_CLOSING;
+ descP->isReadable = FALSE;
+ descP->isWritable = FALSE;
doClose = TRUE;
}
@@ -15842,7 +15831,7 @@ SocketDescriptor* alloc_descriptor(SOCKET sock, HANDLE event)
descP->currentWriterP = NULL; // currentWriter not used
descP->writersQ.first = NULL;
descP->writersQ.last = NULL;
- descP->isWritable = TRUE;
+ descP->isWritable = FALSE; // TRUE;
descP->writePkgCnt = 0;
descP->writeByteCnt = 0;
descP->writeTries = 0;
@@ -15854,7 +15843,7 @@ SocketDescriptor* alloc_descriptor(SOCKET sock, HANDLE event)
descP->currentReaderP = NULL; // currentReader not used
descP->readersQ.first = NULL;
descP->readersQ.last = NULL;
- descP->isReadable = TRUE;
+ descP->isReadable = FALSE; // TRUE;
descP->readPkgCnt = 0;
descP->readByteCnt = 0;
descP->readTries = 0;