Lines Matching +full:user +full:- +full:challenge

29 #include "vnc-jobs.h"
31 #include "hw/qdev-core.h"
34 #include "qemu/error-report.h"
35 #include "qemu/main-loop.h"
41 #include "qemu/config-file.h"
42 #include "qapi/qapi-emit-events.h"
43 #include "qapi/qapi-events-ui.h"
45 #include "qapi/qapi-commands-ui.h"
56 #include "io/dns-resolver.h"
84 fprintf(stderr, "%s/%p: %s -> %s\n", __func__, in vnc_set_share_mode()
85 vs->ioc, mn[vs->share_mode], mn[mode]); in vnc_set_share_mode()
88 switch (vs->share_mode) { in vnc_set_share_mode()
90 vs->vd->num_connecting--; in vnc_set_share_mode()
93 vs->vd->num_shared--; in vnc_set_share_mode()
96 vs->vd->num_exclusive--; in vnc_set_share_mode()
102 vs->share_mode = mode; in vnc_set_share_mode()
104 switch (vs->share_mode) { in vnc_set_share_mode()
106 vs->vd->num_connecting++; in vnc_set_share_mode()
109 vs->vd->num_shared++; in vnc_set_share_mode()
112 vs->vd->num_exclusive++; in vnc_set_share_mode()
124 switch (addr->type) { in vnc_init_basic_info()
126 info->host = g_strdup(addr->u.inet.host); in vnc_init_basic_info()
127 info->service = g_strdup(addr->u.inet.port); in vnc_init_basic_info()
128 if (addr->u.inet.ipv6) { in vnc_init_basic_info()
129 info->family = NETWORK_ADDRESS_FAMILY_IPV6; in vnc_init_basic_info()
131 info->family = NETWORK_ADDRESS_FAMILY_IPV4; in vnc_init_basic_info()
136 info->host = g_strdup(""); in vnc_init_basic_info()
137 info->service = g_strdup(addr->u.q_unix.path); in vnc_init_basic_info()
138 info->family = NETWORK_ADDRESS_FAMILY_UNIX; in vnc_init_basic_info()
144 SocketAddressType_str(addr->type)); in vnc_init_basic_info()
187 switch (vd->auth) { in vnc_auth_name()
205 switch (vd->subauth) { in vnc_auth_name()
238 if (!vd->listener || !vd->listener->nsioc) { in vnc_server_info_get()
243 vnc_init_basic_info_from_server_addr(vd->listener->sioc[0], in vnc_server_info_get()
245 info->auth = g_strdup(vnc_auth_name(vd)); in vnc_server_info_get()
256 if (!client->info) { in vnc_client_cache_auth()
260 if (client->tls) { in vnc_client_cache_auth()
261 client->info->x509_dname = in vnc_client_cache_auth()
262 qcrypto_tls_session_get_peer_name(client->tls); in vnc_client_cache_auth()
265 if (client->sasl.conn && in vnc_client_cache_auth()
266 client->sasl.username) { in vnc_client_cache_auth()
267 client->info->sasl_username = g_strdup(client->sasl.username); in vnc_client_cache_auth()
276 client->info = g_malloc0(sizeof(*client->info)); in vnc_client_cache_addr()
277 vnc_init_basic_info_from_remote_addr(client->sioc, in vnc_client_cache_addr()
278 qapi_VncClientInfo_base(client->info), in vnc_client_cache_addr()
280 client->info->websocket = client->websocket; in vnc_client_cache_addr()
282 qapi_free_VncClientInfo(client->info); in vnc_client_cache_addr()
283 client->info = NULL; in vnc_client_cache_addr()
292 if (!vs->info) { in vnc_qmp_event()
296 si = vnc_server_info_get(vs->vd); in vnc_qmp_event()
303 qapi_event_send_vnc_connected(si, qapi_VncClientInfo_base(vs->info)); in vnc_qmp_event()
306 qapi_event_send_vnc_initialized(si, vs->info); in vnc_qmp_event()
309 qapi_event_send_vnc_disconnected(si, vs->info); in vnc_qmp_event()
325 vnc_init_basic_info_from_remote_addr(client->sioc, in qmp_query_vnc_client()
334 info->websocket = client->websocket; in qmp_query_vnc_client()
336 if (client->tls) { in qmp_query_vnc_client()
337 info->x509_dname = qcrypto_tls_session_get_peer_name(client->tls); in qmp_query_vnc_client()
340 if (client->sasl.conn && client->sasl.username) { in qmp_query_vnc_client()
341 info->sasl_username = g_strdup(client->sasl.username); in qmp_query_vnc_client()
356 if (strcmp(id, vd->id) == 0) { in vnc_display_find()
368 QTAILQ_FOREACH(client, &vd->clients, next) { in qmp_query_client_list()
380 if (vd == NULL || !vd->listener || !vd->listener->nsioc) { in qmp_query_vnc()
381 info->enabled = false; in qmp_query_vnc()
383 info->enabled = true; in qmp_query_vnc()
386 info->has_clients = true; in qmp_query_vnc()
387 info->clients = qmp_query_client_list(vd); in qmp_query_vnc()
389 addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], in qmp_query_vnc()
395 switch (addr->type) { in qmp_query_vnc()
397 info->host = g_strdup(addr->u.inet.host); in qmp_query_vnc()
398 info->service = g_strdup(addr->u.inet.port); in qmp_query_vnc()
399 if (addr->u.inet.ipv6) { in qmp_query_vnc()
400 info->family = NETWORK_ADDRESS_FAMILY_IPV6; in qmp_query_vnc()
402 info->family = NETWORK_ADDRESS_FAMILY_IPV4; in qmp_query_vnc()
407 info->host = g_strdup(""); in qmp_query_vnc()
408 info->service = g_strdup(addr->u.q_unix.path); in qmp_query_vnc()
409 info->family = NETWORK_ADDRESS_FAMILY_UNIX; in qmp_query_vnc()
415 SocketAddressType_str(addr->type)); in qmp_query_vnc()
421 info->has_family = true; in qmp_query_vnc()
423 info->auth = g_strdup(vnc_auth_name(vd)); in qmp_query_vnc()
464 info->websocket = websocket; in qmp_query_server_entry()
466 qmp_query_auth(auth, subauth, &info->auth, in qmp_query_server_entry()
467 &info->vencrypt, &info->has_vencrypt); in qmp_query_server_entry()
553 info->id = g_strdup(vd->id); in qmp_query_vnc_servers()
554 info->clients = qmp_query_client_list(vd); in qmp_query_vnc_servers()
555 qmp_query_auth(vd->auth, vd->subauth, &info->auth, in qmp_query_vnc_servers()
556 &info->vencrypt, &info->has_vencrypt); in qmp_query_vnc_servers()
557 if (vd->dcl.con) { in qmp_query_vnc_servers()
558 dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con), in qmp_query_vnc_servers()
560 info->display = g_strdup(dev->id); in qmp_query_vnc_servers()
562 for (i = 0; vd->listener != NULL && i < vd->listener->nsioc; i++) { in qmp_query_vnc_servers()
563 info->server = qmp_query_server_entry( in qmp_query_vnc_servers()
564 vd->listener->sioc[i], false, vd->auth, vd->subauth, in qmp_query_vnc_servers()
565 info->server); in qmp_query_vnc_servers()
567 for (i = 0; vd->wslistener != NULL && i < vd->wslistener->nsioc; i++) { in qmp_query_vnc_servers()
568 info->server = qmp_query_server_entry( in qmp_query_vnc_servers()
569 vd->wslistener->sioc[i], true, vd->ws_auth, in qmp_query_vnc_servers()
570 vd->ws_subauth, info->server); in qmp_query_vnc_servers()
588 if (!vd->tlscreds) { in vnc_display_reload_certs()
593 creds = QCRYPTO_TLS_CREDS_GET_CLASS(OBJECT(vd->tlscreds)); in vnc_display_reload_certs()
594 if (creds->reload == NULL) { in vnc_display_reload_certs()
596 object_get_typename(OBJECT(vd->tlscreds))); in vnc_display_reload_certs()
599 if (!creds->reload(vd->tlscreds, errp)) { in vnc_display_reload_certs()
608 2) there is some weirdness when using the -S option (the screen is grey
625 return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds), in vnc_width()
631 return MIN(VNC_MAX_WIDTH, surface_width(vd->ds)); in vnc_true_width()
636 return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds)); in vnc_height()
650 x -= (x % VNC_DIRTY_PIXELS_PER_BIT);
654 w = MIN(x + w, width) - x;
667 struct VncSurface *s = &vd->guest; in vnc_dpy_update()
669 vnc_set_area_dirty(s->dirty, vd, x, y, w, h); in vnc_dpy_update()
686 vs, vs->ioc, vs->client_width, vs->client_height, reject_reason); in vnc_desktop_resize_ext()
695 vs->client_width, vs->client_height, in vnc_desktop_resize_ext()
702 vnc_write_u16(vs, 0); /* screen x-pos */ in vnc_desktop_resize_ext()
703 vnc_write_u16(vs, 0); /* screen y-pos */ in vnc_desktop_resize_ext()
704 vnc_write_u16(vs, vs->client_width); in vnc_desktop_resize_ext()
705 vnc_write_u16(vs, vs->client_height); in vnc_desktop_resize_ext()
713 if (vs->ioc == NULL || (!vnc_has_feature(vs, VNC_FEATURE_RESIZE) && in vnc_desktop_resize()
717 if (vs->client_width == vs->vd->true_width && in vnc_desktop_resize()
718 vs->client_height == pixman_image_get_height(vs->vd->server)) { in vnc_desktop_resize()
722 assert(vs->vd->true_width < 65536 && in vnc_desktop_resize()
723 vs->vd->true_width >= 0); in vnc_desktop_resize()
724 assert(pixman_image_get_height(vs->vd->server) < 65536 && in vnc_desktop_resize()
725 pixman_image_get_height(vs->vd->server) >= 0); in vnc_desktop_resize()
726 vs->client_width = vs->vd->true_width; in vnc_desktop_resize()
727 vs->client_height = pixman_image_get_height(vs->vd->server); in vnc_desktop_resize()
735 vs, vs->ioc, vs->client_width, vs->client_height); in vnc_desktop_resize()
741 vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height, in vnc_desktop_resize()
751 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_abort_display_jobs()
753 vs->abort = true; in vnc_abort_display_jobs()
756 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_abort_display_jobs()
759 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_abort_display_jobs()
761 if (vs->update == VNC_STATE_UPDATE_NONE && in vnc_abort_display_jobs()
762 vs->job_update != VNC_STATE_UPDATE_NONE) { in vnc_abort_display_jobs()
764 vs->update = vs->job_update; in vnc_abort_display_jobs()
765 vs->job_update = VNC_STATE_UPDATE_NONE; in vnc_abort_display_jobs()
767 vs->abort = false; in vnc_abort_display_jobs()
774 return pixman_image_get_stride(vd->server); in vnc_server_fb_stride()
781 ptr = (uint8_t *)pixman_image_get_data(vd->server); in vnc_server_fb_ptr()
791 qemu_pixman_image_unref(vd->server); in vnc_update_server_surface()
792 vd->server = NULL; in vnc_update_server_surface()
794 if (QTAILQ_EMPTY(&vd->clients)) { in vnc_update_server_surface()
800 vd->true_width = vnc_true_width(vd); in vnc_update_server_surface()
801 vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT, in vnc_update_server_surface()
805 memset(vd->guest.dirty, 0x00, sizeof(vd->guest.dirty)); in vnc_update_server_surface()
806 vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0, in vnc_update_server_surface()
825 bool pageflip = vnc_check_pageflip(vd->ds, surface); in vnc_dpy_switch()
829 vd->ds = surface; in vnc_dpy_switch()
832 qemu_pixman_image_unref(vd->guest.fb); in vnc_dpy_switch()
833 vd->guest.fb = pixman_image_ref(surface->image); in vnc_dpy_switch()
834 vd->guest.format = surface_format(surface); in vnc_dpy_switch()
842 vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0, in vnc_dpy_switch()
855 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_dpy_switch()
859 memset(vs->dirty, 0x00, sizeof(vs->dirty)); in vnc_dpy_switch()
860 vnc_set_area_dirty(vs->dirty, vd, 0, 0, in vnc_dpy_switch()
880 r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8; in vnc_convert_pixel()
881 g = (((v & 0x0000ff00) >> 8) << vs->client_pf.gbits) >> 8; in vnc_convert_pixel()
882 b = (((v & 0x000000ff) >> 0) << vs->client_pf.bbits) >> 8; in vnc_convert_pixel()
886 v = (r << vs->client_pf.rshift) | in vnc_convert_pixel()
887 (g << vs->client_pf.gshift) | in vnc_convert_pixel()
888 (b << vs->client_pf.bshift); in vnc_convert_pixel()
889 switch (vs->client_pf.bytes_per_pixel) { in vnc_convert_pixel()
894 if (vs->client_endian == G_BIG_ENDIAN) { in vnc_convert_pixel()
904 if (vs->client_endian == G_BIG_ENDIAN) { in vnc_convert_pixel()
930 vnc_write(vs, buf, vs->client_pf.bytes_per_pixel); in vnc_write_pixels_generic()
939 VncDisplay *vd = vs->vd; in vnc_raw_send_framebuffer_update()
943 vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES); in vnc_raw_send_framebuffer_update()
954 switch(vs->vnc_encoding) { in vnc_send_framebuffer_update()
990 QEMUCursor *c = qemu_console_get_cursor(vs->vd->dcl.con); in vnc_cursor_define()
994 return -1; in vnc_cursor_define()
1002 vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height, in vnc_cursor_define()
1005 vnc_write(vs, c->data, c->width * c->height * 4); in vnc_cursor_define()
1014 vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height, in vnc_cursor_define()
1016 isize = c->width * c->height * vs->client_pf.bytes_per_pixel; in vnc_cursor_define()
1017 vnc_write_pixels_generic(vs, c->data, isize); in vnc_cursor_define()
1018 vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize); in vnc_cursor_define()
1022 return -1; in vnc_cursor_define()
1031 g_free(vd->cursor_mask); in vnc_dpy_cursor_define()
1032 vd->cursor_msize = cursor_get_mono_bpl(c) * c->height; in vnc_dpy_cursor_define()
1033 vd->cursor_mask = g_malloc0(vd->cursor_msize); in vnc_dpy_cursor_define()
1034 cursor_get_mono_mask(c, 0, vd->cursor_mask); in vnc_dpy_cursor_define()
1036 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_dpy_cursor_define()
1046 for (h = 1; h < (height - y); h++) { in find_and_clear_dirty_height()
1047 if (!test_bit(last_x, vs->dirty[y + h])) { in find_and_clear_dirty_height()
1050 bitmap_clear(vs->dirty[y + h], last_x, x - last_x); in find_and_clear_dirty_height()
1069 vs->client_width * vs->client_height * vs->client_pf.bytes_per_pixel; in vnc_update_throttle_offset()
1071 if (vs->audio_cap) { in vnc_update_throttle_offset()
1073 switch (vs->as.fmt) { in vnc_update_throttle_offset()
1088 offset += vs->as.freq * bps * vs->as.nchannels; in vnc_update_throttle_offset()
1097 if (vs->throttle_output_offset != offset) { in vnc_update_throttle_offset()
1099 vs, vs->ioc, vs->throttle_output_offset, offset, vs->client_width, in vnc_update_throttle_offset()
1100 vs->client_height, vs->client_pf.bytes_per_pixel, vs->audio_cap); in vnc_update_throttle_offset()
1103 vs->throttle_output_offset = offset; in vnc_update_throttle_offset()
1108 switch (vs->update) { in vnc_should_update()
1116 if (vs->output.offset < vs->throttle_output_offset && in vnc_should_update()
1117 vs->job_update == VNC_STATE_UPDATE_NONE) { in vnc_should_update()
1121 vs, vs->ioc, vs->job_update, vs->output.offset); in vnc_should_update()
1132 if (vs->force_update_offset == 0 && in vnc_should_update()
1133 vs->job_update == VNC_STATE_UPDATE_NONE) { in vnc_should_update()
1137 vs, vs->ioc, vs->job_update, vs->force_update_offset); in vnc_should_update()
1145 VncDisplay *vd = vs->vd; in vnc_update_client()
1151 if (vs->disconnecting) { in vnc_update_client()
1156 vs->has_dirty += has_dirty; in vnc_update_client()
1161 if (!vs->has_dirty && vs->update != VNC_STATE_UPDATE_FORCE) { in vnc_update_client()
1173 height = pixman_image_get_height(vd->server); in vnc_update_client()
1174 width = pixman_image_get_width(vd->server); in vnc_update_client()
1180 unsigned long offset = find_next_bit((unsigned long *) &vs->dirty, in vnc_update_client()
1189 x2 = find_next_zero_bit((unsigned long *) &vs->dirty[y], in vnc_update_client()
1191 bitmap_clear(vs->dirty[y], x, x2 - x); in vnc_update_client()
1196 (x2 - x) * VNC_DIRTY_PIXELS_PER_BIT, h); in vnc_update_client()
1206 vs->job_update = vs->update; in vnc_update_client()
1207 vs->update = VNC_STATE_UPDATE_NONE; in vnc_update_client()
1209 vs->has_dirty = 0; in vnc_update_client()
1218 assert(vs->magic == VNC_MAGIC); in audio_capture_notify()
1221 trace_vnc_msg_server_audio_end(vs, vs->ioc); in audio_capture_notify()
1231 trace_vnc_msg_server_audio_begin(vs, vs->ioc); in audio_capture_notify()
1250 assert(vs->magic == VNC_MAGIC); in audio_capture()
1251 trace_vnc_msg_server_audio_data(vs, vs->ioc, buf, size); in audio_capture()
1253 if (vs->output.offset < vs->throttle_output_offset) { in audio_capture()
1260 trace_vnc_client_throttle_audio(vs, vs->ioc, vs->output.offset); in audio_capture()
1270 if (vs->audio_cap) { in audio_add()
1279 vs->audio_cap = AUD_add_capture(vs->vd->audio_state, &vs->as, &ops, vs); in audio_add()
1280 if (!vs->audio_cap) { in audio_add()
1287 if (vs->audio_cap) { in audio_del()
1288 AUD_del_capture(vs->audio_cap, vs); in audio_del()
1289 vs->audio_cap = NULL; in audio_del()
1295 if (vs->disconnecting) { in vnc_disconnect_start()
1298 trace_vnc_client_disconnect_start(vs, vs->ioc); in vnc_disconnect_start()
1300 if (vs->ioc_tag) { in vnc_disconnect_start()
1301 g_source_remove(vs->ioc_tag); in vnc_disconnect_start()
1302 vs->ioc_tag = 0; in vnc_disconnect_start()
1304 qio_channel_close(vs->ioc, NULL); in vnc_disconnect_start()
1305 vs->disconnecting = TRUE; in vnc_disconnect_start()
1312 trace_vnc_client_disconnect_finish(vs, vs->ioc); in vnc_disconnect_finish()
1319 buffer_free(&vs->input); in vnc_disconnect_finish()
1320 buffer_free(&vs->output); in vnc_disconnect_finish()
1322 qapi_free_VncClientInfo(vs->info); in vnc_disconnect_finish()
1324 vnc_zlib_clear(&vc->worker); in vnc_disconnect_finish()
1325 vnc_tight_clear(&vc->worker); in vnc_disconnect_finish()
1326 vnc_zrle_clear(&vc->worker); in vnc_disconnect_finish()
1332 qkbd_state_lift_all_keys(vs->vd->kbd); in vnc_disconnect_finish()
1334 if (vs->mouse_mode_notifier.notify != NULL) { in vnc_disconnect_finish()
1335 qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier); in vnc_disconnect_finish()
1337 QTAILQ_REMOVE(&vs->vd->clients, vs, next); in vnc_disconnect_finish()
1338 if (QTAILQ_EMPTY(&vs->vd->clients)) { in vnc_disconnect_finish()
1340 vnc_update_server_surface(vs->vd); in vnc_disconnect_finish()
1344 if (vs->cbpeer.notifier.notify) { in vnc_disconnect_finish()
1345 qemu_clipboard_peer_unregister(&vs->cbpeer); in vnc_disconnect_finish()
1348 qemu_mutex_destroy(&vs->output_mutex); in vnc_disconnect_finish()
1349 if (vs->bh != NULL) { in vnc_disconnect_finish()
1350 qemu_bh_delete(vs->bh); in vnc_disconnect_finish()
1352 buffer_free(&vs->jobs_buffer); in vnc_disconnect_finish()
1354 object_unref(OBJECT(vs->ioc)); in vnc_disconnect_finish()
1355 vs->ioc = NULL; in vnc_disconnect_finish()
1356 object_unref(OBJECT(vs->sioc)); in vnc_disconnect_finish()
1357 vs->sioc = NULL; in vnc_disconnect_finish()
1358 vs->magic = 0; in vnc_disconnect_finish()
1366 trace_vnc_client_eof(vs, vs->ioc); in vnc_client_io_error()
1369 trace_vnc_client_io_error(vs, vs->ioc, in vnc_client_io_error()
1396 * though, since SASL encryption will typically be a no-op if TLS
1407 ret = qio_channel_write(vs->ioc, (const char *)data, datalen, &err); in vnc_client_write_buf()
1408 VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret); in vnc_client_write_buf()
1430 vs->output.buffer, vs->output.capacity, vs->output.offset, in vnc_client_write_plain()
1431 vs->sasl.waitWriteSSF); in vnc_client_write_plain()
1433 if (vs->sasl.conn && in vnc_client_write_plain()
1434 vs->sasl.runSSF && in vnc_client_write_plain()
1435 vs->sasl.waitWriteSSF) { in vnc_client_write_plain()
1436 ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF); in vnc_client_write_plain()
1438 vs->sasl.waitWriteSSF -= ret; in vnc_client_write_plain()
1441 ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset); in vnc_client_write_plain()
1445 if (ret >= vs->force_update_offset) { in vnc_client_write_plain()
1446 if (vs->force_update_offset != 0) { in vnc_client_write_plain()
1447 trace_vnc_client_unthrottle_forced(vs, vs->ioc); in vnc_client_write_plain()
1449 vs->force_update_offset = 0; in vnc_client_write_plain()
1451 vs->force_update_offset -= ret; in vnc_client_write_plain()
1453 offset = vs->output.offset; in vnc_client_write_plain()
1454 buffer_advance(&vs->output, ret); in vnc_client_write_plain()
1455 if (offset >= vs->throttle_output_offset && in vnc_client_write_plain()
1456 vs->output.offset < vs->throttle_output_offset) { in vnc_client_write_plain()
1457 trace_vnc_client_unthrottle_incremental(vs, vs->ioc, vs->output.offset); in vnc_client_write_plain()
1460 if (vs->output.offset == 0) { in vnc_client_write_plain()
1461 if (vs->ioc_tag) { in vnc_client_write_plain()
1462 g_source_remove(vs->ioc_tag); in vnc_client_write_plain()
1464 vs->ioc_tag = qio_channel_add_watch( in vnc_client_write_plain()
1465 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR, in vnc_client_write_plain()
1481 if (vs->sasl.conn && in vnc_client_write_locked()
1482 vs->sasl.runSSF && in vnc_client_write_locked()
1483 !vs->sasl.waitWriteSSF) { in vnc_client_write_locked()
1494 assert(vs->magic == VNC_MAGIC); in vnc_client_write()
1496 if (vs->output.offset) { in vnc_client_write()
1498 } else if (vs->ioc != NULL) { in vnc_client_write()
1499 if (vs->ioc_tag) { in vnc_client_write()
1500 g_source_remove(vs->ioc_tag); in vnc_client_write()
1502 vs->ioc_tag = qio_channel_add_watch( in vnc_client_write()
1503 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR, in vnc_client_write()
1511 vs->read_handler = func; in vnc_read_when()
1512 vs->read_handler_expect = expecting; in vnc_read_when()
1524 * though, since SASL encryption will typically be a no-op if TLS
1535 ret = qio_channel_read(vs->ioc, (char *)data, datalen, &err); in vnc_client_read_buf()
1536 VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret); in vnc_client_read_buf()
1554 vs->input.buffer, vs->input.capacity, vs->input.offset); in vnc_client_read_plain()
1555 buffer_reserve(&vs->input, 4096); in vnc_client_read_plain()
1556 ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096); in vnc_client_read_plain()
1559 vs->input.offset += ret; in vnc_client_read_plain()
1567 assert(vs->magic == VNC_MAGIC); in vnc_jobs_bh()
1575 * Returns 0 on success, -1 if client disconnected
1582 if (vs->sasl.conn && vs->sasl.runSSF) in vnc_client_read()
1588 if (vs->disconnecting) { in vnc_client_read()
1590 return -1; in vnc_client_read()
1595 while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) { in vnc_client_read()
1596 size_t len = vs->read_handler_expect; in vnc_client_read()
1599 ret = vs->read_handler(vs, vs->input.buffer, len); in vnc_client_read()
1600 if (vs->disconnecting) { in vnc_client_read()
1602 return -1; in vnc_client_read()
1606 buffer_advance(&vs->input, len); in vnc_client_read()
1608 vs->read_handler_expect = ret; in vnc_client_read()
1619 assert(vs->magic == VNC_MAGIC); in vnc_client_io()
1636 if (vs->disconnecting) { in vnc_client_io()
1637 if (vs->ioc_tag != 0) { in vnc_client_io()
1638 g_source_remove(vs->ioc_tag); in vnc_client_io()
1640 vs->ioc_tag = 0; in vnc_client_io()
1647 * Scale factor to apply to vs->throttle_output_offset when checking for
1657 assert(vs->magic == VNC_MAGIC); in vnc_write()
1658 if (vs->disconnecting) { in vnc_write()
1666 * this higher level if a huge number of pseudo-encodings get in vnc_write()
1672 if (vs->throttle_output_offset != 0 && in vnc_write()
1673 (vs->output.offset / VNC_THROTTLE_OUTPUT_LIMIT_SCALE) > in vnc_write()
1674 vs->throttle_output_offset) { in vnc_write()
1675 trace_vnc_client_output_limit(vs, vs->ioc, vs->output.offset, in vnc_write()
1676 vs->throttle_output_offset); in vnc_write()
1680 buffer_reserve(&vs->output, len); in vnc_write()
1682 if (vs->ioc != NULL && buffer_empty(&vs->output)) { in vnc_write()
1683 if (vs->ioc_tag) { in vnc_write()
1684 g_source_remove(vs->ioc_tag); in vnc_write()
1686 vs->ioc_tag = qio_channel_add_watch( in vnc_write()
1687 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_OUT, in vnc_write()
1691 buffer_append(&vs->output, data, len); in vnc_write()
1729 if (vs->ioc != NULL && vs->output.offset) { in vnc_flush()
1732 if (vs->disconnecting) { in vnc_flush()
1733 if (vs->ioc_tag != 0) { in vnc_flush()
1734 g_source_remove(vs->ioc_tag); in vnc_flush()
1736 vs->ioc_tag = 0; in vnc_flush()
1766 int absolute = qemu_input_is_absolute(vs->vd->dcl.con); in check_pointer_type_change()
1768 if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) { in check_pointer_type_change()
1774 pixman_image_get_width(vs->vd->server), in check_pointer_type_change()
1775 pixman_image_get_height(vs->vd->server), in check_pointer_type_change()
1780 vs->absolute = absolute; in check_pointer_type_change()
1792 QemuConsole *con = vs->vd->dcl.con; in pointer_event()
1793 int width = pixman_image_get_width(vs->vd->server); in pointer_event()
1794 int height = pixman_image_get_height(vs->vd->server); in pointer_event()
1796 if (vs->last_bmask != button_mask) { in pointer_event()
1797 qemu_input_update_buttons(con, bmap, vs->last_bmask, button_mask); in pointer_event()
1798 vs->last_bmask = button_mask; in pointer_event()
1801 if (vs->absolute) { in pointer_event()
1805 qemu_input_queue_rel(con, INPUT_AXIS_X, x - 0x7FFF); in pointer_event()
1806 qemu_input_queue_rel(con, INPUT_AXIS_Y, y - 0x7FFF); in pointer_event()
1808 if (vs->last_x != -1) { in pointer_event()
1809 qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x); in pointer_event()
1810 qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y); in pointer_event()
1812 vs->last_x = x; in pointer_event()
1813 vs->last_y = y; in pointer_event()
1820 qkbd_state_key_event(vs->vd->kbd, qcode, true); in press_key()
1821 qkbd_state_key_event(vs->vd->kbd, qcode, false); in press_key()
1835 vnc_write_u8(vs, vs->vd->ledstate); in vnc_led_state_change()
1849 if (ledstate == vd->ledstate) { in kbd_leds()
1853 vd->ledstate = ledstate; in kbd_leds()
1855 QTAILQ_FOREACH(client, &vd->clients, next) { in kbd_leds()
1868 qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) && in do_key_event()
1869 qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) { in do_key_event()
1870 QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1); in do_key_event()
1872 unregister_displaychangelistener(&vs->vd->dcl); in do_key_event()
1873 qkbd_state_switch_console(vs->vd->kbd, con); in do_key_event()
1874 vs->vd->dcl.con = con; in do_key_event()
1875 register_displaychangelistener(&vs->vd->dcl); in do_key_event()
1886 if (down && vs->vd->lock_key_sync && in do_key_event()
1888 keycode_is_keypad(vs->vd->kbd_layout, keycode)) { in do_key_event()
1890 keypress before sending this one. This will happen if the user in do_key_event()
1893 if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) { in do_key_event()
1894 if (!qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) { in do_key_event()
1899 if (qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) { in do_key_event()
1906 if (down && vs->vd->lock_key_sync && in do_key_event()
1910 keypress before sending this one. This will happen if the user in do_key_event()
1914 bool shift = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_SHIFT); in do_key_event()
1915 bool capslock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CAPSLOCK); in do_key_event()
1929 qkbd_state_key_event(vs->vd->kbd, qcode, down); in do_key_event()
1930 if (QEMU_IS_TEXT_CONSOLE(vs->vd->dcl.con)) { in do_key_event()
1931 QemuTextConsole *con = QEMU_TEXT_CONSOLE(vs->vd->dcl.con); in do_key_event()
1932 bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK); in do_key_event()
1933 bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL); in do_key_event()
2013 qemu_text_console_put_keysym(con, '-'); in do_key_event()
2044 if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(vs->vd->dcl.con)) { in key_event()
2045 lsym = lsym - 'A' + 'a'; in key_event()
2048 keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF, in key_event()
2049 vs->vd->kbd, down) & SCANCODE_KEYMASK; in key_event()
2057 /* if the user specifies a keyboard layout, always use it */ in ext_key_event()
2070 if (vs->update != VNC_STATE_UPDATE_FORCE) { in framebuffer_update_request()
2071 vs->update = VNC_STATE_UPDATE_INCREMENTAL; in framebuffer_update_request()
2074 vs->update = VNC_STATE_UPDATE_FORCE; in framebuffer_update_request()
2075 vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h); in framebuffer_update_request()
2089 pixman_image_get_width(vs->vd->server), in send_ext_key_event_ack()
2090 pixman_image_get_height(vs->vd->server), in send_ext_key_event_ack()
2103 pixman_image_get_width(vs->vd->server), in send_ext_audio_ack()
2104 pixman_image_get_height(vs->vd->server), in send_ext_audio_ack()
2127 vs->features = 0; in set_encodings()
2128 vs->vnc_encoding = 0; in set_encodings()
2129 vc->worker.tight.compression = 9; in set_encodings()
2130 vc->worker.tight.quality = -1; /* Lossless by default */ in set_encodings()
2131 vs->absolute = -1; in set_encodings()
2138 for (i = n_encodings - 1; i >= 0; i--) { in set_encodings()
2142 vs->vnc_encoding = enc; in set_encodings()
2146 vs->vnc_encoding = enc; in set_encodings()
2150 vs->vnc_encoding = enc; in set_encodings()
2155 vs->vnc_encoding = enc; in set_encodings()
2166 vs->vnc_encoding = enc; in set_encodings()
2171 vs->vnc_encoding = enc; in set_encodings()
2175 vs->vnc_encoding = enc; in set_encodings()
2196 if (vs->vd->audio_state) { in set_encodings()
2208 if (vs->vd->power_control) { in set_encodings()
2218 vc->worker.tight.compression = (enc & 0x0F); in set_encodings()
2221 if (vs->vd->lossy) { in set_encodings()
2222 vc->worker.tight.quality = (enc & 0x0F); in set_encodings()
2231 check_pointer_type_change(&vs->mouse_mode_notifier, NULL); in set_encodings()
2238 pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf, in set_pixel_conversion()
2239 vs->client_endian); in set_pixel_conversion()
2242 vs->write_pixels = vnc_write_pixels_copy; in set_pixel_conversion()
2245 vs->write_pixels = vnc_write_pixels_generic; in set_pixel_conversion()
2261 PixelFormat *pf = &vs->client_pf; in send_color_map()
2263 vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits))); in send_color_map()
2264 vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits))); in send_color_map()
2265 vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits))); in send_color_map()
2296 vs->client_pf.rmax = red_max ? red_max : 0xFF; in set_pixel_format()
2297 vs->client_pf.rbits = ctpopl(red_max); in set_pixel_format()
2298 vs->client_pf.rshift = red_shift; in set_pixel_format()
2299 vs->client_pf.rmask = red_max << red_shift; in set_pixel_format()
2300 vs->client_pf.gmax = green_max ? green_max : 0xFF; in set_pixel_format()
2301 vs->client_pf.gbits = ctpopl(green_max); in set_pixel_format()
2302 vs->client_pf.gshift = green_shift; in set_pixel_format()
2303 vs->client_pf.gmask = green_max << green_shift; in set_pixel_format()
2304 vs->client_pf.bmax = blue_max ? blue_max : 0xFF; in set_pixel_format()
2305 vs->client_pf.bbits = ctpopl(blue_max); in set_pixel_format()
2306 vs->client_pf.bshift = blue_shift; in set_pixel_format()
2307 vs->client_pf.bmask = blue_max << blue_shift; in set_pixel_format()
2308 vs->client_pf.bits_per_pixel = bits_per_pixel; in set_pixel_format()
2309 vs->client_pf.bytes_per_pixel = bits_per_pixel / 8; in set_pixel_format()
2310 vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel; in set_pixel_format()
2311 vs->client_endian = big_endian_flag ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; in set_pixel_format()
2312 trace_vnc_client_pixel_format(vs, vs->ioc, in set_pixel_format()
2313 vs->client_pf.bits_per_pixel, in set_pixel_format()
2314 vs->client_pf.depth, in set_pixel_format()
2315 vs->client_endian); in set_pixel_format()
2316 trace_vnc_client_pixel_format_red(vs, vs->ioc, in set_pixel_format()
2317 vs->client_pf.rmax, in set_pixel_format()
2318 vs->client_pf.rbits, in set_pixel_format()
2319 vs->client_pf.rshift, in set_pixel_format()
2320 vs->client_pf.rmask); in set_pixel_format()
2321 trace_vnc_client_pixel_format_green(vs, vs->ioc, in set_pixel_format()
2322 vs->client_pf.gmax, in set_pixel_format()
2323 vs->client_pf.gbits, in set_pixel_format()
2324 vs->client_pf.gshift, in set_pixel_format()
2325 vs->client_pf.gmask); in set_pixel_format()
2326 trace_vnc_client_pixel_format_blue(vs, vs->ioc, in set_pixel_format()
2327 vs->client_pf.bmax, in set_pixel_format()
2328 vs->client_pf.bbits, in set_pixel_format()
2329 vs->client_pf.bshift, in set_pixel_format()
2330 vs->client_pf.bmask); in set_pixel_format()
2338 graphic_hw_invalidate(vs->vd->dcl.con); in set_pixel_format()
2339 graphic_hw_update(vs->vd->dcl.con); in set_pixel_format()
2345 vs->client_pf = qemu_default_pixelformat(32); in pixel_format_message()
2346 vs->client_endian = G_BYTE_ORDER; in pixel_format_message()
2348 vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */ in pixel_format_message()
2349 vnc_write_u8(vs, vs->client_pf.depth); /* depth */ in pixel_format_message()
2352 vnc_write_u8(vs, 1); /* big-endian-flag */ in pixel_format_message()
2354 vnc_write_u8(vs, 0); /* big-endian-flag */ in pixel_format_message()
2356 vnc_write_u8(vs, 1); /* true-color-flag */ in pixel_format_message()
2357 vnc_write_u16(vs, vs->client_pf.rmax); /* red-max */ in pixel_format_message()
2358 vnc_write_u16(vs, vs->client_pf.gmax); /* green-max */ in pixel_format_message()
2359 vnc_write_u16(vs, vs->client_pf.bmax); /* blue-max */ in pixel_format_message()
2360 vnc_write_u8(vs, vs->client_pf.rshift); /* red-shift */ in pixel_format_message()
2361 vnc_write_u8(vs, vs->client_pf.gshift); /* green-shift */ in pixel_format_message()
2362 vnc_write_u8(vs, vs->client_pf.bshift); /* blue-shift */ in pixel_format_message()
2366 vs->write_pixels = vnc_write_pixels_copy; in pixel_format_message()
2378 vs->client_width, in vnc_colordepth()
2379 vs->client_height, in vnc_colordepth()
2394 VncDisplay *vd = vs->vd; in protocol_client_msg()
2397 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in protocol_client_msg()
2405 trace_vnc_msg_client_set_pixel_format(vs, vs->ioc, in protocol_client_msg()
2409 trace_vnc_msg_client_set_pixel_format_rgb(vs, vs->ioc, in protocol_client_msg()
2438 trace_vnc_msg_client_set_encodings(vs, vs->ioc, limit); in protocol_client_msg()
2445 trace_vnc_msg_client_framebuffer_update_request(vs, vs->ioc, in protocol_client_msg()
2459 trace_vnc_msg_client_key_event(vs, vs->ioc, in protocol_client_msg()
2468 trace_vnc_msg_client_pointer_event(vs, vs->ioc, in protocol_client_msg()
2499 " in extended clipboard pseudo-encoding."); in protocol_client_msg()
2503 trace_vnc_msg_client_cut_text_ext(vs, vs->ioc, in protocol_client_msg()
2508 trace_vnc_msg_client_cut_text(vs, vs->ioc, read_u32(data, 4)); in protocol_client_msg()
2523 trace_vnc_msg_client_xvp(vs, vs->ioc, version, action); in protocol_client_msg()
2557 trace_vnc_msg_client_ext_key_event(vs, vs->ioc, in protocol_client_msg()
2576 trace_vnc_msg_client_audio_enable(vs, vs->ioc); in protocol_client_msg()
2580 trace_vnc_msg_client_audio_disable(vs, vs->ioc); in protocol_client_msg()
2587 case 0: vs->as.fmt = AUDIO_FORMAT_U8; break; in protocol_client_msg()
2588 case 1: vs->as.fmt = AUDIO_FORMAT_S8; break; in protocol_client_msg()
2589 case 2: vs->as.fmt = AUDIO_FORMAT_U16; break; in protocol_client_msg()
2590 case 3: vs->as.fmt = AUDIO_FORMAT_S16; break; in protocol_client_msg()
2591 case 4: vs->as.fmt = AUDIO_FORMAT_U32; break; in protocol_client_msg()
2592 case 5: vs->as.fmt = AUDIO_FORMAT_S32; break; in protocol_client_msg()
2598 vs->as.nchannels = read_u8(data, 5); in protocol_client_msg()
2599 if (vs->as.nchannels != 1 && vs->as.nchannels != 2) { in protocol_client_msg()
2608 * protects calculations involving 'vs->as.freq' later. in protocol_client_msg()
2615 vs->as.freq = freq; in protocol_client_msg()
2617 vs, vs->ioc, vs->as.fmt, vs->as.nchannels, vs->as.freq); in protocol_client_msg()
2650 trace_vnc_msg_client_set_desktop_size(vs, vs->ioc, w, h, screens); in protocol_client_msg()
2651 if (dpy_ui_info_supported(vs->vd->dcl.con)) { in protocol_client_msg()
2656 dpy_set_ui_info(vs->vd->dcl.con, &info, false); in protocol_client_msg()
2682 switch (vs->vd->share_policy) { in protocol_client_init()
2704 QTAILQ_FOREACH(client, &vs->vd->clients, next) { in protocol_client_init()
2708 if (client->share_mode != VNC_SHARE_MODE_EXCLUSIVE && in protocol_client_init()
2709 client->share_mode != VNC_SHARE_MODE_SHARED) { in protocol_client_init()
2716 if (vs->vd->num_exclusive > 0) { in protocol_client_init()
2728 * someone forgetting to say -shared when running the vnc in protocol_client_init()
2739 if (vs->vd->num_shared > vs->vd->connections_limit) { in protocol_client_init()
2744 assert(pixman_image_get_width(vs->vd->server) < 65536 && in protocol_client_init()
2745 pixman_image_get_width(vs->vd->server) >= 0); in protocol_client_init()
2746 assert(pixman_image_get_height(vs->vd->server) < 65536 && in protocol_client_init()
2747 pixman_image_get_height(vs->vd->server) >= 0); in protocol_client_init()
2748 vs->client_width = pixman_image_get_width(vs->vd->server); in protocol_client_init()
2749 vs->client_height = pixman_image_get_height(vs->vd->server); in protocol_client_init()
2750 vnc_write_u16(vs, vs->client_width); in protocol_client_init()
2751 vnc_write_u16(vs, vs->client_height); in protocol_client_init()
2784 if (vs->minor >= 8) { in authentication_failed()
2815 if (!vs->vd->password) { in protocol_client_auth_vnc()
2816 trace_vnc_auth_fail(vs, vs->auth, "password is not set", ""); in protocol_client_auth_vnc()
2819 if (vs->vd->expires < now) { in protocol_client_auth_vnc()
2820 trace_vnc_auth_fail(vs, vs->auth, "password is expired", ""); in protocol_client_auth_vnc()
2824 memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE); in protocol_client_auth_vnc()
2826 /* Calculate the expected challenge response */ in protocol_client_auth_vnc()
2827 pwlen = strlen(vs->vd->password); in protocol_client_auth_vnc()
2829 key[i] = i<pwlen ? vs->vd->password[i] : 0; in protocol_client_auth_vnc()
2838 trace_vnc_auth_fail(vs, vs->auth, "cannot create cipher", in protocol_client_auth_vnc()
2845 vs->challenge, in protocol_client_auth_vnc()
2849 trace_vnc_auth_fail(vs, vs->auth, "cannot encrypt challenge response", in protocol_client_auth_vnc()
2855 /* Compare expected vs actual challenge response */ in protocol_client_auth_vnc()
2857 trace_vnc_auth_fail(vs, vs->auth, "mis-matched challenge response", ""); in protocol_client_auth_vnc()
2860 trace_vnc_auth_pass(vs, vs->auth); in protocol_client_auth_vnc()
2880 if (qcrypto_random_bytes(vs->challenge, sizeof(vs->challenge), &err)) { in start_auth_vnc()
2881 trace_vnc_auth_fail(vs, vs->auth, "cannot get random bytes", in start_auth_vnc()
2888 /* Send client a 'random' challenge */ in start_auth_vnc()
2889 vnc_write(vs, vs->challenge, sizeof(vs->challenge)); in start_auth_vnc()
2892 vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge)); in start_auth_vnc()
2900 if (data[0] != vs->auth) { /* Reject auth */ in protocol_client_auth()
2901 trace_vnc_auth_reject(vs, vs->auth, (int)data[0]); in protocol_client_auth()
2904 trace_vnc_auth_start(vs, vs->auth); in protocol_client_auth()
2905 switch (vs->auth) { in protocol_client_auth()
2907 if (vs->minor >= 8) { in protocol_client_auth()
2911 trace_vnc_auth_pass(vs, vs->auth); in protocol_client_auth()
2930 trace_vnc_auth_fail(vs, vs->auth, "Unhandled auth method", ""); in protocol_client_auth()
2944 if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) { in protocol_version()
2949 VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor); in protocol_version()
2950 if (vs->major != 3 || in protocol_version()
2951 (vs->minor != 3 && in protocol_version()
2952 vs->minor != 4 && in protocol_version()
2953 vs->minor != 5 && in protocol_version()
2954 vs->minor != 7 && in protocol_version()
2955 vs->minor != 8)) { in protocol_version()
2965 if (vs->minor == 4 || vs->minor == 5) in protocol_version()
2966 vs->minor = 3; in protocol_version()
2968 if (vs->minor == 3) { in protocol_version()
2969 trace_vnc_auth_start(vs, vs->auth); in protocol_version()
2970 if (vs->auth == VNC_AUTH_NONE) { in protocol_version()
2971 vnc_write_u32(vs, vs->auth); in protocol_version()
2973 trace_vnc_auth_pass(vs, vs->auth); in protocol_version()
2975 } else if (vs->auth == VNC_AUTH_VNC) { in protocol_version()
2977 vnc_write_u32(vs, vs->auth); in protocol_version()
2981 trace_vnc_auth_fail(vs, vs->auth, in protocol_version()
2989 vnc_write_u8(vs, vs->auth); in protocol_version()
2999 struct VncSurface *vs = &vd->guest; in vnc_stat_rect()
3001 return &vs->stats[y / VNC_STAT_RECT][x / VNC_STAT_RECT]; in vnc_stat_rect()
3015 worker->lossy_rect[j][i] = 1; in vnc_sent_lossy_rect()
3030 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_refresh_lossy_rect()
3034 /* kernel send buffers are full -> refresh later */ in vnc_refresh_lossy_rect()
3035 if (vs->output.offset) { in vnc_refresh_lossy_rect()
3039 if (!vc->worker.lossy_rect[sty][stx]) { in vnc_refresh_lossy_rect()
3043 vc->worker.lossy_rect[sty][stx] = 0; in vnc_refresh_lossy_rect()
3045 bitmap_set(vs->dirty[y + j], in vnc_refresh_lossy_rect()
3057 int width = MIN(pixman_image_get_width(vd->guest.fb), in vnc_update_stats()
3058 pixman_image_get_width(vd->server)); in vnc_update_stats()
3059 int height = MIN(pixman_image_get_height(vd->guest.fb), in vnc_update_stats()
3060 pixman_image_get_height(vd->server)); in vnc_update_stats()
3069 rect->updated = false; in vnc_update_stats()
3075 if (timercmp(&vd->guest.last_freq_check, &res, >)) { in vnc_update_stats()
3078 vd->guest.last_freq_check = *tv; in vnc_update_stats()
3083 int count = ARRAY_SIZE(rect->times); in vnc_update_stats()
3086 if (!timerisset(&rect->times[count - 1])) { in vnc_update_stats()
3090 max = rect->times[(rect->idx + count - 1) % count]; in vnc_update_stats()
3094 rect->freq = 0; in vnc_update_stats()
3096 memset(rect->times, 0, sizeof (rect->times)); in vnc_update_stats()
3100 min = rect->times[rect->idx]; in vnc_update_stats()
3101 max = rect->times[(rect->idx + count - 1) % count]; in vnc_update_stats()
3104 rect->freq = res.tv_sec + res.tv_usec / 1000000.; in vnc_update_stats()
3105 rect->freq /= count; in vnc_update_stats()
3106 rect->freq = 1. / rect->freq; in vnc_update_stats()
3123 total += vnc_stat_rect(vs->vd, i, j)->freq; in vnc_update_freq()
3140 if (rect->updated) { in vnc_rect_updated()
3143 rect->times[rect->idx] = *tv; in vnc_rect_updated()
3144 rect->idx = (rect->idx + 1) % ARRAY_SIZE(rect->times); in vnc_rect_updated()
3145 rect->updated = true; in vnc_rect_updated()
3150 int width = MIN(pixman_image_get_width(vd->guest.fb), in vnc_refresh_server_surface()
3151 pixman_image_get_width(vd->server)); in vnc_refresh_server_surface()
3152 int height = MIN(pixman_image_get_height(vd->guest.fb), in vnc_refresh_server_surface()
3153 pixman_image_get_height(vd->server)); in vnc_refresh_server_surface()
3165 if (!vd->non_adaptive) { in vnc_refresh_server_surface()
3170 offset = find_next_bit((unsigned long *) &vd->guest.dirty, in vnc_refresh_server_surface()
3171 height * VNC_DIRTY_BPL(&vd->guest), 0); in vnc_refresh_server_surface()
3172 if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { in vnc_refresh_server_surface()
3182 server_row0 = (uint8_t *)pixman_image_get_data(vd->server); in vnc_refresh_server_surface()
3184 pixman_image_get_stride(vd->server); in vnc_refresh_server_surface()
3187 if (vd->guest.format != VNC_SERVER_FB_FORMAT) { in vnc_refresh_server_surface()
3188 int w = pixman_image_get_width(vd->server); in vnc_refresh_server_surface()
3192 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb)); in vnc_refresh_server_surface()
3193 guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb); in vnc_refresh_server_surface()
3194 guest_stride = pixman_image_get_stride(vd->guest.fb); in vnc_refresh_server_surface()
3195 guest_ll = pixman_image_get_width(vd->guest.fb) in vnc_refresh_server_surface()
3201 y = offset / VNC_DIRTY_BPL(&vd->guest); in vnc_refresh_server_surface()
3202 x = offset % VNC_DIRTY_BPL(&vd->guest); in vnc_refresh_server_surface()
3206 if (vd->guest.format != VNC_SERVER_FB_FORMAT) { in vnc_refresh_server_surface()
3207 qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y); in vnc_refresh_server_surface()
3217 if (!test_and_clear_bit(x, vd->guest.dirty[y])) { in vnc_refresh_server_surface()
3221 _cmp_bytes = line_bytes - x * cmp_bytes; in vnc_refresh_server_surface()
3228 if (!vd->non_adaptive) { in vnc_refresh_server_surface()
3232 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_refresh_server_surface()
3233 set_bit(x, vs->dirty[y]); in vnc_refresh_server_surface()
3239 offset = find_next_bit((unsigned long *) &vd->guest.dirty, in vnc_refresh_server_surface()
3240 height * VNC_DIRTY_BPL(&vd->guest), in vnc_refresh_server_surface()
3241 y * VNC_DIRTY_BPL(&vd->guest)); in vnc_refresh_server_surface()
3242 if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { in vnc_refresh_server_surface()
3257 if (QTAILQ_EMPTY(&vd->clients)) { in vnc_refresh()
3258 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX); in vnc_refresh()
3262 graphic_hw_update(vd->dcl.con); in vnc_refresh()
3265 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in vnc_refresh()
3272 QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) { in vnc_refresh()
3278 vd->dcl.update_interval /= 2; in vnc_refresh()
3279 if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) { in vnc_refresh()
3280 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE; in vnc_refresh()
3283 vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC; in vnc_refresh()
3284 if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) { in vnc_refresh()
3285 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX; in vnc_refresh()
3294 VncState *vs = &vc->vs; in vnc_connect()
3295 bool first_client = QTAILQ_EMPTY(&vd->clients); in vnc_connect()
3298 vs->magic = VNC_MAGIC; in vnc_connect()
3299 vs->sioc = sioc; in vnc_connect()
3300 object_ref(OBJECT(vs->sioc)); in vnc_connect()
3301 vs->ioc = QIO_CHANNEL(sioc); in vnc_connect()
3302 object_ref(OBJECT(vs->ioc)); in vnc_connect()
3303 vs->vd = vd; in vnc_connect()
3305 buffer_init(&vs->input, "vnc-input/%p", sioc); in vnc_connect()
3306 buffer_init(&vs->output, "vnc-output/%p", sioc); in vnc_connect()
3307 buffer_init(&vs->jobs_buffer, "vnc-jobs_buffer/%p", sioc); in vnc_connect()
3309 buffer_init(&vc->worker.tight.tight, "vnc-tight/%p", sioc); in vnc_connect()
3310 buffer_init(&vc->worker.tight.zlib, "vnc-tight-zlib/%p", sioc); in vnc_connect()
3311 buffer_init(&vc->worker.tight.gradient, "vnc-tight-gradient/%p", sioc); in vnc_connect()
3313 buffer_init(&vc->worker.tight.jpeg, "vnc-tight-jpeg/%p", sioc); in vnc_connect()
3316 buffer_init(&vc->worker.tight.png, "vnc-tight-png/%p", sioc); in vnc_connect()
3318 buffer_init(&vc->worker.zlib.zlib, "vnc-zlib/%p", sioc); in vnc_connect()
3319 buffer_init(&vc->worker.zrle.zrle, "vnc-zrle/%p", sioc); in vnc_connect()
3320 buffer_init(&vc->worker.zrle.fb, "vnc-zrle-fb/%p", sioc); in vnc_connect()
3321 buffer_init(&vc->worker.zrle.zlib, "vnc-zrle-zlib/%p", sioc); in vnc_connect()
3324 vs->auth = VNC_AUTH_NONE; in vnc_connect()
3325 vs->subauth = VNC_AUTH_INVALID; in vnc_connect()
3328 vs->auth = vd->ws_auth; in vnc_connect()
3329 vs->subauth = VNC_AUTH_INVALID; in vnc_connect()
3331 vs->auth = vd->auth; in vnc_connect()
3332 vs->subauth = vd->subauth; in vnc_connect()
3336 sioc, websocket, vs->auth, vs->subauth); in vnc_connect()
3338 VNC_DEBUG("New client on socket %p\n", vs->sioc); in vnc_connect()
3339 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in vnc_connect()
3340 qio_channel_set_blocking(vs->ioc, false, NULL); in vnc_connect()
3341 if (vs->ioc_tag) { in vnc_connect()
3342 g_source_remove(vs->ioc_tag); in vnc_connect()
3345 vs->websocket = 1; in vnc_connect()
3346 if (vd->tlscreds) { in vnc_connect()
3347 vs->ioc_tag = qio_channel_add_watch( in vnc_connect()
3348 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR, in vnc_connect()
3351 vs->ioc_tag = qio_channel_add_watch( in vnc_connect()
3352 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR, in vnc_connect()
3356 vs->ioc_tag = qio_channel_add_watch( in vnc_connect()
3357 vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR, in vnc_connect()
3365 vs->last_x = -1; in vnc_connect()
3366 vs->last_y = -1; in vnc_connect()
3368 vs->as.freq = 44100; in vnc_connect()
3369 vs->as.nchannels = 2; in vnc_connect()
3370 vs->as.fmt = AUDIO_FORMAT_S16; in vnc_connect()
3371 vs->as.endianness = 0; in vnc_connect()
3373 qemu_mutex_init(&vs->output_mutex); in vnc_connect()
3374 vs->bh = qemu_bh_new(vnc_jobs_bh, vs); in vnc_connect()
3376 QTAILQ_INSERT_TAIL(&vd->clients, vs, next); in vnc_connect()
3381 graphic_hw_update(vd->dcl.con); in vnc_connect()
3383 if (!vs->websocket) { in vnc_connect()
3387 if (vd->num_connecting > vd->connections_limit) { in vnc_connect()
3388 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_connect()
3389 if (vs->share_mode == VNC_SHARE_MODE_CONNECTING) { in vnc_connect()
3403 vs->mouse_mode_notifier.notify = check_pointer_type_change; in vnc_start_protocol()
3404 qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier); in vnc_start_protocol()
3412 bool isWebsock = listener == vd->wslistener; in vnc_listen_io()
3415 isWebsock ? "vnc-ws-server" : "vnc-server"); in vnc_listen_io()
3437 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in vmstate_change_handler()
3449 vd->id = strdup(id); in vnc_display_init()
3452 QTAILQ_INIT(&vd->clients); in vnc_display_init()
3453 vd->expires = TIME_MAX; in vnc_display_init()
3457 vd->kbd_layout = init_keyboard_layout(name2keysym, in vnc_display_init()
3460 vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us", errp); in vnc_display_init()
3463 if (!vd->kbd_layout) { in vnc_display_init()
3467 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_init()
3468 vd->connections_limit = 32; in vnc_display_init()
3470 qemu_mutex_init(&vd->mutex); in vnc_display_init()
3473 vd->dcl.ops = &dcl_ops; in vnc_display_init()
3474 register_displaychangelistener(&vd->dcl); in vnc_display_init()
3475 vd->kbd = qkbd_state_init(vd->dcl.con); in vnc_display_init()
3476 vd->vmstate_handler_entry = qemu_add_vm_change_state_handler( in vnc_display_init()
3487 if (vd->listener) { in vnc_display_close()
3488 qio_net_listener_disconnect(vd->listener); in vnc_display_close()
3489 object_unref(OBJECT(vd->listener)); in vnc_display_close()
3491 vd->listener = NULL; in vnc_display_close()
3493 if (vd->wslistener) { in vnc_display_close()
3494 qio_net_listener_disconnect(vd->wslistener); in vnc_display_close()
3495 object_unref(OBJECT(vd->wslistener)); in vnc_display_close()
3497 vd->wslistener = NULL; in vnc_display_close()
3499 vd->auth = VNC_AUTH_INVALID; in vnc_display_close()
3500 vd->subauth = VNC_AUTH_INVALID; in vnc_display_close()
3501 if (vd->tlscreds) { in vnc_display_close()
3502 object_unref(OBJECT(vd->tlscreds)); in vnc_display_close()
3503 vd->tlscreds = NULL; in vnc_display_close()
3505 if (vd->tlsauthz) { in vnc_display_close()
3506 object_unparent(OBJECT(vd->tlsauthz)); in vnc_display_close()
3507 vd->tlsauthz = NULL; in vnc_display_close()
3509 g_free(vd->tlsauthzid); in vnc_display_close()
3510 vd->tlsauthzid = NULL; in vnc_display_close()
3511 if (vd->lock_key_sync) { in vnc_display_close()
3512 qemu_remove_led_event_handler(vd->led); in vnc_display_close()
3513 vd->led = NULL; in vnc_display_close()
3516 if (vd->sasl.authz) { in vnc_display_close()
3517 object_unparent(OBJECT(vd->sasl.authz)); in vnc_display_close()
3518 vd->sasl.authz = NULL; in vnc_display_close()
3520 g_free(vd->sasl.authzid); in vnc_display_close()
3521 vd->sasl.authzid = NULL; in vnc_display_close()
3530 return -EINVAL; in vnc_display_password()
3532 if (vd->auth == VNC_AUTH_NONE) { in vnc_display_password()
3534 "password auth using '-vnc ${dpy},password'.\n"); in vnc_display_password()
3535 return -EINVAL; in vnc_display_password()
3538 g_free(vd->password); in vnc_display_password()
3539 vd->password = g_strdup(password); in vnc_display_password()
3549 return -EINVAL; in vnc_display_pw_expire()
3552 vd->expires = expires; in vnc_display_pw_expire()
3560 if (!vd->listener || !vd->listener->nsioc) { in vnc_display_print_local_addr()
3564 addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], NULL); in vnc_display_print_local_addr()
3569 if (addr->type != SOCKET_ADDRESS_TYPE_INET) { in vnc_display_print_local_addr()
3574 addr->u.inet.host, in vnc_display_print_local_addr()
3575 addr->u.inet.port); in vnc_display_print_local_addr()
3591 .name = "tls-creds",
3618 .name = "password-secret",
3624 .name = "lock-key-sync",
3627 .name = "key-delay-ms",
3633 .name = "tls-authz",
3636 .name = "sasl-authz",
3642 .name = "non-adaptive",
3648 .name = "power-control",
3697 * sub-auth types. in vnc_display_setup_auth()
3705 * meaning combinations 4->6 and 7->9 will be mapped to in vnc_display_setup_auth()
3706 * VNC auth schemes in the same way as combos 1->3. in vnc_display_setup_auth()
3734 return -1; in vnc_display_setup_auth()
3780 int ret = -1; in vnc_display_get_address()
3786 addr->type = SOCKET_ADDRESS_TYPE_UNIX; in vnc_display_get_address()
3787 addr->u.q_unix.path = g_strdup(addrstr + 5); in vnc_display_get_address()
3810 hostlen = port - addrstr; in vnc_display_get_address()
3818 addr->type = SOCKET_ADDRESS_TYPE_INET; in vnc_display_get_address()
3819 inet = &addr->u.inet; in vnc_display_get_address()
3820 if (hostlen && addrstr[0] == '[' && addrstr[hostlen - 1] == ']') { in vnc_display_get_address()
3821 inet->host = g_strndup(addrstr + 1, hostlen - 2); in vnc_display_get_address()
3823 inet->host = g_strndup(addrstr, hostlen); in vnc_display_get_address()
3830 if (displaynum == -1) { in vnc_display_get_address()
3834 inet->port = g_strdup_printf( in vnc_display_get_address()
3837 inet->has_to = true; in vnc_display_get_address()
3838 inet->to = to + 5700; in vnc_display_get_address()
3841 inet->port = g_strdup(port); in vnc_display_get_address()
3854 inet->port = g_strdup_printf( in vnc_display_get_address()
3858 inet->has_to = true; in vnc_display_get_address()
3859 inet->to = to + offset; in vnc_display_get_address()
3863 inet->ipv4 = ipv4; in vnc_display_get_address()
3864 inet->has_ipv4 = has_ipv4; in vnc_display_get_address()
3865 inet->ipv6 = ipv6; in vnc_display_get_address()
3866 inet->has_ipv6 = has_ipv6; in vnc_display_get_address()
3900 int displaynum = -1; in vnc_display_get_addresses()
3910 return -1; in vnc_display_get_addresses()
3921 return -1; in vnc_display_get_addresses()
3923 /* Historical compat - first listen address can be used in vnc_display_get_addresses()
3926 if (displaynum == -1) { in vnc_display_get_addresses()
3932 if (saddr_list && !saddr_list->next) { in vnc_display_get_addresses()
3933 single_saddr = saddr_list->value; in vnc_display_get_addresses()
3939 displaynum = -1; in vnc_display_get_addresses()
3948 return -1; in vnc_display_get_addresses()
3951 /* Historical compat - if only a single listen address was in vnc_display_get_addresses()
3956 single_saddr->type == SOCKET_ADDRESS_TYPE_INET && in vnc_display_get_addresses()
3957 wsaddr->type == SOCKET_ADDRESS_TYPE_INET && in vnc_display_get_addresses()
3958 g_str_equal(wsaddr->u.inet.host, "") && in vnc_display_get_addresses()
3959 !g_str_equal(single_saddr->u.inet.host, "")) { in vnc_display_get_addresses()
3960 g_free(wsaddr->u.inet.host); in vnc_display_get_addresses()
3961 wsaddr->u.inet.host = g_strdup(single_saddr->u.inet.host); in vnc_display_get_addresses()
3981 return -1; in vnc_display_connect()
3983 if (!saddr_list || saddr_list->next) { in vnc_display_connect()
3985 return -1; in vnc_display_connect()
3988 qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse"); in vnc_display_connect()
3989 if (qio_channel_socket_connect_sync(sioc, saddr_list->value, errp) < 0) { in vnc_display_connect()
3991 return -1; in vnc_display_connect()
4007 vd->listener = qio_net_listener_new(); in vnc_display_listen()
4008 qio_net_listener_set_name(vd->listener, "vnc-listen"); in vnc_display_listen()
4009 for (el = saddr_list; el; el = el->next) { in vnc_display_listen()
4010 if (qio_net_listener_open_sync(vd->listener, in vnc_display_listen()
4011 el->value, 1, in vnc_display_listen()
4013 return -1; in vnc_display_listen()
4017 qio_net_listener_set_client_func(vd->listener, in vnc_display_listen()
4022 vd->wslistener = qio_net_listener_new(); in vnc_display_listen()
4023 qio_net_listener_set_name(vd->wslistener, "vnc-ws-listen"); in vnc_display_listen()
4024 for (el = wsaddr_list; el; el = el->next) { in vnc_display_listen()
4025 if (qio_net_listener_open_sync(vd->wslistener, in vnc_display_listen()
4026 el->value, 1, in vnc_display_listen()
4028 return -1; in vnc_display_listen()
4032 qio_net_listener_set_client_func(vd->wslistener, in vnc_display_listen()
4048 if (arg->has_addresses) { in vnc_display_update()
4049 if (vd->listener) { in vnc_display_update()
4050 qio_net_listener_disconnect(vd->listener); in vnc_display_update()
4051 object_unref(OBJECT(vd->listener)); in vnc_display_update()
4052 vd->listener = NULL; in vnc_display_update()
4055 if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) { in vnc_display_update()
4099 passwordSecret = qemu_opt_get(opts, "password-secret"); in vnc_display_open()
4103 "'password' flag is redundant with 'password-secret'"); in vnc_display_open()
4106 vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret, in vnc_display_open()
4108 if (!vd->password) { in vnc_display_open()
4124 lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true); in vnc_display_open()
4125 key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 10); in vnc_display_open()
4129 error_setg(errp, "VNC SASL auth requires cyrus-sasl support"); in vnc_display_open()
4133 credid = qemu_opt_get(opts, "tls-creds"); in vnc_display_open()
4143 vd->tlscreds = (QCryptoTLSCreds *) in vnc_display_open()
4146 if (!vd->tlscreds) { in vnc_display_open()
4151 object_ref(OBJECT(vd->tlscreds)); in vnc_display_open()
4153 if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds, in vnc_display_open()
4159 tlsauthz = qemu_opt_get(opts, "tls-authz"); in vnc_display_open()
4160 if (tlsauthz && !vd->tlscreds) { in vnc_display_open()
4161 error_setg(errp, "'tls-authz' provided but TLS is not enabled"); in vnc_display_open()
4165 saslauthz = qemu_opt_get(opts, "sasl-authz"); in vnc_display_open()
4167 error_setg(errp, "'sasl-authz' provided but SASL auth is not enabled"); in vnc_display_open()
4174 vd->share_policy = VNC_SHARE_POLICY_IGNORE; in vnc_display_open()
4175 } else if (strcmp(share, "allow-exclusive") == 0) { in vnc_display_open()
4176 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_open()
4177 } else if (strcmp(share, "force-shared") == 0) { in vnc_display_open()
4178 vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED; in vnc_display_open()
4184 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_open()
4186 vd->connections_limit = qemu_opt_get_number(opts, "connections", 32); in vnc_display_open()
4189 vd->lossy = qemu_opt_get_bool(opts, "lossy", false); in vnc_display_open()
4191 vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false); in vnc_display_open()
4195 if (!vd->lossy) { in vnc_display_open()
4196 vd->non_adaptive = true; in vnc_display_open()
4199 vd->power_control = qemu_opt_get_bool(opts, "power-control", false); in vnc_display_open()
4202 vd->tlsauthzid = g_strdup(tlsauthz); in vnc_display_open()
4207 vd->sasl.authzid = g_strdup(saslauthz); in vnc_display_open()
4212 if (vnc_display_setup_auth(&vd->auth, &vd->subauth, in vnc_display_open()
4213 vd->tlscreds, password, in vnc_display_open()
4217 trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth); in vnc_display_open()
4219 if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth, in vnc_display_open()
4220 vd->tlscreds, password, in vnc_display_open()
4224 trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth); in vnc_display_open()
4231 vd->lock_key_sync = lock_key_sync; in vnc_display_open()
4233 vd->led = qemu_add_led_event_handler(kbd_leds, vd); in vnc_display_open()
4235 vd->ledstate = 0; in vnc_display_open()
4239 vd->audio_state = audio_state_by_name(audiodev, errp); in vnc_display_open()
4240 if (!vd->audio_state) { in vnc_display_open()
4244 vd->audio_state = audio_get_default_audio_state(NULL); in vnc_display_open()
4261 if (con != vd->dcl.con) { in vnc_display_open()
4262 qkbd_state_free(vd->kbd); in vnc_display_open()
4263 unregister_displaychangelistener(&vd->dcl); in vnc_display_open()
4264 vd->dcl.con = con; in vnc_display_open()
4265 register_displaychangelistener(&vd->dcl); in vnc_display_open()
4266 vd->kbd = qkbd_state_init(vd->dcl.con); in vnc_display_open()
4268 qkbd_state_set_delay(vd->kbd, key_delay_ms); in vnc_display_open()
4306 qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server"); in vnc_display_add_client()
4337 /* auto-assign id if not present */ in vnc_parse()
4351 return -1; in vnc_init_func()
4356 return -1; in vnc_init_func()