diff options
| author | Anton <anton@picapica> | 2016-09-28 02:30:50 +0400 |
|---|---|---|
| committer | Anton <anton@picapica> | 2016-09-28 02:30:50 +0400 |
| commit | 9008d31c8c4401051e50d26f1743501688ffc9bc (patch) | |
| tree | e75ad7b5a517060262c7801915a59c248a3719ef | |
| parent | fbe88d4debb49d03a3a97e450ca2a69bf91b058b (diff) | |
| download | pica-pica-9008d31c8c4401051e50d26f1743501688ffc9bc.tar.gz pica-pica-9008d31c8c4401051e50d26f1743501688ffc9bc.zip | |
listener connection struct and code accepting listener connections
| -rw-r--r-- | PICA_client.c | 45 | ||||
| -rw-r--r-- | PICA_client.h | 9 |
2 files changed, 53 insertions, 1 deletions
diff --git a/PICA_client.c b/PICA_client.c index b1ff144..ce7f66e 100644 --- a/PICA_client.c +++ b/PICA_client.c @@ -1196,6 +1196,8 @@ int PICA_new_listener(const struct PICA_acc *acc, const char *public_addr, int p flag = 1; setsockopt(lst->sck_listener, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); + IOCTLSETNONBLOCKINGSOCKET(lst->sck_listener, 1); + memset(&s, 0, sizeof(s)); s.sin_family = AF_INET; s.sin_addr.s_addr = INADDR_ANY; @@ -1878,6 +1880,46 @@ static int process_c2c(struct PICA_c2c *c2c, fd_set *rfds, fd_set *wfds) return ret; } +static void listener_add_connection(struct PICA_listener *lst, SOCKET *s) +{ + struct PICA_listener_conn *nc; + int ret; + + nc = calloc(1, sizeof(struct PICA_listener_conn)); + + nc->sck = s; + nc->ssl = SSL_new(lst->acc->ctx); + + SSL_set_fd(nc->ssl, nc->sck); + ret = SSL_accept(nc->ssl); + + if (ret == 0) + { + free(nc); + return; + } + + if (ret < 0) + { + ret = SSL_get_error(nc->ssl, ret); + + if (ret != SSL_ERROR_WANT_READ && ret != SSL_ERROR_WANT_WRITE) + { + free(nc); + return; + } + } + + nc->next = lst->accepted_connections; + + lst->accepted_connections = nc; +} + +static int process_listener_conn() +{ + -- +} + static int process_listener(struct PICA_listener *lst, fd_set *rfds) { if (FD_ISSET(lst->sck_listener, rfds)) @@ -1890,9 +1932,10 @@ static int process_listener(struct PICA_listener *lst, fd_set *rfds) if (s >= 0) { - + listener_add_connection(lst, s); } } + return PICA_OK; } diff --git a/PICA_client.h b/PICA_client.h index 30f9cf9..764b9dd 100644 --- a/PICA_client.h +++ b/PICA_client.h @@ -227,6 +227,14 @@ struct PICA_c2c int disconnect_on_empty_write_buf; }; +struct PICA_listener_conn +{ + SOCKET sck; + SSL *ssl; + X509 *peer_cert; + struct PICA_listener_conn *next; +}; + struct PICA_listener { const struct PICA_acc *acc; @@ -238,6 +246,7 @@ struct PICA_listener in_addr_t public_addr_ipv4; const char *public_addr_dns; + struct PICA_listener_conn *accepted_connections; }; struct PICA_client_callbacks |
