Lines Matching refs:vd
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()
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()
186 static const char *vnc_auth_name(VncDisplay *vd) { in vnc_auth_name() argument
187 switch (vd->auth) { in vnc_auth_name()
205 switch (vd->subauth) { in vnc_auth_name()
233 static VncServerInfo *vnc_server_info_get(VncDisplay *vd) in vnc_server_info_get() argument
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()
296 si = vnc_server_info_get(vs->vd); in vnc_qmp_event()
350 VncDisplay *vd; in vnc_display_find() local
355 QTAILQ_FOREACH(vd, &vnc_displays, next) { in vnc_display_find()
356 if (strcmp(id, vd->id) == 0) { in vnc_display_find()
357 return vd; in vnc_display_find()
363 static VncClientInfoList *qmp_query_client_list(VncDisplay *vd) in qmp_query_client_list() argument
368 QTAILQ_FOREACH(client, &vd->clients, next) { in qmp_query_client_list()
377 VncDisplay *vd = vnc_display_find(NULL); in qmp_query_vnc() local
380 if (vd == NULL || !vd->listener || !vd->listener->nsioc) { 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()
423 info->auth = g_strdup(vnc_auth_name(vd)); in qmp_query_vnc()
547 VncDisplay *vd; in qmp_query_vnc_servers() local
551 QTAILQ_FOREACH(vd, &vnc_displays, next) { in qmp_query_vnc_servers()
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()
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()
562 for (i = 0; vd->listener != NULL && i < vd->listener->nsioc; i++) { in qmp_query_vnc_servers()
564 vd->listener->sioc[i], false, vd->auth, vd->subauth, in qmp_query_vnc_servers()
567 for (i = 0; vd->wslistener != NULL && i < vd->wslistener->nsioc; i++) { 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()
580 VncDisplay *vd = vnc_display_find(id); in vnc_display_reload_certs() local
583 if (!vd) { in vnc_display_reload_certs()
588 if (!vd->tlscreds) { in vnc_display_reload_certs()
593 creds = QCRYPTO_TLS_CREDS_GET_CLASS(OBJECT(vd->tlscreds)); 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()
621 static int vnc_refresh_server_surface(VncDisplay *vd);
623 static int vnc_width(VncDisplay *vd) in vnc_width() argument
625 return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds), in vnc_width()
629 static int vnc_true_width(VncDisplay *vd) in vnc_true_width() argument
631 return MIN(VNC_MAX_WIDTH, surface_width(vd->ds)); in vnc_true_width()
634 static int vnc_height(VncDisplay *vd) in vnc_height() argument
636 return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds)); in vnc_height()
641 VncDisplay *vd,
644 int width = vnc_width(vd);
645 int height = vnc_height(vd);
666 VncDisplay *vd = container_of(dcl, VncDisplay, dcl); in vnc_dpy_update() local
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()
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()
747 static void vnc_abort_display_jobs(VncDisplay *vd) in vnc_abort_display_jobs() argument
751 QTAILQ_FOREACH(vs, &vd->clients, next) { 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()
772 int vnc_server_fb_stride(VncDisplay *vd) in vnc_server_fb_stride() argument
774 return pixman_image_get_stride(vd->server); in vnc_server_fb_stride()
777 void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y) in vnc_server_fb_ptr() argument
781 ptr = (uint8_t *)pixman_image_get_data(vd->server); in vnc_server_fb_ptr()
782 ptr += y * vnc_server_fb_stride(vd); in vnc_server_fb_ptr()
787 static void vnc_update_server_surface(VncDisplay *vd) in vnc_update_server_surface() argument
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()
798 width = vnc_width(vd); in vnc_update_server_surface()
799 height = vnc_height(vd); 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()
824 VncDisplay *vd = container_of(dcl, VncDisplay, dcl); in vnc_dpy_switch() local
825 bool pageflip = vnc_check_pageflip(vd->ds, surface); in vnc_dpy_switch()
828 vnc_abort_display_jobs(vd); 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()
838 trace_vnc_server_dpy_pageflip(vd, in vnc_dpy_switch()
842 vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0, in vnc_dpy_switch()
848 trace_vnc_server_dpy_recreate(vd, in vnc_dpy_switch()
853 vnc_update_server_surface(vd); in vnc_dpy_switch()
855 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_dpy_switch()
860 vnc_set_area_dirty(vs->dirty, vd, 0, 0, in vnc_dpy_switch()
861 vnc_width(vd), in vnc_dpy_switch()
862 vnc_height(vd)); in vnc_dpy_switch()
939 VncDisplay *vd = vs->vd; in vnc_raw_send_framebuffer_update() local
941 row = vnc_server_fb_ptr(vd, x, y); in vnc_raw_send_framebuffer_update()
944 row += vnc_server_fb_stride(vd); in vnc_raw_send_framebuffer_update()
989 QEMUCursor *c = qemu_console_get_cursor(vs->vd->dcl.con); in vnc_cursor_define()
1017 vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize); in vnc_cursor_define()
1027 VncDisplay *vd = container_of(dcl, VncDisplay, dcl); in vnc_dpy_cursor_define() local
1030 g_free(vd->cursor_mask); in vnc_dpy_cursor_define()
1031 vd->cursor_msize = cursor_get_mono_bpl(c) * c->height; in vnc_dpy_cursor_define()
1032 vd->cursor_mask = g_malloc0(vd->cursor_msize); in vnc_dpy_cursor_define()
1033 cursor_get_mono_mask(c, 0, vd->cursor_mask); in vnc_dpy_cursor_define()
1035 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_dpy_cursor_define()
1144 VncDisplay *vd = vs->vd; in vnc_update_client() local
1172 height = pixman_image_get_height(vd->server); in vnc_update_client()
1173 width = pixman_image_get_width(vd->server); in vnc_update_client()
1278 vs->audio_cap = AUD_add_capture(vs->vd->audio_state, &vs->as, &ops, vs); in audio_add()
1331 qkbd_state_lift_all_keys(vs->vd->kbd); in vnc_disconnect_finish()
1336 QTAILQ_REMOVE(&vs->vd->clients, vs, next); in vnc_disconnect_finish()
1337 if (QTAILQ_EMPTY(&vs->vd->clients)) { in vnc_disconnect_finish()
1339 vnc_update_server_surface(vs->vd); in vnc_disconnect_finish()
1772 int absolute = qemu_input_is_absolute(vs->vd->dcl.con); in check_pointer_type_change()
1780 pixman_image_get_width(vs->vd->server), in check_pointer_type_change()
1781 pixman_image_get_height(vs->vd->server), in check_pointer_type_change()
1798 QemuConsole *con = vs->vd->dcl.con; in pointer_event()
1799 int width = pixman_image_get_width(vs->vd->server); in pointer_event()
1800 int height = pixman_image_get_height(vs->vd->server); in pointer_event()
1826 qkbd_state_key_event(vs->vd->kbd, qcode, true); in press_key()
1827 qkbd_state_key_event(vs->vd->kbd, qcode, false); in press_key()
1841 vnc_write_u8(vs, vs->vd->ledstate); in vnc_led_state_change()
1848 VncDisplay *vd = opaque; in kbd_leds() local
1855 if (ledstate == vd->ledstate) { in kbd_leds()
1859 vd->ledstate = ledstate; in kbd_leds()
1861 QTAILQ_FOREACH(client, &vd->clients, next) { in kbd_leds()
1874 qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) && in do_key_event()
1875 qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) { in do_key_event()
1878 unregister_displaychangelistener(&vs->vd->dcl); in do_key_event()
1879 qkbd_state_switch_console(vs->vd->kbd, con); in do_key_event()
1880 vs->vd->dcl.con = con; in do_key_event()
1881 register_displaychangelistener(&vs->vd->dcl); in do_key_event()
1892 if (down && vs->vd->lock_key_sync && in do_key_event()
1894 keycode_is_keypad(vs->vd->kbd_layout, keycode)) { in do_key_event()
1899 if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) { in do_key_event()
1900 if (!qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) { in do_key_event()
1905 if (qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) { in do_key_event()
1912 if (down && vs->vd->lock_key_sync && in do_key_event()
1920 bool shift = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_SHIFT); in do_key_event()
1921 bool capslock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CAPSLOCK); in do_key_event()
1935 qkbd_state_key_event(vs->vd->kbd, qcode, down); in do_key_event()
1936 if (QEMU_IS_TEXT_CONSOLE(vs->vd->dcl.con)) { in do_key_event()
1937 QemuTextConsole *con = QEMU_TEXT_CONSOLE(vs->vd->dcl.con); in do_key_event()
1938 bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK); in do_key_event()
1939 bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL); in do_key_event()
2050 if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(vs->vd->dcl.con)) { in key_event()
2054 keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF, in key_event()
2055 vs->vd->kbd, down) & SCANCODE_KEYMASK; in key_event()
2081 vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h); in framebuffer_update_request()
2095 pixman_image_get_width(vs->vd->server), in send_ext_key_event_ack()
2096 pixman_image_get_height(vs->vd->server), in send_ext_key_event_ack()
2109 pixman_image_get_width(vs->vd->server), in send_ext_audio_ack()
2110 pixman_image_get_height(vs->vd->server), in send_ext_audio_ack()
2201 if (vs->vd->audio_state) { in set_encodings()
2213 if (vs->vd->power_control) { in set_encodings()
2226 if (vs->vd->lossy) { in set_encodings()
2324 graphic_hw_invalidate(vs->vd->dcl.con); in set_pixel_format()
2325 graphic_hw_update(vs->vd->dcl.con); in set_pixel_format()
2379 VncDisplay *vd = vs->vd; in protocol_client_msg() local
2382 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in protocol_client_msg()
2603 if (dpy_ui_info_supported(vs->vd->dcl.con)) { in protocol_client_msg()
2608 dpy_set_ui_info(vs->vd->dcl.con, &info, false); in protocol_client_msg()
2634 switch (vs->vd->share_policy) { in protocol_client_init()
2656 QTAILQ_FOREACH(client, &vs->vd->clients, next) { in protocol_client_init()
2668 if (vs->vd->num_exclusive > 0) { in protocol_client_init()
2691 if (vs->vd->num_shared > vs->vd->connections_limit) { in protocol_client_init()
2696 assert(pixman_image_get_width(vs->vd->server) < 65536 && in protocol_client_init()
2697 pixman_image_get_width(vs->vd->server) >= 0); in protocol_client_init()
2698 assert(pixman_image_get_height(vs->vd->server) < 65536 && in protocol_client_init()
2699 pixman_image_get_height(vs->vd->server) >= 0); in protocol_client_init()
2700 vs->client_width = pixman_image_get_width(vs->vd->server); in protocol_client_init()
2701 vs->client_height = pixman_image_get_height(vs->vd->server); in protocol_client_init()
2767 if (!vs->vd->password) { in protocol_client_auth_vnc()
2771 if (vs->vd->expires < now) { in protocol_client_auth_vnc()
2779 pwlen = strlen(vs->vd->password); in protocol_client_auth_vnc()
2781 key[i] = i<pwlen ? vs->vd->password[i] : 0; in protocol_client_auth_vnc()
2949 static VncRectStat *vnc_stat_rect(VncDisplay *vd, int x, int y) in vnc_stat_rect() argument
2951 struct VncSurface *vs = &vd->guest; in vnc_stat_rect()
2972 static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y) in vnc_refresh_lossy_rect() argument
2982 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_refresh_lossy_rect()
3006 static int vnc_update_stats(VncDisplay *vd, struct timeval * tv) in vnc_update_stats() argument
3008 int width = MIN(pixman_image_get_width(vd->guest.fb), in vnc_update_stats()
3009 pixman_image_get_width(vd->server)); in vnc_update_stats()
3010 int height = MIN(pixman_image_get_height(vd->guest.fb), in vnc_update_stats()
3011 pixman_image_get_height(vd->server)); in vnc_update_stats()
3018 VncRectStat *rect = vnc_stat_rect(vd, x, y); in vnc_update_stats()
3026 if (timercmp(&vd->guest.last_freq_check, &res, >)) { in vnc_update_stats()
3029 vd->guest.last_freq_check = *tv; in vnc_update_stats()
3033 VncRectStat *rect= vnc_stat_rect(vd, x, y); in vnc_update_stats()
3046 has_dirty += vnc_refresh_lossy_rect(vd, x, y); in vnc_update_stats()
3074 total += vnc_stat_rect(vs->vd, i, j)->freq; in vnc_update_freq()
3086 static void vnc_rect_updated(VncDisplay *vd, int x, int y, struct timeval * tv) in vnc_rect_updated() argument
3090 rect = vnc_stat_rect(vd, x, y); in vnc_rect_updated()
3099 static int vnc_refresh_server_surface(VncDisplay *vd) in vnc_refresh_server_surface() argument
3101 int width = MIN(pixman_image_get_width(vd->guest.fb), in vnc_refresh_server_surface()
3102 pixman_image_get_width(vd->server)); in vnc_refresh_server_surface()
3103 int height = MIN(pixman_image_get_height(vd->guest.fb), in vnc_refresh_server_surface()
3104 pixman_image_get_height(vd->server)); in vnc_refresh_server_surface()
3116 if (!vd->non_adaptive) { in vnc_refresh_server_surface()
3118 has_dirty = vnc_update_stats(vd, &tv); in vnc_refresh_server_surface()
3121 offset = find_next_bit((unsigned long *) &vd->guest.dirty, in vnc_refresh_server_surface()
3122 height * VNC_DIRTY_BPL(&vd->guest), 0); in vnc_refresh_server_surface()
3123 if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { in vnc_refresh_server_surface()
3133 server_row0 = (uint8_t *)pixman_image_get_data(vd->server); in vnc_refresh_server_surface()
3135 pixman_image_get_stride(vd->server); in vnc_refresh_server_surface()
3138 if (vd->guest.format != VNC_SERVER_FB_FORMAT) { in vnc_refresh_server_surface()
3139 int w = pixman_image_get_width(vd->server); in vnc_refresh_server_surface()
3143 PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb)); in vnc_refresh_server_surface()
3144 guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb); in vnc_refresh_server_surface()
3145 guest_stride = pixman_image_get_stride(vd->guest.fb); in vnc_refresh_server_surface()
3146 guest_ll = pixman_image_get_width(vd->guest.fb) in vnc_refresh_server_surface()
3152 y = offset / VNC_DIRTY_BPL(&vd->guest); in vnc_refresh_server_surface()
3153 x = offset % VNC_DIRTY_BPL(&vd->guest); in vnc_refresh_server_surface()
3157 if (vd->guest.format != VNC_SERVER_FB_FORMAT) { in vnc_refresh_server_surface()
3158 qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y); in vnc_refresh_server_surface()
3168 if (!test_and_clear_bit(x, vd->guest.dirty[y])) { in vnc_refresh_server_surface()
3179 if (!vd->non_adaptive) { in vnc_refresh_server_surface()
3180 vnc_rect_updated(vd, x * VNC_DIRTY_PIXELS_PER_BIT, in vnc_refresh_server_surface()
3183 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_refresh_server_surface()
3190 offset = find_next_bit((unsigned long *) &vd->guest.dirty, in vnc_refresh_server_surface()
3191 height * VNC_DIRTY_BPL(&vd->guest), in vnc_refresh_server_surface()
3192 y * VNC_DIRTY_BPL(&vd->guest)); in vnc_refresh_server_surface()
3193 if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { in vnc_refresh_server_surface()
3204 VncDisplay *vd = container_of(dcl, VncDisplay, dcl); in vnc_refresh() local
3208 if (QTAILQ_EMPTY(&vd->clients)) { in vnc_refresh()
3209 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX); in vnc_refresh()
3213 graphic_hw_update(vd->dcl.con); in vnc_refresh()
3215 if (vnc_trylock_display(vd)) { in vnc_refresh()
3216 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in vnc_refresh()
3220 has_dirty = vnc_refresh_server_surface(vd); in vnc_refresh()
3221 vnc_unlock_display(vd); in vnc_refresh()
3223 QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) { in vnc_refresh()
3229 vd->dcl.update_interval /= 2; in vnc_refresh()
3230 if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) { in vnc_refresh()
3231 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE; in vnc_refresh()
3234 vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC; in vnc_refresh()
3235 if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) { in vnc_refresh()
3236 vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX; in vnc_refresh()
3241 static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc, in vnc_connect() argument
3245 bool first_client = QTAILQ_EMPTY(&vd->clients); in vnc_connect()
3256 vs->vd = vd; in vnc_connect()
3281 vs->auth = vd->ws_auth; in vnc_connect()
3284 vs->auth = vd->auth; in vnc_connect()
3285 vs->subauth = vd->subauth; in vnc_connect()
3297 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE); in vnc_connect()
3304 if (vd->tlscreds) { in vnc_connect()
3334 QTAILQ_INSERT_TAIL(&vd->clients, vs, next); in vnc_connect()
3336 vnc_update_server_surface(vd); in vnc_connect()
3339 graphic_hw_update(vd->dcl.con); in vnc_connect()
3345 if (vd->num_connecting > vd->connections_limit) { in vnc_connect()
3346 QTAILQ_FOREACH(vs, &vd->clients, next) { in vnc_connect()
3369 VncDisplay *vd = opaque; in vnc_listen_io() local
3370 bool isWebsock = listener == vd->wslistener; in vnc_listen_io()
3375 vnc_connect(vd, cioc, false, isWebsock); in vnc_listen_io()
3390 VncDisplay *vd; in vnc_display_init() local
3395 vd = g_malloc0(sizeof(*vd)); in vnc_display_init()
3397 vd->id = strdup(id); in vnc_display_init()
3398 QTAILQ_INSERT_TAIL(&vnc_displays, vd, next); in vnc_display_init()
3400 QTAILQ_INIT(&vd->clients); in vnc_display_init()
3401 vd->expires = TIME_MAX; in vnc_display_init()
3405 vd->kbd_layout = init_keyboard_layout(name2keysym, in vnc_display_init()
3408 vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us", errp); in vnc_display_init()
3411 if (!vd->kbd_layout) { in vnc_display_init()
3415 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_init()
3416 vd->connections_limit = 32; in vnc_display_init()
3418 qemu_mutex_init(&vd->mutex); in vnc_display_init()
3421 vd->dcl.ops = &dcl_ops; in vnc_display_init()
3422 register_displaychangelistener(&vd->dcl); in vnc_display_init()
3423 vd->kbd = qkbd_state_init(vd->dcl.con); in vnc_display_init()
3427 static void vnc_display_close(VncDisplay *vd) in vnc_display_close() argument
3429 if (!vd) { in vnc_display_close()
3433 if (vd->listener) { in vnc_display_close()
3434 qio_net_listener_disconnect(vd->listener); in vnc_display_close()
3435 object_unref(OBJECT(vd->listener)); in vnc_display_close()
3437 vd->listener = NULL; in vnc_display_close()
3439 if (vd->wslistener) { in vnc_display_close()
3440 qio_net_listener_disconnect(vd->wslistener); in vnc_display_close()
3441 object_unref(OBJECT(vd->wslistener)); in vnc_display_close()
3443 vd->wslistener = NULL; in vnc_display_close()
3445 vd->auth = VNC_AUTH_INVALID; in vnc_display_close()
3446 vd->subauth = VNC_AUTH_INVALID; in vnc_display_close()
3447 if (vd->tlscreds) { in vnc_display_close()
3448 object_unref(OBJECT(vd->tlscreds)); in vnc_display_close()
3449 vd->tlscreds = NULL; in vnc_display_close()
3451 if (vd->tlsauthz) { in vnc_display_close()
3452 object_unparent(OBJECT(vd->tlsauthz)); in vnc_display_close()
3453 vd->tlsauthz = NULL; in vnc_display_close()
3455 g_free(vd->tlsauthzid); in vnc_display_close()
3456 vd->tlsauthzid = NULL; in vnc_display_close()
3457 if (vd->lock_key_sync) { in vnc_display_close()
3458 qemu_remove_led_event_handler(vd->led); in vnc_display_close()
3459 vd->led = NULL; in vnc_display_close()
3462 if (vd->sasl.authz) { in vnc_display_close()
3463 object_unparent(OBJECT(vd->sasl.authz)); in vnc_display_close()
3464 vd->sasl.authz = NULL; in vnc_display_close()
3466 g_free(vd->sasl.authzid); in vnc_display_close()
3467 vd->sasl.authzid = NULL; in vnc_display_close()
3473 VncDisplay *vd = vnc_display_find(id); in vnc_display_password() local
3475 if (!vd) { in vnc_display_password()
3478 if (vd->auth == VNC_AUTH_NONE) { in vnc_display_password()
3484 g_free(vd->password); in vnc_display_password()
3485 vd->password = g_strdup(password); in vnc_display_password()
3492 VncDisplay *vd = vnc_display_find(id); in vnc_display_pw_expire() local
3494 if (!vd) { in vnc_display_pw_expire()
3498 vd->expires = expires; in vnc_display_pw_expire()
3502 static void vnc_display_print_local_addr(VncDisplay *vd) in vnc_display_print_local_addr() argument
3506 if (!vd->listener || !vd->listener->nsioc) { in vnc_display_print_local_addr()
3510 addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], NULL); in vnc_display_print_local_addr()
3918 static int vnc_display_connect(VncDisplay *vd, in vnc_display_connect() argument
3939 vnc_connect(vd, sioc, false, false); in vnc_display_connect()
3945 static int vnc_display_listen(VncDisplay *vd, in vnc_display_listen() argument
3953 vd->listener = qio_net_listener_new(); in vnc_display_listen()
3954 qio_net_listener_set_name(vd->listener, "vnc-listen"); in vnc_display_listen()
3956 if (qio_net_listener_open_sync(vd->listener, in vnc_display_listen()
3963 qio_net_listener_set_client_func(vd->listener, in vnc_display_listen()
3964 vnc_listen_io, vd, NULL); in vnc_display_listen()
3968 vd->wslistener = qio_net_listener_new(); in vnc_display_listen()
3969 qio_net_listener_set_name(vd->wslistener, "vnc-ws-listen"); in vnc_display_listen()
3971 if (qio_net_listener_open_sync(vd->wslistener, in vnc_display_listen()
3978 qio_net_listener_set_client_func(vd->wslistener, in vnc_display_listen()
3979 vnc_listen_io, vd, NULL); in vnc_display_listen()
3987 VncDisplay *vd = vnc_display_find(NULL); in vnc_display_update() local
3989 if (!vd) { in vnc_display_update()
3995 if (vd->listener) { in vnc_display_update()
3996 qio_net_listener_disconnect(vd->listener); in vnc_display_update()
3997 object_unref(OBJECT(vd->listener)); in vnc_display_update()
3998 vd->listener = NULL; in vnc_display_update()
4001 if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) { in vnc_display_update()
4011 VncDisplay *vd = vnc_display_find(id); in vnc_display_open() local
4028 if (!vd) { in vnc_display_open()
4032 vnc_display_close(vd); in vnc_display_open()
4052 vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret, in vnc_display_open()
4054 if (!vd->password) { in vnc_display_open()
4089 vd->tlscreds = (QCryptoTLSCreds *) in vnc_display_open()
4092 if (!vd->tlscreds) { in vnc_display_open()
4097 object_ref(OBJECT(vd->tlscreds)); in vnc_display_open()
4099 if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds, in vnc_display_open()
4106 if (tlsauthz && !vd->tlscreds) { in vnc_display_open()
4120 vd->share_policy = VNC_SHARE_POLICY_IGNORE; in vnc_display_open()
4122 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_open()
4124 vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED; in vnc_display_open()
4130 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE; in vnc_display_open()
4132 vd->connections_limit = qemu_opt_get_number(opts, "connections", 32); in vnc_display_open()
4135 vd->lossy = qemu_opt_get_bool(opts, "lossy", false); in vnc_display_open()
4137 vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false); in vnc_display_open()
4141 if (!vd->lossy) { in vnc_display_open()
4142 vd->non_adaptive = true; in vnc_display_open()
4145 vd->power_control = qemu_opt_get_bool(opts, "power-control", false); in vnc_display_open()
4148 vd->tlsauthzid = g_strdup(tlsauthz); in vnc_display_open()
4153 vd->sasl.authzid = g_strdup(saslauthz); in vnc_display_open()
4158 if (vnc_display_setup_auth(&vd->auth, &vd->subauth, in vnc_display_open()
4159 vd->tlscreds, password, in vnc_display_open()
4163 trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth); in vnc_display_open()
4165 if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth, in vnc_display_open()
4166 vd->tlscreds, password, in vnc_display_open()
4170 trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth); in vnc_display_open()
4177 vd->lock_key_sync = lock_key_sync; in vnc_display_open()
4179 vd->led = qemu_add_led_event_handler(kbd_leds, vd); in vnc_display_open()
4181 vd->ledstate = 0; in vnc_display_open()
4185 vd->audio_state = audio_state_by_name(audiodev, errp); in vnc_display_open()
4186 if (!vd->audio_state) { in vnc_display_open()
4190 vd->audio_state = audio_get_default_audio_state(NULL); in vnc_display_open()
4207 if (con != vd->dcl.con) { in vnc_display_open()
4208 qkbd_state_free(vd->kbd); in vnc_display_open()
4209 unregister_displaychangelistener(&vd->dcl); in vnc_display_open()
4210 vd->dcl.con = con; in vnc_display_open()
4211 register_displaychangelistener(&vd->dcl); in vnc_display_open()
4212 vd->kbd = qkbd_state_init(vd->dcl.con); in vnc_display_open()
4214 qkbd_state_set_delay(vd->kbd, key_delay_ms); in vnc_display_open()
4221 if (vnc_display_connect(vd, saddr_list, wsaddr_list, errp) < 0) { in vnc_display_open()
4225 if (vnc_display_listen(vd, saddr_list, wsaddr_list, errp) < 0) { in vnc_display_open()
4231 vnc_display_print_local_addr(vd); in vnc_display_open()
4238 vnc_display_close(vd); in vnc_display_open()
4243 VncDisplay *vd = vnc_display_find(id); in vnc_display_add_client() local
4246 if (!vd) { in vnc_display_add_client()
4253 vnc_connect(vd, sioc, skipauth, false); in vnc_display_add_client()