diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-03-29 12:29:19 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-05-19 11:22:06 +0200 |
commit | d54f1103facb956248ac61ea59378352149c8893 (patch) | |
tree | 60862146c051c24868e9e64e8c53cb8deca48eb3 /server | |
parent | 2dda5683b6b0dd8fa04df19a388d0898a127ec8b (diff) | |
download | spice-d54f1103facb956248ac61ea59378352149c8893.tar.gz spice-d54f1103facb956248ac61ea59378352149c8893.tar.xz spice-d54f1103facb956248ac61ea59378352149c8893.zip |
new watch api: switch ssl accept
Diffstat (limited to 'server')
-rw-r--r-- | server/reds.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/server/reds.c b/server/reds.c index 6a21d6e2..e50ae63b 100644 --- a/server/reds.c +++ b/server/reds.c @@ -491,7 +491,12 @@ static int reds_ssl_free(RedsStreamContext *peer) static void __reds_release_link(RedLinkInfo *link) { ASSERT(link->peer); - core->set_file_handlers(core, link->peer->socket, NULL, NULL, NULL); + if (link->peer->watch) { + core->watch_remove(link->peer->watch); + link->peer->watch = NULL; + } else { + core->set_file_handlers(core, link->peer->socket, NULL, NULL, NULL); + } free(link->link_mess); BN_free(link->tiTicketing.bn); if (link->tiTicketing.rsa) { @@ -2709,20 +2714,27 @@ static void reds_handle_new_link(RedLinkInfo *link) async_read_handler(0, 0, &link->asyc_read); } -static void reds_handle_ssl_accept(void *data) +static void reds_handle_ssl_accept(int fd, int event, void *data) { RedLinkInfo *link = (RedLinkInfo *)data; int return_code; if ((return_code = SSL_accept(link->peer->ssl)) != 1) { int ssl_error = SSL_get_error(link->peer->ssl, return_code); - if (ssl_error != SSL_ERROR_WANT_READ && ssl_error != SSL_ERROR_WANT_WRITE) { red_printf("SSL_accept failed, error=%d", ssl_error); reds_release_link(link); + } else { + if (ssl_error == SSL_ERROR_WANT_READ) { + core->watch_update_mask(link->peer->watch, SPICE_WATCH_EVENT_READ); + } else { + core->watch_update_mask(link->peer->watch, SPICE_WATCH_EVENT_WRITE); + } } return; } + core->watch_remove(link->peer->watch); + link->peer->watch = NULL; reds_handle_new_link(link); } @@ -2829,8 +2841,10 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) ssl_error = SSL_get_error(link->peer->ssl, return_code); if (return_code == -1 && (ssl_error == SSL_ERROR_WANT_READ || ssl_error == SSL_ERROR_WANT_WRITE)) { - core->set_file_handlers(core, link->peer->socket, reds_handle_ssl_accept, - reds_handle_ssl_accept, link); + int eventmask = ssl_error == SSL_ERROR_WANT_READ ? + SPICE_WATCH_EVENT_READ : SPICE_WATCH_EVENT_WRITE; + link->peer->watch = core->watch_add(link->peer->socket, eventmask, + reds_handle_ssl_accept, link); return; } |