diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2015-02-27 16:20:57 +0000 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2015-12-18 15:02:11 +0000 |
commit | 04d2529da27db512dcbd5e99d0e26d333f16efcc (patch) | |
tree | 18af3a24cbaa0e697dc068673ce65cc30bd95f2b /ui/vnc-ws.c | |
parent | 18f49881cf8359e89396aac12f5d3cf3f8a632ba (diff) |
ui: convert VNC server to use QIOChannelSocket
The minimal first step conversion to use QIOChannelSocket
classes instead of directly using POSIX sockets API. This
will later be extended to also cover the TLS, SASL and
websockets code.
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Diffstat (limited to 'ui/vnc-ws.c')
-rw-r--r-- | ui/vnc-ws.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/ui/vnc-ws.c b/ui/vnc-ws.c index 175ea50b4b..15649dc582 100644 --- a/ui/vnc-ws.c +++ b/ui/vnc-ws.c @@ -37,17 +37,29 @@ static int vncws_start_tls_handshake(VncState *vs) goto error; } VNC_DEBUG("Client verification passed, starting TLS I/O\n"); - qemu_set_fd_handler(vs->csock, vncws_handshake_read, NULL, vs); + if (vs->ioc_tag) { + g_source_remove(vs->ioc_tag); + } + vs->ioc_tag = qio_channel_add_watch( + vs->ioc, G_IO_IN, vncws_handshake_io, vs, NULL); break; case QCRYPTO_TLS_HANDSHAKE_RECVING: VNC_DEBUG("Handshake interrupted (blocking read)\n"); - qemu_set_fd_handler(vs->csock, vncws_tls_handshake_io, NULL, vs); + if (vs->ioc_tag) { + g_source_remove(vs->ioc_tag); + } + vs->ioc_tag = qio_channel_add_watch( + vs->ioc, G_IO_IN, vncws_tls_handshake_io, vs, NULL); break; case QCRYPTO_TLS_HANDSHAKE_SENDING: VNC_DEBUG("Handshake interrupted (blocking write)\n"); - qemu_set_fd_handler(vs->csock, NULL, vncws_tls_handshake_io, vs); + if (vs->ioc_tag) { + g_source_remove(vs->ioc_tag); + } + vs->ioc_tag = qio_channel_add_watch( + vs->ioc, G_IO_OUT, vncws_tls_handshake_io, vs, NULL); break; } @@ -60,7 +72,9 @@ static int vncws_start_tls_handshake(VncState *vs) return -1; } -void vncws_tls_handshake_io(void *opaque) +gboolean vncws_tls_handshake_io(QIOChannel *ioc G_GNUC_UNUSED, + GIOCondition condition G_GNUC_UNUSED, + void *opaque) { VncState *vs = (VncState *)opaque; Error *err = NULL; @@ -75,7 +89,7 @@ void vncws_tls_handshake_io(void *opaque) error_get_pretty(err)); error_free(err); vnc_client_error(vs); - return; + return TRUE; } qcrypto_tls_session_set_callbacks(vs->tls, @@ -85,11 +99,11 @@ void vncws_tls_handshake_io(void *opaque) VNC_DEBUG("Start TLS WS handshake process\n"); vncws_start_tls_handshake(vs); + return TRUE; } -void vncws_handshake_read(void *opaque) +static void vncws_handshake_read(VncState *vs) { - VncState *vs = opaque; uint8_t *handshake_end; long ret; /* Typical HTTP headers from novnc are 512 bytes, so limiting @@ -99,7 +113,7 @@ void vncws_handshake_read(void *opaque) ret = vnc_client_read_buf(vs, buffer_end(&vs->ws_input), want); if (!ret) { - if (vs->csock == -1) { + if (vs->disconnecting) { vnc_disconnect_finish(vs); } return; @@ -109,7 +123,11 @@ void vncws_handshake_read(void *opaque) handshake_end = (uint8_t *)g_strstr_len((char *)vs->ws_input.buffer, vs->ws_input.offset, WS_HANDSHAKE_END); if (handshake_end) { - qemu_set_fd_handler(vs->csock, vnc_client_read, NULL, vs); + if (vs->ioc_tag) { + g_source_remove(vs->ioc_tag); + } + vs->ioc_tag = qio_channel_add_watch( + vs->ioc, G_IO_IN, vnc_client_io, vs, NULL); vncws_process_handshake(vs, vs->ws_input.buffer, vs->ws_input.offset); buffer_advance(&vs->ws_input, handshake_end - vs->ws_input.buffer + strlen(WS_HANDSHAKE_END)); @@ -120,6 +138,15 @@ void vncws_handshake_read(void *opaque) } +gboolean vncws_handshake_io(QIOChannel *ioc G_GNUC_UNUSED, + GIOCondition condition G_GNUC_UNUSED, + void *opaque) +{ + VncState *vs = opaque; + vncws_handshake_read(vs); + return TRUE; +} + long vnc_client_read_ws(VncState *vs) { int ret, err; @@ -187,7 +214,11 @@ long vnc_client_write_ws(VncState *vs) buffer_advance(&vs->ws_output, ret); if (vs->ws_output.offset == 0) { - qemu_set_fd_handler(vs->csock, vnc_client_read, NULL, vs); + if (vs->ioc_tag) { + g_source_remove(vs->ioc_tag); + } + vs->ioc_tag = qio_channel_add_watch( + vs->ioc, G_IO_IN, vnc_client_io, vs, NULL); } return ret; |