diff --git a/mongoose.c b/mongoose.c index f0d5783c3052d3a72d0fcf66bb0add9675703922..9dfcf8c4c9ce0bf2b5aab3f094d45aaa038e4e40 100644 --- a/mongoose.c +++ b/mongoose.c @@ -162,19 +162,20 @@ int iobuf_append(struct iobuf *, const void *data, int data_size); void iobuf_remove(struct iobuf *, int data_size); // Net skeleton interface +// Events. Meaning of event parameter (evp) is given in the comment. enum ns_event { NS_POLL, // Sent to each connection on each call to ns_server_poll() - NS_ACCEPT, // Listening socket accept()-ed new connection - NS_CONNECT, // Connection made by ns_connect() succeeded or failed - NS_RECV, // Data has benn received - NS_SEND, // Data has been written to a socket - NS_CLOSE // Connection is closed + NS_ACCEPT, // New connection accept()-ed. union socket_address *remote_addr + NS_CONNECT, // connect() succeeded or failed. int *success_status + NS_RECV, // Data has benn received. int *num_bytes + NS_SEND, // Data has been written to a socket. int *num_bytes + NS_CLOSE // Connection is closed. NULL }; // Callback function (event handler) prototype, must be defined by user. // Net skeleton will call event handler, passing events defined above. struct ns_connection; -typedef void (*ns_callback_t)(struct ns_connection *, enum ns_event, void *); +typedef void (*ns_callback_t)(struct ns_connection *, enum ns_event, void *evp); struct ns_server { void *server_data; @@ -576,7 +577,6 @@ static struct ns_connection *accept_conn(struct ns_server *server) { // NOTE(lsm): on Windows, sock is always > FD_SETSIZE if ((sock = accept(server->listening_sock, &sa.sa, &len)) == INVALID_SOCKET) { - closesocket(sock); } else if ((c = (struct ns_connection *) NS_MALLOC(sizeof(*c))) == NULL || memset(c, 0, sizeof(*c)) == NULL) { closesocket(sock); @@ -735,6 +735,15 @@ static void ns_write_to_socket(struct ns_connection *conn) { #ifdef NS_ENABLE_SSL if (conn->ssl != NULL) { n = SSL_write(conn->ssl, io->buf, io->len); + if (n < 0) { + int ssl_err = SSL_get_error(conn->ssl, n); + DBG(("%p %d %d", conn, n, ssl_err)); + if (ssl_err == 2 || ssl_err == 3) { + return; // Call us again + } else { + conn->flags |= NSF_CLOSE_IMMEDIATELY; + } + } } else #endif { n = send(conn->sock, io->buf, io->len, 0); } @@ -4499,7 +4508,7 @@ static void hexdump(struct ns_connection *nc, const char *path, is_sent ? "->" : "<-", mc->mg_conn.remote_ip, mc->mg_conn.remote_port, num_bytes); - if ((buf = malloc(buf_size)) != NULL) { + if ((buf = (char *) malloc(buf_size)) != NULL) { ns_hexdump(io->buf + (is_sent ? 0 : io->len) - (is_sent ? 0 : num_bytes), num_bytes, buf, buf_size); fprintf(fp, "%s", buf);