diff options
| -rw-r--r-- | PICA_client.c | 40 | ||||
| -rw-r--r-- | PICA_client.h | 3 |
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; }; |
