summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--PICA_client.c40
-rw-r--r--PICA_client.h3
2 files changed, 36 insertions, 7 deletions
diff --git a/PICA_client.c b/PICA_client.c
index ad4c3eb..60ea14e 100644
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -1954,6 +1954,9 @@ static int process_c2n(struct PICA_c2n *c2n, fd_set *rfds, fd_set *wfds)
if (sslret != SSL_ERROR_WANT_READ && sslret != SSL_ERROR_WANT_WRITE)
ret = PICA_ERRSSL;
+
+ if (sslret == SSL_ERROR_WANT_WRITE)
+ c2n->want_write = 1;
}
}
@@ -2026,6 +2029,8 @@ static int process_c2c(struct PICA_c2c *c2c, fd_set *rfds, fd_set *wfds)
if (sslret != SSL_ERROR_WANT_READ && sslret != SSL_ERROR_WANT_WRITE)
ret = PICA_ERRSSL;
+ if (sslret == SSL_ERROR_WANT_WRITE)
+ c2c->want_write = 1;
}
else if(sslret == 0)
{
@@ -2251,6 +2256,9 @@ static void process_directc2c(struct PICA_c2n *c2n, fd_set *rfds, fd_set *wfds)
if (ret != 1)
{
+ if (SSL_get_error(d->ssl, ret)== SSL_ERROR_WANT_WRITE)
+ d->want_write = 1;
+
ret = process_async_ssl_errors(d->ssl, ret);
if (ret != PICA_OK)
@@ -2385,6 +2393,9 @@ static int process_listener_conn(struct PICA_directc2c *conn, fd_set *rfds, fd_s
{
ret = SSL_get_error(conn->ssl, ret);
+ if (ret == SSL_ERROR_WANT_WRITE)
+ conn->want_write = 1;
+
if (ret != SSL_ERROR_WANT_READ && ret != SSL_ERROR_WANT_WRITE)
return PICA_ERRSSL;
}
@@ -2428,7 +2439,7 @@ static int process_listener(struct PICA_listener *lst, fd_set *rfds, fd_set *wfd
kill_ptr = conn;
}
- fprintf(stderr, "process_listener_conn() returned %i\n", ret);
+ //fprintf(stderr, "process_listener_conn() returned %i\n", ret);
if (!kill_ptr)
pprevconn = &conn->next;
@@ -2481,8 +2492,11 @@ int PICA_event_loop(struct PICA_c2n **connections, int timeout)
fdset_add(&rfds, (*ic2n)->sck_comm, &nfds);
if ((*ic2n)->write_pos || (*ic2n)->state == PICA_C2N_STATE_CONNECTING
- || (*ic2n)->state == PICA_C2N_STATE_WAITINGTLS)
+ || (*ic2n)->want_write/*(*ic2n)->state == PICA_C2N_STATE_WAITINGTLS*/)
+ {
+ (*ic2n)->want_write = 0;
fdset_add(&wfds, (*ic2n)->sck_comm, &nfds);
+ }
if ((*ic2n)->directc2c_listener)
{
@@ -2493,7 +2507,11 @@ int PICA_event_loop(struct PICA_c2n **connections, int timeout)
while (ilstcon)
{
fdset_add(&rfds, ilstcon->sck, &nfds);
- fdset_add(&wfds, ilstcon->sck, &nfds);
+
+ if (ilstcon->want_write)
+ fdset_add(&wfds, ilstcon->sck, &nfds);
+ ilstcon->want_write = 0;
+
ilstcon = ilstcon->next;
}
}
@@ -2506,16 +2524,24 @@ int PICA_event_loop(struct PICA_c2n **connections, int timeout)
{
fdset_add(&rfds, ic2c->sck_data, &nfds);
- if (ic2c->write_pos || ic2c->state == PICA_C2C_STATE_CONNECTING || ic2c->state == PICA_C2C_STATE_WAITINGTLS
- || ic2c->sendfilestate == PICA_CHANSENDFILESTATE_SENDING)
+ if ((ic2c->write_pos || ic2c->state == PICA_C2C_STATE_CONNECTING || (ic2c->state == PICA_C2C_STATE_WAITINGTLS && ic2c->want_write)
+ || ic2c->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) && ic2c->directc2c_state != PICA_DIRECTC2C_STATE_ACTIVE)
+ {
+ ic2c->want_write = 0;
fdset_add(&wfds, ic2c->sck_data, &nfds);
+ }
}
if (ic2c->state == PICA_C2C_STATE_ACTIVE && (ic2c->directc2c_state == PICA_DIRECTC2C_STATE_CONNECTING || ic2c->directc2c_state == PICA_DIRECTC2C_STATE_ACTIVE)
- && ic2c->direct && ic2c->direct->state >= PICA_DIRECTC2C_CONNSTATE_CONNECTING)// CHECK CONDITIONS!
+ && ic2c->direct && ic2c->direct->state >= PICA_DIRECTC2C_CONNSTATE_CONNECTING)
{
fdset_add(&rfds, ic2c->direct->sck, &nfds);
- fdset_add(&wfds, ic2c->direct->sck, &nfds);
+
+ if (ic2c->write_pos || ic2c->direct->state == PICA_DIRECTC2C_CONNSTATE_CONNECTING || ic2c->direct->want_write || ic2c->sendfilestate == PICA_CHANSENDFILESTATE_SENDING)
+ {
+ ic2c->direct->want_write = 0;
+ fdset_add(&wfds, ic2c->direct->sck, &nfds);
+ }
}
ic2c = ic2c->next;
diff --git a/PICA_client.h b/PICA_client.h
index 4f99a91..b56e034 100644
--- a/PICA_client.h
+++ b/PICA_client.h
@@ -170,6 +170,7 @@ struct PICA_c2n
int init_resp_ok;
unsigned char node_ver_major, node_ver_minor;
int disconnect_on_empty_write_buf;
+ int want_write;
};
enum PICA_c2c_state
@@ -207,6 +208,7 @@ struct PICA_directc2c
SOCKET sck;
SSL *ssl;
X509 *peer_cert;
+ int want_write;
uint8_t *addrlist;
int addrpos;
@@ -257,6 +259,7 @@ struct PICA_c2c
int disconnect_on_empty_write_buf;
int switched_to_directc2c_write;
int switched_to_directc2c_read;
+ int want_write;
unsigned int directc2c_write_barrier_pos;
unsigned int directc2c_write_before_barrier_pos;
};