diff --git a/src/core/ev.c b/src/core/ev.c index 395542a5..dd25651f 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -2468,7 +2468,6 @@ Janet janet_ev_lasterr(void) { msgbuf, sizeof(msgbuf), NULL); - if (!*msgbuf) snprintf(msgbuf, sizeof(msgbuf), "%d", code); char *c = msgbuf; while (*c) { if (*c == '\n' || *c == '\r') { @@ -2477,6 +2476,8 @@ Janet janet_ev_lasterr(void) { } c++; } + size_t len = c - msgbuf; + snprintf(c, sizeof(msgbuf) - len, "(%d)", code); return janet_cstringv(msgbuf); } #else diff --git a/src/core/net.c b/src/core/net.c index a1baa9a0..d0fc3c24 100644 --- a/src/core/net.c +++ b/src/core/net.c @@ -196,6 +196,10 @@ void net_callback_connect(JanetFiber *fiber, JanetAsyncEvent event) { return; /* This apparently indicates we haven't yet gotten a connection */ } const int no_error = NO_ERROR; + if (r == NO_ERROR) { /* Last sockopt worked, one more */ + /* Put socket in a good state instead of an empty default state. */ + r = setsockopt((SOCKET)stream->handle, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0); + } #else int res = 0; socklen_t size = sizeof(res); @@ -256,9 +260,11 @@ void net_callback_accept(JanetFiber *fiber, JanetAsyncEvent event) { return; } SOCKET lsock = (SOCKET) state->lstream->handle; - if (NO_ERROR != setsockopt((SOCKET) state->astream->handle, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, + SOCKET asock = (SOCKET) state->astream->handle; + + if (NO_ERROR != setsockopt(asock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char *) &lsock, sizeof(lsock))) { - janet_cancel(fiber, janet_cstringv("failed to accept connection")); + janet_cancel(fiber, janet_cstringv("failed to accept connection (accept context)")); janet_async_end(fiber); return; } @@ -947,7 +953,7 @@ JANET_CORE_FN(cfun_net_getsockname, janet_fixarity(argc, 1); JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed"); - struct sockaddr_storage ss; + char ss[sizeof(struct sockaddr_storage) + 64]; /* extra space */ socklen_t slen = sizeof(ss); memset(&ss, 0, slen); if (getsockname((JSock)js->handle, (struct sockaddr *) &ss, &slen)) { @@ -963,7 +969,7 @@ JANET_CORE_FN(cfun_net_getpeername, janet_fixarity(argc, 1); JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed"); - struct sockaddr_storage ss; + char ss[sizeof(struct sockaddr_storage) + 64]; /* extra space */ socklen_t slen = sizeof(ss); memset(&ss, 0, slen); if (getpeername((JSock)js->handle, (struct sockaddr *)&ss, &slen)) { diff --git a/test/suite-ev.janet b/test/suite-ev.janet index 237ef0cc..9544962b 100644 --- a/test/suite-ev.janet +++ b/test/suite-ev.janet @@ -232,7 +232,7 @@ [stream] (defer (:close stream) # prevent immediate close - (ev/read stream 1) + (assert (ev/read stream 1) "stream should be open") (def [host port] (net/localname stream)) (assert (= host test-host) "localname host server") (assert (= port (scan-number test-port)) "localname port server")