summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton <anton@picapica>2016-09-28 02:30:50 +0400
committerAnton <anton@picapica>2016-09-28 02:30:50 +0400
commit9008d31c8c4401051e50d26f1743501688ffc9bc (patch)
treee75ad7b5a517060262c7801915a59c248a3719ef
parentfbe88d4debb49d03a3a97e450ca2a69bf91b058b (diff)
downloadpica-pica-9008d31c8c4401051e50d26f1743501688ffc9bc.tar.gz
pica-pica-9008d31c8c4401051e50d26f1743501688ffc9bc.zip
listener connection struct and code accepting listener connections
-rw-r--r--PICA_client.c45
-rw-r--r--PICA_client.h9
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