diff options
| author | Anton <anton@picapica> | 2016-10-17 19:22:45 +0400 |
|---|---|---|
| committer | Anton <anton@picapica> | 2016-10-17 19:22:45 +0400 |
| commit | 9164d6c7266f2ea66459d1971128ca6071e6a4a2 (patch) | |
| tree | c0b5f729b409a3b8871ed1c4cdca26cd10730db7 | |
| parent | 9008d31c8c4401051e50d26f1743501688ffc9bc (diff) | |
| download | pica-pica-9164d6c7266f2ea66459d1971128ca6071e6a4a2.tar.gz pica-pica-9164d6c7266f2ea66459d1971128ca6071e6a4a2.zip | |
processing connections accepted by listener, work in progress
| -rw-r--r-- | PICA_client.c | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/PICA_client.c b/PICA_client.c index ce7f66e..4f218c3 100644 --- a/PICA_client.c +++ b/PICA_client.c @@ -1915,13 +1915,45 @@ static void listener_add_connection(struct PICA_listener *lst, SOCKET *s) lst->accepted_connections = nc; } -static int process_listener_conn() +static int process_listener_conn(struct PICA_listener_conn *conn, fd_set *rfds, fd_set *wfds) { - -- + if (conn->peer_cert == NULL) + { + if (FD_ISSET(conn->sck, rfds) || FD_ISSET(conn->sck, wfds)) + { + int ret; + ret = SSL_accept(conn->ssl); + + if (ret == 1) + { + conn->peer_cert = SSL_get_peer_certificate(conn->ssl); + + if (!conn->peer_cert) + return PICA_ERRSSL; + + return PICA_OK; + } + + if (ret == 0) + return PICA_ERRSSL; + + if (ret < 0) + { + ret = SSL_get_error(conn->ssl, ret); + + if (ret != SSL_ERROR_WANT_READ && ret != SSL_ERROR_WANT_WRITE) + return PICA_ERRSSL; + } + } + } + + return PICA_OK; } -static int process_listener(struct PICA_listener *lst, fd_set *rfds) +static int process_listener(struct PICA_listener *lst, fd_set *rfds, fd_set *wfds) { + struct PICA_listener_conn *conn; + if (FD_ISSET(lst->sck_listener, rfds)) { SOCKET s; @@ -1936,6 +1968,17 @@ static int process_listener(struct PICA_listener *lst, fd_set *rfds) } } + conn = lst->accepted_connections; + + while(conn) + { + if (process_listener_conn(conn, rfds, wfds) != PICA_OK) + { + --- close listener conn + } + conn = conn->next; + } + return PICA_OK; } @@ -2040,7 +2083,7 @@ int PICA_event_loop(struct PICA_c2n **connections, int timeout) struct PICA_c2c *kill_ptr = 0; //processing listener associated with current c2n - ret = process_listener((*ic2n)->directc2c_listener, &rfds); + ret = process_listener((*ic2n)->directc2c_listener, &rfds, &wfds); if (ret != PICA_OK) { @@ -2700,6 +2743,8 @@ void PICA_close_listener(struct PICA_listener *l) CLOSE(l->sck_listener); free(l->public_addr_dns); free(l); + + -- close accepted connections } #ifdef WIN32 |
