2 * QEMU VNC display driver
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30 #include "sysemu/sysemu.h"
31 #include "qemu/sockets.h"
32 #include "qemu/timer.h"
34 #include "qapi/qmp/types.h"
35 #include "qmp-commands.h"
36 #include "qemu/osdep.h"
39 #define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
40 #define VNC_REFRESH_INTERVAL_INC 50
41 #define VNC_REFRESH_INTERVAL_MAX GUI_REFRESH_INTERVAL_IDLE
42 static const struct timeval VNC_REFRESH_STATS
= { 0, 500000 };
43 static const struct timeval VNC_REFRESH_LOSSY
= { 2, 0 };
45 #include "vnc_keysym.h"
48 static VncDisplay
*vnc_display
; /* needed for info vnc */
50 static int vnc_cursor_define(VncState
*vs
);
51 static void vnc_release_modifiers(VncState
*vs
);
53 static void vnc_set_share_mode(VncState
*vs
, VncShareMode mode
)
56 static const char *mn
[] = {
58 [VNC_SHARE_MODE_CONNECTING
] = "connecting",
59 [VNC_SHARE_MODE_SHARED
] = "shared",
60 [VNC_SHARE_MODE_EXCLUSIVE
] = "exclusive",
61 [VNC_SHARE_MODE_DISCONNECTED
] = "disconnected",
63 fprintf(stderr
, "%s/%d: %s -> %s\n", __func__
,
64 vs
->csock
, mn
[vs
->share_mode
], mn
[mode
]);
67 if (vs
->share_mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
68 vs
->vd
->num_exclusive
--;
70 vs
->share_mode
= mode
;
71 if (vs
->share_mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
72 vs
->vd
->num_exclusive
++;
76 static char *addr_to_string(const char *format
,
77 struct sockaddr_storage
*sa
,
80 char host
[NI_MAXHOST
];
81 char serv
[NI_MAXSERV
];
85 if ((err
= getnameinfo((struct sockaddr
*)sa
, salen
,
88 NI_NUMERICHOST
| NI_NUMERICSERV
)) != 0) {
89 VNC_DEBUG("Cannot resolve address %d: %s\n",
90 err
, gai_strerror(err
));
94 /* Enough for the existing format + the 2 vars we're
96 addrlen
= strlen(format
) + strlen(host
) + strlen(serv
);
97 addr
= g_malloc(addrlen
+ 1);
98 snprintf(addr
, addrlen
, format
, host
, serv
);
105 char *vnc_socket_local_addr(const char *format
, int fd
) {
106 struct sockaddr_storage sa
;
110 if (getsockname(fd
, (struct sockaddr
*)&sa
, &salen
) < 0)
113 return addr_to_string(format
, &sa
, salen
);
116 char *vnc_socket_remote_addr(const char *format
, int fd
) {
117 struct sockaddr_storage sa
;
121 if (getpeername(fd
, (struct sockaddr
*)&sa
, &salen
) < 0)
124 return addr_to_string(format
, &sa
, salen
);
127 static int put_addr_qdict(QDict
*qdict
, struct sockaddr_storage
*sa
,
130 char host
[NI_MAXHOST
];
131 char serv
[NI_MAXSERV
];
134 if ((err
= getnameinfo((struct sockaddr
*)sa
, salen
,
137 NI_NUMERICHOST
| NI_NUMERICSERV
)) != 0) {
138 VNC_DEBUG("Cannot resolve address %d: %s\n",
139 err
, gai_strerror(err
));
143 qdict_put(qdict
, "host", qstring_from_str(host
));
144 qdict_put(qdict
, "service", qstring_from_str(serv
));
145 qdict_put(qdict
, "family",qstring_from_str(inet_strfamily(sa
->ss_family
)));
150 static int vnc_server_addr_put(QDict
*qdict
, int fd
)
152 struct sockaddr_storage sa
;
156 if (getsockname(fd
, (struct sockaddr
*)&sa
, &salen
) < 0) {
160 return put_addr_qdict(qdict
, &sa
, salen
);
163 static int vnc_qdict_remote_addr(QDict
*qdict
, int fd
)
165 struct sockaddr_storage sa
;
169 if (getpeername(fd
, (struct sockaddr
*)&sa
, &salen
) < 0) {
173 return put_addr_qdict(qdict
, &sa
, salen
);
176 static const char *vnc_auth_name(VncDisplay
*vd
) {
178 case VNC_AUTH_INVALID
:
194 case VNC_AUTH_VENCRYPT
:
195 #ifdef CONFIG_VNC_TLS
196 switch (vd
->subauth
) {
197 case VNC_AUTH_VENCRYPT_PLAIN
:
198 return "vencrypt+plain";
199 case VNC_AUTH_VENCRYPT_TLSNONE
:
200 return "vencrypt+tls+none";
201 case VNC_AUTH_VENCRYPT_TLSVNC
:
202 return "vencrypt+tls+vnc";
203 case VNC_AUTH_VENCRYPT_TLSPLAIN
:
204 return "vencrypt+tls+plain";
205 case VNC_AUTH_VENCRYPT_X509NONE
:
206 return "vencrypt+x509+none";
207 case VNC_AUTH_VENCRYPT_X509VNC
:
208 return "vencrypt+x509+vnc";
209 case VNC_AUTH_VENCRYPT_X509PLAIN
:
210 return "vencrypt+x509+plain";
211 case VNC_AUTH_VENCRYPT_TLSSASL
:
212 return "vencrypt+tls+sasl";
213 case VNC_AUTH_VENCRYPT_X509SASL
:
214 return "vencrypt+x509+sasl";
227 static int vnc_server_info_put(QDict
*qdict
)
229 if (vnc_server_addr_put(qdict
, vnc_display
->lsock
) < 0) {
233 qdict_put(qdict
, "auth", qstring_from_str(vnc_auth_name(vnc_display
)));
237 static void vnc_client_cache_auth(VncState
*client
)
239 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
247 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
248 qdict
= qobject_to_qdict(client
->info
);
251 #ifdef CONFIG_VNC_TLS
252 if (client
->tls
.session
&&
254 qdict_put(qdict
, "x509_dname", qstring_from_str(client
->tls
.dname
));
257 #ifdef CONFIG_VNC_SASL
258 if (client
->sasl
.conn
&&
259 client
->sasl
.username
) {
260 qdict_put(qdict
, "sasl_username",
261 qstring_from_str(client
->sasl
.username
));
266 static void vnc_client_cache_addr(VncState
*client
)
271 if (vnc_qdict_remote_addr(qdict
, client
->csock
) < 0) {
273 /* XXX: how to report the error? */
277 client
->info
= QOBJECT(qdict
);
280 static void vnc_qmp_event(VncState
*vs
, MonitorEvent event
)
289 server
= qdict_new();
290 if (vnc_server_info_put(server
) < 0) {
295 data
= qobject_from_jsonf("{ 'client': %p, 'server': %p }",
296 vs
->info
, QOBJECT(server
));
298 monitor_protocol_event(event
, data
);
300 qobject_incref(vs
->info
);
301 qobject_decref(data
);
304 static VncClientInfo
*qmp_query_vnc_client(const VncState
*client
)
306 struct sockaddr_storage sa
;
307 socklen_t salen
= sizeof(sa
);
308 char host
[NI_MAXHOST
];
309 char serv
[NI_MAXSERV
];
312 if (getpeername(client
->csock
, (struct sockaddr
*)&sa
, &salen
) < 0) {
316 if (getnameinfo((struct sockaddr
*)&sa
, salen
,
319 NI_NUMERICHOST
| NI_NUMERICSERV
) < 0) {
323 info
= g_malloc0(sizeof(*info
));
324 info
->host
= g_strdup(host
);
325 info
->service
= g_strdup(serv
);
326 info
->family
= g_strdup(inet_strfamily(sa
.ss_family
));
328 #ifdef CONFIG_VNC_TLS
329 if (client
->tls
.session
&& client
->tls
.dname
) {
330 info
->has_x509_dname
= true;
331 info
->x509_dname
= g_strdup(client
->tls
.dname
);
334 #ifdef CONFIG_VNC_SASL
335 if (client
->sasl
.conn
&& client
->sasl
.username
) {
336 info
->has_sasl_username
= true;
337 info
->sasl_username
= g_strdup(client
->sasl
.username
);
344 VncInfo
*qmp_query_vnc(Error
**errp
)
346 VncInfo
*info
= g_malloc0(sizeof(*info
));
348 if (vnc_display
== NULL
|| vnc_display
->display
== NULL
) {
349 info
->enabled
= false;
351 VncClientInfoList
*cur_item
= NULL
;
352 struct sockaddr_storage sa
;
353 socklen_t salen
= sizeof(sa
);
354 char host
[NI_MAXHOST
];
355 char serv
[NI_MAXSERV
];
358 info
->enabled
= true;
360 /* for compatibility with the original command */
361 info
->has_clients
= true;
363 QTAILQ_FOREACH(client
, &vnc_display
->clients
, next
) {
364 VncClientInfoList
*cinfo
= g_malloc0(sizeof(*info
));
365 cinfo
->value
= qmp_query_vnc_client(client
);
367 /* XXX: waiting for the qapi to support GSList */
369 info
->clients
= cur_item
= cinfo
;
371 cur_item
->next
= cinfo
;
376 if (vnc_display
->lsock
== -1) {
380 if (getsockname(vnc_display
->lsock
, (struct sockaddr
*)&sa
,
382 error_set(errp
, QERR_UNDEFINED_ERROR
);
386 if (getnameinfo((struct sockaddr
*)&sa
, salen
,
389 NI_NUMERICHOST
| NI_NUMERICSERV
) < 0) {
390 error_set(errp
, QERR_UNDEFINED_ERROR
);
394 info
->has_host
= true;
395 info
->host
= g_strdup(host
);
397 info
->has_service
= true;
398 info
->service
= g_strdup(serv
);
400 info
->has_family
= true;
401 info
->family
= g_strdup(inet_strfamily(sa
.ss_family
));
403 info
->has_auth
= true;
404 info
->auth
= g_strdup(vnc_auth_name(vnc_display
));
410 qapi_free_VncInfo(info
);
415 1) Get the queue working for IO.
416 2) there is some weirdness when using the -S option (the screen is grey
417 and not totally invalidated
418 3) resolutions > 1024
421 static int vnc_update_client(VncState
*vs
, int has_dirty
, bool sync
);
422 static void vnc_disconnect_start(VncState
*vs
);
424 static void vnc_colordepth(VncState
*vs
);
425 static void framebuffer_update_request(VncState
*vs
, int incremental
,
426 int x_position
, int y_position
,
428 static void vnc_refresh(DisplayChangeListener
*dcl
);
429 static int vnc_refresh_server_surface(VncDisplay
*vd
);
431 static void vnc_dpy_update(DisplayChangeListener
*dcl
,
432 int x
, int y
, int w
, int h
)
434 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
435 struct VncSurface
*s
= &vd
->guest
;
436 int width
= surface_width(vd
->ds
);
437 int height
= surface_height(vd
->ds
);
439 /* this is needed this to ensure we updated all affected
440 * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
441 w
+= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
442 x
-= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
446 w
= MIN(x
+ w
, width
) - x
;
447 h
= MIN(y
+ h
, height
);
450 bitmap_set(s
->dirty
[y
], x
/ VNC_DIRTY_PIXELS_PER_BIT
,
451 DIV_ROUND_UP(w
, VNC_DIRTY_PIXELS_PER_BIT
));
455 void vnc_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
,
458 vnc_write_u16(vs
, x
);
459 vnc_write_u16(vs
, y
);
460 vnc_write_u16(vs
, w
);
461 vnc_write_u16(vs
, h
);
463 vnc_write_s32(vs
, encoding
);
466 void buffer_reserve(Buffer
*buffer
, size_t len
)
468 if ((buffer
->capacity
- buffer
->offset
) < len
) {
469 buffer
->capacity
+= (len
+ 1024);
470 buffer
->buffer
= g_realloc(buffer
->buffer
, buffer
->capacity
);
471 if (buffer
->buffer
== NULL
) {
472 fprintf(stderr
, "vnc: out of memory\n");
478 static int buffer_empty(Buffer
*buffer
)
480 return buffer
->offset
== 0;
483 uint8_t *buffer_end(Buffer
*buffer
)
485 return buffer
->buffer
+ buffer
->offset
;
488 void buffer_reset(Buffer
*buffer
)
493 void buffer_free(Buffer
*buffer
)
495 g_free(buffer
->buffer
);
497 buffer
->capacity
= 0;
498 buffer
->buffer
= NULL
;
501 void buffer_append(Buffer
*buffer
, const void *data
, size_t len
)
503 memcpy(buffer
->buffer
+ buffer
->offset
, data
, len
);
504 buffer
->offset
+= len
;
507 void buffer_advance(Buffer
*buf
, size_t len
)
509 memmove(buf
->buffer
, buf
->buffer
+ len
,
510 (buf
->offset
- len
));
514 static void vnc_desktop_resize(VncState
*vs
)
516 DisplaySurface
*ds
= vs
->vd
->ds
;
518 if (vs
->csock
== -1 || !vnc_has_feature(vs
, VNC_FEATURE_RESIZE
)) {
521 if (vs
->client_width
== surface_width(ds
) &&
522 vs
->client_height
== surface_height(ds
)) {
525 vs
->client_width
= surface_width(ds
);
526 vs
->client_height
= surface_height(ds
);
528 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
530 vnc_write_u16(vs
, 1); /* number of rects */
531 vnc_framebuffer_update(vs
, 0, 0, vs
->client_width
, vs
->client_height
,
532 VNC_ENCODING_DESKTOPRESIZE
);
533 vnc_unlock_output(vs
);
537 static void vnc_abort_display_jobs(VncDisplay
*vd
)
541 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
544 vnc_unlock_output(vs
);
546 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
549 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
552 vnc_unlock_output(vs
);
556 int vnc_server_fb_stride(VncDisplay
*vd
)
558 return pixman_image_get_stride(vd
->server
);
561 void *vnc_server_fb_ptr(VncDisplay
*vd
, int x
, int y
)
565 ptr
= (uint8_t *)pixman_image_get_data(vd
->server
);
566 ptr
+= y
* vnc_server_fb_stride(vd
);
567 ptr
+= x
* VNC_SERVER_FB_BYTES
;
570 /* this sets only the visible pixels of a dirty bitmap */
571 #define VNC_SET_VISIBLE_PIXELS_DIRTY(bitmap, w, h) {\
573 memset(bitmap, 0x00, sizeof(bitmap));\
574 for (y = 0; y < h; y++) {\
575 bitmap_set(bitmap[y], 0,\
576 DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));\
580 static void vnc_dpy_switch(DisplayChangeListener
*dcl
,
581 DisplaySurface
*surface
)
583 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
586 vnc_abort_display_jobs(vd
);
589 qemu_pixman_image_unref(vd
->server
);
591 vd
->server
= pixman_image_create_bits(VNC_SERVER_FB_FORMAT
,
592 surface_width(vd
->ds
),
593 surface_height(vd
->ds
),
598 if (ds_get_bytes_per_pixel(ds
) != vd
->guest
.ds
->pf
.bytes_per_pixel
)
599 console_color_init(ds
);
601 qemu_pixman_image_unref(vd
->guest
.fb
);
602 vd
->guest
.fb
= pixman_image_ref(surface
->image
);
603 vd
->guest
.format
= surface
->format
;
604 VNC_SET_VISIBLE_PIXELS_DIRTY(vd
->guest
.dirty
,
605 surface_width(vd
->ds
),
606 surface_height(vd
->ds
));
608 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
610 vnc_desktop_resize(vs
);
611 if (vs
->vd
->cursor
) {
612 vnc_cursor_define(vs
);
614 VNC_SET_VISIBLE_PIXELS_DIRTY(vs
->dirty
,
615 surface_width(vd
->ds
),
616 surface_height(vd
->ds
));
621 static void vnc_write_pixels_copy(VncState
*vs
,
622 void *pixels
, int size
)
624 vnc_write(vs
, pixels
, size
);
627 /* slowest but generic code. */
628 void vnc_convert_pixel(VncState
*vs
, uint8_t *buf
, uint32_t v
)
632 #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
633 r
= (((v
& 0x00ff0000) >> 16) << vs
->client_pf
.rbits
) >> 8;
634 g
= (((v
& 0x0000ff00) >> 8) << vs
->client_pf
.gbits
) >> 8;
635 b
= (((v
& 0x000000ff) >> 0) << vs
->client_pf
.bbits
) >> 8;
637 # error need some bits here if you change VNC_SERVER_FB_FORMAT
639 v
= (r
<< vs
->client_pf
.rshift
) |
640 (g
<< vs
->client_pf
.gshift
) |
641 (b
<< vs
->client_pf
.bshift
);
642 switch (vs
->client_pf
.bytes_per_pixel
) {
672 static void vnc_write_pixels_generic(VncState
*vs
,
673 void *pixels1
, int size
)
677 if (VNC_SERVER_FB_BYTES
== 4) {
678 uint32_t *pixels
= pixels1
;
681 for (i
= 0; i
< n
; i
++) {
682 vnc_convert_pixel(vs
, buf
, pixels
[i
]);
683 vnc_write(vs
, buf
, vs
->client_pf
.bytes_per_pixel
);
688 int vnc_raw_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
692 VncDisplay
*vd
= vs
->vd
;
694 row
= vnc_server_fb_ptr(vd
, x
, y
);
695 for (i
= 0; i
< h
; i
++) {
696 vs
->write_pixels(vs
, row
, w
* VNC_SERVER_FB_BYTES
);
697 row
+= vnc_server_fb_stride(vd
);
702 int vnc_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
706 switch(vs
->vnc_encoding
) {
707 case VNC_ENCODING_ZLIB
:
708 n
= vnc_zlib_send_framebuffer_update(vs
, x
, y
, w
, h
);
710 case VNC_ENCODING_HEXTILE
:
711 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_HEXTILE
);
712 n
= vnc_hextile_send_framebuffer_update(vs
, x
, y
, w
, h
);
714 case VNC_ENCODING_TIGHT
:
715 n
= vnc_tight_send_framebuffer_update(vs
, x
, y
, w
, h
);
717 case VNC_ENCODING_TIGHT_PNG
:
718 n
= vnc_tight_png_send_framebuffer_update(vs
, x
, y
, w
, h
);
720 case VNC_ENCODING_ZRLE
:
721 n
= vnc_zrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
723 case VNC_ENCODING_ZYWRLE
:
724 n
= vnc_zywrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
727 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_RAW
);
728 n
= vnc_raw_send_framebuffer_update(vs
, x
, y
, w
, h
);
734 static void vnc_copy(VncState
*vs
, int src_x
, int src_y
, int dst_x
, int dst_y
, int w
, int h
)
736 /* send bitblit op to the vnc client */
738 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
740 vnc_write_u16(vs
, 1); /* number of rects */
741 vnc_framebuffer_update(vs
, dst_x
, dst_y
, w
, h
, VNC_ENCODING_COPYRECT
);
742 vnc_write_u16(vs
, src_x
);
743 vnc_write_u16(vs
, src_y
);
744 vnc_unlock_output(vs
);
748 static void vnc_dpy_copy(DisplayChangeListener
*dcl
,
749 int src_x
, int src_y
,
750 int dst_x
, int dst_y
, int w
, int h
)
752 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
756 int i
, x
, y
, pitch
, inc
, w_lim
, s
;
759 vnc_refresh_server_surface(vd
);
760 QTAILQ_FOREACH_SAFE(vs
, &vd
->clients
, next
, vn
) {
761 if (vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
762 vs
->force_update
= 1;
763 vnc_update_client(vs
, 1, true);
764 /* vs might be free()ed here */
768 /* do bitblit op on the local surface too */
769 pitch
= vnc_server_fb_stride(vd
);
770 src_row
= vnc_server_fb_ptr(vd
, src_x
, src_y
);
771 dst_row
= vnc_server_fb_ptr(vd
, dst_x
, dst_y
);
776 src_row
+= pitch
* (h
-1);
777 dst_row
+= pitch
* (h
-1);
782 w_lim
= w
- (VNC_DIRTY_PIXELS_PER_BIT
- (dst_x
% VNC_DIRTY_PIXELS_PER_BIT
));
786 w_lim
= w
- (w_lim
% VNC_DIRTY_PIXELS_PER_BIT
);
788 for (i
= 0; i
< h
; i
++) {
789 for (x
= 0; x
<= w_lim
;
790 x
+= s
, src_row
+= cmp_bytes
, dst_row
+= cmp_bytes
) {
792 if ((s
= w
- w_lim
) == 0)
795 s
= (VNC_DIRTY_PIXELS_PER_BIT
-
796 (dst_x
% VNC_DIRTY_PIXELS_PER_BIT
));
799 s
= VNC_DIRTY_PIXELS_PER_BIT
;
801 cmp_bytes
= s
* VNC_SERVER_FB_BYTES
;
802 if (memcmp(src_row
, dst_row
, cmp_bytes
) == 0)
804 memmove(dst_row
, src_row
, cmp_bytes
);
805 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
806 if (!vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
807 set_bit(((x
+ dst_x
) / VNC_DIRTY_PIXELS_PER_BIT
),
812 src_row
+= pitch
- w
* VNC_SERVER_FB_BYTES
;
813 dst_row
+= pitch
- w
* VNC_SERVER_FB_BYTES
;
817 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
818 if (vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
819 vnc_copy(vs
, src_x
, src_y
, dst_x
, dst_y
, w
, h
);
824 static void vnc_mouse_set(DisplayChangeListener
*dcl
,
825 int x
, int y
, int visible
)
827 /* can we ask the client(s) to move the pointer ??? */
830 static int vnc_cursor_define(VncState
*vs
)
832 QEMUCursor
*c
= vs
->vd
->cursor
;
835 if (vnc_has_feature(vs
, VNC_FEATURE_RICH_CURSOR
)) {
837 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
838 vnc_write_u8(vs
, 0); /* padding */
839 vnc_write_u16(vs
, 1); /* # of rects */
840 vnc_framebuffer_update(vs
, c
->hot_x
, c
->hot_y
, c
->width
, c
->height
,
841 VNC_ENCODING_RICH_CURSOR
);
842 isize
= c
->width
* c
->height
* vs
->client_pf
.bytes_per_pixel
;
843 vnc_write_pixels_generic(vs
, c
->data
, isize
);
844 vnc_write(vs
, vs
->vd
->cursor_mask
, vs
->vd
->cursor_msize
);
845 vnc_unlock_output(vs
);
851 static void vnc_dpy_cursor_define(DisplayChangeListener
*dcl
,
854 VncDisplay
*vd
= vnc_display
;
857 cursor_put(vd
->cursor
);
858 g_free(vd
->cursor_mask
);
861 cursor_get(vd
->cursor
);
862 vd
->cursor_msize
= cursor_get_mono_bpl(c
) * c
->height
;
863 vd
->cursor_mask
= g_malloc0(vd
->cursor_msize
);
864 cursor_get_mono_mask(c
, 0, vd
->cursor_mask
);
866 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
867 vnc_cursor_define(vs
);
871 static int find_and_clear_dirty_height(struct VncState
*vs
,
872 int y
, int last_x
, int x
, int height
)
876 for (h
= 1; h
< (height
- y
); h
++) {
877 if (!test_bit(last_x
, vs
->dirty
[y
+ h
])) {
880 bitmap_clear(vs
->dirty
[y
+ h
], last_x
, x
- last_x
);
886 static int vnc_update_client(VncState
*vs
, int has_dirty
, bool sync
)
888 if (vs
->need_update
&& vs
->csock
!= -1) {
889 VncDisplay
*vd
= vs
->vd
;
895 if (vs
->output
.offset
&& !vs
->audio_cap
&& !vs
->force_update
)
896 /* kernel send buffers are full -> drop frames to throttle */
899 if (!has_dirty
&& !vs
->audio_cap
&& !vs
->force_update
)
903 * Send screen updates to the vnc client using the server
904 * surface and server dirty map. guest surface updates
905 * happening in parallel don't disturb us, the next pass will
906 * send them to the client.
908 job
= vnc_job_new(vs
);
910 height
= MIN(pixman_image_get_height(vd
->server
), vs
->client_height
);
911 width
= MIN(pixman_image_get_width(vd
->server
), vs
->client_width
);
917 unsigned long offset
= find_next_bit((unsigned long *) &vs
->dirty
,
918 height
* VNC_DIRTY_BPL(vs
),
919 y
* VNC_DIRTY_BPL(vs
));
920 if (offset
== height
* VNC_DIRTY_BPL(vs
)) {
921 /* no more dirty bits */
924 y
= offset
/ VNC_DIRTY_BPL(vs
);
925 x
= offset
% VNC_DIRTY_BPL(vs
);
926 x2
= find_next_zero_bit((unsigned long *) &vs
->dirty
[y
],
927 VNC_DIRTY_BPL(vs
), x
);
928 bitmap_clear(vs
->dirty
[y
], x
, x2
- x
);
929 h
= find_and_clear_dirty_height(vs
, y
, x
, x2
, height
);
930 x2
= MIN(x2
, width
/ VNC_DIRTY_PIXELS_PER_BIT
);
932 n
+= vnc_job_add_rect(job
, x
* VNC_DIRTY_PIXELS_PER_BIT
, y
,
933 (x2
- x
) * VNC_DIRTY_PIXELS_PER_BIT
, h
);
941 vs
->force_update
= 0;
945 if (vs
->csock
== -1) {
946 vnc_disconnect_finish(vs
);
955 static void audio_capture_notify(void *opaque
, audcnotification_e cmd
)
957 VncState
*vs
= opaque
;
960 case AUD_CNOTIFY_DISABLE
:
962 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
963 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
964 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_END
);
965 vnc_unlock_output(vs
);
969 case AUD_CNOTIFY_ENABLE
:
971 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
972 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
973 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN
);
974 vnc_unlock_output(vs
);
980 static void audio_capture_destroy(void *opaque
)
984 static void audio_capture(void *opaque
, void *buf
, int size
)
986 VncState
*vs
= opaque
;
989 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
990 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
991 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_DATA
);
992 vnc_write_u32(vs
, size
);
993 vnc_write(vs
, buf
, size
);
994 vnc_unlock_output(vs
);
998 static void audio_add(VncState
*vs
)
1000 struct audio_capture_ops ops
;
1002 if (vs
->audio_cap
) {
1003 error_report("audio already running");
1007 ops
.notify
= audio_capture_notify
;
1008 ops
.destroy
= audio_capture_destroy
;
1009 ops
.capture
= audio_capture
;
1011 vs
->audio_cap
= AUD_add_capture(&vs
->as
, &ops
, vs
);
1012 if (!vs
->audio_cap
) {
1013 error_report("Failed to add audio capture");
1017 static void audio_del(VncState
*vs
)
1019 if (vs
->audio_cap
) {
1020 AUD_del_capture(vs
->audio_cap
, vs
);
1021 vs
->audio_cap
= NULL
;
1025 static void vnc_disconnect_start(VncState
*vs
)
1027 if (vs
->csock
== -1)
1029 vnc_set_share_mode(vs
, VNC_SHARE_MODE_DISCONNECTED
);
1030 qemu_set_fd_handler2(vs
->csock
, NULL
, NULL
, NULL
, NULL
);
1031 closesocket(vs
->csock
);
1035 void vnc_disconnect_finish(VncState
*vs
)
1039 vnc_jobs_join(vs
); /* Wait encoding jobs */
1041 vnc_lock_output(vs
);
1042 vnc_qmp_event(vs
, QEVENT_VNC_DISCONNECTED
);
1044 buffer_free(&vs
->input
);
1045 buffer_free(&vs
->output
);
1046 #ifdef CONFIG_VNC_WS
1047 buffer_free(&vs
->ws_input
);
1048 buffer_free(&vs
->ws_output
);
1049 #endif /* CONFIG_VNC_WS */
1051 qobject_decref(vs
->info
);
1054 vnc_tight_clear(vs
);
1057 #ifdef CONFIG_VNC_TLS
1058 vnc_tls_client_cleanup(vs
);
1059 #endif /* CONFIG_VNC_TLS */
1060 #ifdef CONFIG_VNC_SASL
1061 vnc_sasl_client_cleanup(vs
);
1062 #endif /* CONFIG_VNC_SASL */
1064 vnc_release_modifiers(vs
);
1066 if (vs
->initialized
) {
1067 QTAILQ_REMOVE(&vs
->vd
->clients
, vs
, next
);
1068 qemu_remove_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
1071 if (vs
->vd
->lock_key_sync
)
1072 qemu_remove_led_event_handler(vs
->led
);
1073 vnc_unlock_output(vs
);
1075 qemu_mutex_destroy(&vs
->output_mutex
);
1076 if (vs
->bh
!= NULL
) {
1077 qemu_bh_delete(vs
->bh
);
1079 buffer_free(&vs
->jobs_buffer
);
1081 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
1082 g_free(vs
->lossy_rect
[i
]);
1084 g_free(vs
->lossy_rect
);
1088 int vnc_client_io_error(VncState
*vs
, int ret
, int last_errno
)
1090 if (ret
== 0 || ret
== -1) {
1092 switch (last_errno
) {
1096 case WSAEWOULDBLOCK
:
1104 VNC_DEBUG("Closing down client sock: ret %d, errno %d\n",
1105 ret
, ret
< 0 ? last_errno
: 0);
1106 vnc_disconnect_start(vs
);
1114 void vnc_client_error(VncState
*vs
)
1116 VNC_DEBUG("Closing down client sock: protocol error\n");
1117 vnc_disconnect_start(vs
);
1120 #ifdef CONFIG_VNC_TLS
1121 static long vnc_client_write_tls(gnutls_session_t
*session
,
1122 const uint8_t *data
,
1125 long ret
= gnutls_write(*session
, data
, datalen
);
1127 if (ret
== GNUTLS_E_AGAIN
) {
1136 #endif /* CONFIG_VNC_TLS */
1139 * Called to write a chunk of data to the client socket. The data may
1140 * be the raw data, or may have already been encoded by SASL.
1141 * The data will be written either straight onto the socket, or
1142 * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1144 * NB, it is theoretically possible to have 2 layers of encryption,
1145 * both SASL, and this TLS layer. It is highly unlikely in practice
1146 * though, since SASL encryption will typically be a no-op if TLS
1149 * Returns the number of bytes written, which may be less than
1150 * the requested 'datalen' if the socket would block. Returns
1151 * -1 on error, and disconnects the client socket.
1153 long vnc_client_write_buf(VncState
*vs
, const uint8_t *data
, size_t datalen
)
1156 #ifdef CONFIG_VNC_TLS
1157 if (vs
->tls
.session
) {
1158 ret
= vnc_client_write_tls(&vs
->tls
.session
, data
, datalen
);
1160 #ifdef CONFIG_VNC_WS
1161 if (vs
->ws_tls
.session
) {
1162 ret
= vnc_client_write_tls(&vs
->ws_tls
.session
, data
, datalen
);
1164 #endif /* CONFIG_VNC_WS */
1165 #endif /* CONFIG_VNC_TLS */
1167 ret
= send(vs
->csock
, (const void *)data
, datalen
, 0);
1169 #ifdef CONFIG_VNC_TLS
1171 #endif /* CONFIG_VNC_TLS */
1172 VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data
, datalen
, ret
);
1173 return vnc_client_io_error(vs
, ret
, socket_error());
1178 * Called to write buffered data to the client socket, when not
1179 * using any SASL SSF encryption layers. Will write as much data
1180 * as possible without blocking. If all buffered data is written,
1181 * will switch the FD poll() handler back to read monitoring.
1183 * Returns the number of bytes written, which may be less than
1184 * the buffered output data if the socket would block. Returns
1185 * -1 on error, and disconnects the client socket.
1187 static long vnc_client_write_plain(VncState
*vs
)
1191 #ifdef CONFIG_VNC_SASL
1192 VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1193 vs
->output
.buffer
, vs
->output
.capacity
, vs
->output
.offset
,
1194 vs
->sasl
.waitWriteSSF
);
1196 if (vs
->sasl
.conn
&&
1198 vs
->sasl
.waitWriteSSF
) {
1199 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->sasl
.waitWriteSSF
);
1201 vs
->sasl
.waitWriteSSF
-= ret
;
1203 #endif /* CONFIG_VNC_SASL */
1204 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->output
.offset
);
1208 buffer_advance(&vs
->output
, ret
);
1210 if (vs
->output
.offset
== 0) {
1211 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
1219 * First function called whenever there is data to be written to
1220 * the client socket. Will delegate actual work according to whether
1221 * SASL SSF layers are enabled (thus requiring encryption calls)
1223 static void vnc_client_write_locked(void *opaque
)
1225 VncState
*vs
= opaque
;
1227 #ifdef CONFIG_VNC_SASL
1228 if (vs
->sasl
.conn
&&
1230 !vs
->sasl
.waitWriteSSF
) {
1231 vnc_client_write_sasl(vs
);
1233 #endif /* CONFIG_VNC_SASL */
1235 #ifdef CONFIG_VNC_WS
1236 if (vs
->encode_ws
) {
1237 vnc_client_write_ws(vs
);
1239 #endif /* CONFIG_VNC_WS */
1241 vnc_client_write_plain(vs
);
1246 void vnc_client_write(void *opaque
)
1248 VncState
*vs
= opaque
;
1250 vnc_lock_output(vs
);
1251 if (vs
->output
.offset
1252 #ifdef CONFIG_VNC_WS
1253 || vs
->ws_output
.offset
1256 vnc_client_write_locked(opaque
);
1257 } else if (vs
->csock
!= -1) {
1258 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
1260 vnc_unlock_output(vs
);
1263 void vnc_read_when(VncState
*vs
, VncReadEvent
*func
, size_t expecting
)
1265 vs
->read_handler
= func
;
1266 vs
->read_handler_expect
= expecting
;
1269 #ifdef CONFIG_VNC_TLS
1270 static long vnc_client_read_tls(gnutls_session_t
*session
, uint8_t *data
,
1273 long ret
= gnutls_read(*session
, data
, datalen
);
1275 if (ret
== GNUTLS_E_AGAIN
) {
1284 #endif /* CONFIG_VNC_TLS */
1287 * Called to read a chunk of data from the client socket. The data may
1288 * be the raw data, or may need to be further decoded by SASL.
1289 * The data will be read either straight from to the socket, or
1290 * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1292 * NB, it is theoretically possible to have 2 layers of encryption,
1293 * both SASL, and this TLS layer. It is highly unlikely in practice
1294 * though, since SASL encryption will typically be a no-op if TLS
1297 * Returns the number of bytes read, which may be less than
1298 * the requested 'datalen' if the socket would block. Returns
1299 * -1 on error, and disconnects the client socket.
1301 long vnc_client_read_buf(VncState
*vs
, uint8_t *data
, size_t datalen
)
1304 #ifdef CONFIG_VNC_TLS
1305 if (vs
->tls
.session
) {
1306 ret
= vnc_client_read_tls(&vs
->tls
.session
, data
, datalen
);
1308 #ifdef CONFIG_VNC_WS
1309 if (vs
->ws_tls
.session
) {
1310 ret
= vnc_client_read_tls(&vs
->ws_tls
.session
, data
, datalen
);
1312 #endif /* CONFIG_VNC_WS */
1313 #endif /* CONFIG_VNC_TLS */
1315 ret
= qemu_recv(vs
->csock
, data
, datalen
, 0);
1317 #ifdef CONFIG_VNC_TLS
1319 #endif /* CONFIG_VNC_TLS */
1320 VNC_DEBUG("Read wire %p %zd -> %ld\n", data
, datalen
, ret
);
1321 return vnc_client_io_error(vs
, ret
, socket_error());
1326 * Called to read data from the client socket to the input buffer,
1327 * when not using any SASL SSF encryption layers. Will read as much
1328 * data as possible without blocking.
1330 * Returns the number of bytes read. Returns -1 on error, and
1331 * disconnects the client socket.
1333 static long vnc_client_read_plain(VncState
*vs
)
1336 VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1337 vs
->input
.buffer
, vs
->input
.capacity
, vs
->input
.offset
);
1338 buffer_reserve(&vs
->input
, 4096);
1339 ret
= vnc_client_read_buf(vs
, buffer_end(&vs
->input
), 4096);
1342 vs
->input
.offset
+= ret
;
1346 static void vnc_jobs_bh(void *opaque
)
1348 VncState
*vs
= opaque
;
1350 vnc_jobs_consume_buffer(vs
);
1354 * First function called whenever there is more data to be read from
1355 * the client socket. Will delegate actual work according to whether
1356 * SASL SSF layers are enabled (thus requiring decryption calls)
1358 void vnc_client_read(void *opaque
)
1360 VncState
*vs
= opaque
;
1363 #ifdef CONFIG_VNC_SASL
1364 if (vs
->sasl
.conn
&& vs
->sasl
.runSSF
)
1365 ret
= vnc_client_read_sasl(vs
);
1367 #endif /* CONFIG_VNC_SASL */
1368 #ifdef CONFIG_VNC_WS
1369 if (vs
->encode_ws
) {
1370 ret
= vnc_client_read_ws(vs
);
1372 vnc_disconnect_start(vs
);
1374 } else if (ret
== -2) {
1375 vnc_client_error(vs
);
1379 #endif /* CONFIG_VNC_WS */
1381 ret
= vnc_client_read_plain(vs
);
1384 if (vs
->csock
== -1)
1385 vnc_disconnect_finish(vs
);
1389 while (vs
->read_handler
&& vs
->input
.offset
>= vs
->read_handler_expect
) {
1390 size_t len
= vs
->read_handler_expect
;
1393 ret
= vs
->read_handler(vs
, vs
->input
.buffer
, len
);
1394 if (vs
->csock
== -1) {
1395 vnc_disconnect_finish(vs
);
1400 buffer_advance(&vs
->input
, len
);
1402 vs
->read_handler_expect
= ret
;
1407 void vnc_write(VncState
*vs
, const void *data
, size_t len
)
1409 buffer_reserve(&vs
->output
, len
);
1411 if (vs
->csock
!= -1 && buffer_empty(&vs
->output
)) {
1412 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, vnc_client_write
, vs
);
1415 buffer_append(&vs
->output
, data
, len
);
1418 void vnc_write_s32(VncState
*vs
, int32_t value
)
1420 vnc_write_u32(vs
, *(uint32_t *)&value
);
1423 void vnc_write_u32(VncState
*vs
, uint32_t value
)
1427 buf
[0] = (value
>> 24) & 0xFF;
1428 buf
[1] = (value
>> 16) & 0xFF;
1429 buf
[2] = (value
>> 8) & 0xFF;
1430 buf
[3] = value
& 0xFF;
1432 vnc_write(vs
, buf
, 4);
1435 void vnc_write_u16(VncState
*vs
, uint16_t value
)
1439 buf
[0] = (value
>> 8) & 0xFF;
1440 buf
[1] = value
& 0xFF;
1442 vnc_write(vs
, buf
, 2);
1445 void vnc_write_u8(VncState
*vs
, uint8_t value
)
1447 vnc_write(vs
, (char *)&value
, 1);
1450 void vnc_flush(VncState
*vs
)
1452 vnc_lock_output(vs
);
1453 if (vs
->csock
!= -1 && (vs
->output
.offset
1454 #ifdef CONFIG_VNC_WS
1455 || vs
->ws_output
.offset
1458 vnc_client_write_locked(vs
);
1460 vnc_unlock_output(vs
);
1463 static uint8_t read_u8(uint8_t *data
, size_t offset
)
1465 return data
[offset
];
1468 static uint16_t read_u16(uint8_t *data
, size_t offset
)
1470 return ((data
[offset
] & 0xFF) << 8) | (data
[offset
+ 1] & 0xFF);
1473 static int32_t read_s32(uint8_t *data
, size_t offset
)
1475 return (int32_t)((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1476 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1479 uint32_t read_u32(uint8_t *data
, size_t offset
)
1481 return ((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1482 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1485 static void client_cut_text(VncState
*vs
, size_t len
, uint8_t *text
)
1489 static void check_pointer_type_change(Notifier
*notifier
, void *data
)
1491 VncState
*vs
= container_of(notifier
, VncState
, mouse_mode_notifier
);
1492 int absolute
= qemu_input_is_absolute();
1494 if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
) && vs
->absolute
!= absolute
) {
1495 vnc_lock_output(vs
);
1496 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1497 vnc_write_u8(vs
, 0);
1498 vnc_write_u16(vs
, 1);
1499 vnc_framebuffer_update(vs
, absolute
, 0,
1500 surface_width(vs
->vd
->ds
),
1501 surface_height(vs
->vd
->ds
),
1502 VNC_ENCODING_POINTER_TYPE_CHANGE
);
1503 vnc_unlock_output(vs
);
1506 vs
->absolute
= absolute
;
1509 static void pointer_event(VncState
*vs
, int button_mask
, int x
, int y
)
1511 static uint32_t bmap
[INPUT_BUTTON_MAX
] = {
1512 [INPUT_BUTTON_LEFT
] = 0x01,
1513 [INPUT_BUTTON_MIDDLE
] = 0x02,
1514 [INPUT_BUTTON_RIGHT
] = 0x04,
1515 [INPUT_BUTTON_WHEEL_UP
] = 0x08,
1516 [INPUT_BUTTON_WHEEL_DOWN
] = 0x10,
1518 QemuConsole
*con
= vs
->vd
->dcl
.con
;
1519 int width
= surface_width(vs
->vd
->ds
);
1520 int height
= surface_height(vs
->vd
->ds
);
1522 if (vs
->last_bmask
!= button_mask
) {
1523 qemu_input_update_buttons(con
, bmap
, vs
->last_bmask
, button_mask
);
1524 vs
->last_bmask
= button_mask
;
1528 qemu_input_queue_abs(con
, INPUT_AXIS_X
, x
, width
);
1529 qemu_input_queue_abs(con
, INPUT_AXIS_Y
, y
, height
);
1530 } else if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
)) {
1531 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- 0x7FFF);
1532 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- 0x7FFF);
1534 if (vs
->last_x
!= -1) {
1535 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- vs
->last_x
);
1536 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- vs
->last_y
);
1541 qemu_input_event_sync();
1544 static void reset_keys(VncState
*vs
)
1547 for(i
= 0; i
< 256; i
++) {
1548 if (vs
->modifiers_state
[i
]) {
1549 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, i
, false);
1550 vs
->modifiers_state
[i
] = 0;
1555 static void press_key(VncState
*vs
, int keysym
)
1557 int keycode
= keysym2scancode(vs
->vd
->kbd_layout
, keysym
) & SCANCODE_KEYMASK
;
1558 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, true);
1559 qemu_input_event_send_key_delay(0);
1560 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1561 qemu_input_event_send_key_delay(0);
1564 static int current_led_state(VncState
*vs
)
1568 if (vs
->modifiers_state
[0x46]) {
1569 ledstate
|= QEMU_SCROLL_LOCK_LED
;
1571 if (vs
->modifiers_state
[0x45]) {
1572 ledstate
|= QEMU_NUM_LOCK_LED
;
1574 if (vs
->modifiers_state
[0x3a]) {
1575 ledstate
|= QEMU_CAPS_LOCK_LED
;
1581 static void vnc_led_state_change(VncState
*vs
)
1585 if (!vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
)) {
1589 ledstate
= current_led_state(vs
);
1590 vnc_lock_output(vs
);
1591 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1592 vnc_write_u8(vs
, 0);
1593 vnc_write_u16(vs
, 1);
1594 vnc_framebuffer_update(vs
, 0, 0, 1, 1, VNC_ENCODING_LED_STATE
);
1595 vnc_write_u8(vs
, ledstate
);
1596 vnc_unlock_output(vs
);
1600 static void kbd_leds(void *opaque
, int ledstate
)
1602 VncState
*vs
= opaque
;
1604 bool has_changed
= (ledstate
!= current_led_state(vs
));
1606 trace_vnc_key_guest_leds((ledstate
& QEMU_CAPS_LOCK_LED
),
1607 (ledstate
& QEMU_NUM_LOCK_LED
),
1608 (ledstate
& QEMU_SCROLL_LOCK_LED
));
1610 caps
= ledstate
& QEMU_CAPS_LOCK_LED
? 1 : 0;
1611 num
= ledstate
& QEMU_NUM_LOCK_LED
? 1 : 0;
1612 scr
= ledstate
& QEMU_SCROLL_LOCK_LED
? 1 : 0;
1614 if (vs
->modifiers_state
[0x3a] != caps
) {
1615 vs
->modifiers_state
[0x3a] = caps
;
1617 if (vs
->modifiers_state
[0x45] != num
) {
1618 vs
->modifiers_state
[0x45] = num
;
1620 if (vs
->modifiers_state
[0x46] != scr
) {
1621 vs
->modifiers_state
[0x46] = scr
;
1624 /* Sending the current led state message to the client */
1626 vnc_led_state_change(vs
);
1630 static void do_key_event(VncState
*vs
, int down
, int keycode
, int sym
)
1632 /* QEMU console switch */
1634 case 0x2a: /* Left Shift */
1635 case 0x36: /* Right Shift */
1636 case 0x1d: /* Left CTRL */
1637 case 0x9d: /* Right CTRL */
1638 case 0x38: /* Left ALT */
1639 case 0xb8: /* Right ALT */
1641 vs
->modifiers_state
[keycode
] = 1;
1643 vs
->modifiers_state
[keycode
] = 0;
1645 case 0x02 ... 0x0a: /* '1' to '9' keys */
1646 if (down
&& vs
->modifiers_state
[0x1d] && vs
->modifiers_state
[0x38]) {
1647 /* Reset the modifiers sent to the current console */
1649 console_select(keycode
- 0x02);
1653 case 0x3a: /* CapsLock */
1654 case 0x45: /* NumLock */
1656 vs
->modifiers_state
[keycode
] ^= 1;
1660 /* Turn off the lock state sync logic if the client support the led
1663 if (down
&& vs
->vd
->lock_key_sync
&&
1664 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1665 keycode_is_keypad(vs
->vd
->kbd_layout
, keycode
)) {
1666 /* If the numlock state needs to change then simulate an additional
1667 keypress before sending this one. This will happen if the user
1668 toggles numlock away from the VNC window.
1670 if (keysym_is_numlock(vs
->vd
->kbd_layout
, sym
& 0xFFFF)) {
1671 if (!vs
->modifiers_state
[0x45]) {
1672 trace_vnc_key_sync_numlock(true);
1673 vs
->modifiers_state
[0x45] = 1;
1674 press_key(vs
, 0xff7f);
1677 if (vs
->modifiers_state
[0x45]) {
1678 trace_vnc_key_sync_numlock(false);
1679 vs
->modifiers_state
[0x45] = 0;
1680 press_key(vs
, 0xff7f);
1685 if (down
&& vs
->vd
->lock_key_sync
&&
1686 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1687 ((sym
>= 'A' && sym
<= 'Z') || (sym
>= 'a' && sym
<= 'z'))) {
1688 /* If the capslock state needs to change then simulate an additional
1689 keypress before sending this one. This will happen if the user
1690 toggles capslock away from the VNC window.
1692 int uppercase
= !!(sym
>= 'A' && sym
<= 'Z');
1693 int shift
= !!(vs
->modifiers_state
[0x2a] | vs
->modifiers_state
[0x36]);
1694 int capslock
= !!(vs
->modifiers_state
[0x3a]);
1696 if (uppercase
== shift
) {
1697 trace_vnc_key_sync_capslock(false);
1698 vs
->modifiers_state
[0x3a] = 0;
1699 press_key(vs
, 0xffe5);
1702 if (uppercase
!= shift
) {
1703 trace_vnc_key_sync_capslock(true);
1704 vs
->modifiers_state
[0x3a] = 1;
1705 press_key(vs
, 0xffe5);
1710 if (qemu_console_is_graphic(NULL
)) {
1711 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, down
);
1713 bool numlock
= vs
->modifiers_state
[0x45];
1714 bool control
= (vs
->modifiers_state
[0x1d] ||
1715 vs
->modifiers_state
[0x9d]);
1716 /* QEMU console emulation */
1719 case 0x2a: /* Left Shift */
1720 case 0x36: /* Right Shift */
1721 case 0x1d: /* Left CTRL */
1722 case 0x9d: /* Right CTRL */
1723 case 0x38: /* Left ALT */
1724 case 0xb8: /* Right ALT */
1727 kbd_put_keysym(QEMU_KEY_UP
);
1730 kbd_put_keysym(QEMU_KEY_DOWN
);
1733 kbd_put_keysym(QEMU_KEY_LEFT
);
1736 kbd_put_keysym(QEMU_KEY_RIGHT
);
1739 kbd_put_keysym(QEMU_KEY_DELETE
);
1742 kbd_put_keysym(QEMU_KEY_HOME
);
1745 kbd_put_keysym(QEMU_KEY_END
);
1748 kbd_put_keysym(QEMU_KEY_PAGEUP
);
1751 kbd_put_keysym(QEMU_KEY_PAGEDOWN
);
1755 kbd_put_keysym(numlock
? '7' : QEMU_KEY_HOME
);
1758 kbd_put_keysym(numlock
? '8' : QEMU_KEY_UP
);
1761 kbd_put_keysym(numlock
? '9' : QEMU_KEY_PAGEUP
);
1764 kbd_put_keysym(numlock
? '4' : QEMU_KEY_LEFT
);
1767 kbd_put_keysym('5');
1770 kbd_put_keysym(numlock
? '6' : QEMU_KEY_RIGHT
);
1773 kbd_put_keysym(numlock
? '1' : QEMU_KEY_END
);
1776 kbd_put_keysym(numlock
? '2' : QEMU_KEY_DOWN
);
1779 kbd_put_keysym(numlock
? '3' : QEMU_KEY_PAGEDOWN
);
1782 kbd_put_keysym('0');
1785 kbd_put_keysym(numlock
? '.' : QEMU_KEY_DELETE
);
1789 kbd_put_keysym('/');
1792 kbd_put_keysym('*');
1795 kbd_put_keysym('-');
1798 kbd_put_keysym('+');
1801 kbd_put_keysym('\n');
1806 kbd_put_keysym(sym
& 0x1f);
1808 kbd_put_keysym(sym
);
1816 static void vnc_release_modifiers(VncState
*vs
)
1818 static const int keycodes
[] = {
1819 /* shift, control, alt keys, both left & right */
1820 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8,
1824 if (!qemu_console_is_graphic(NULL
)) {
1827 for (i
= 0; i
< ARRAY_SIZE(keycodes
); i
++) {
1828 keycode
= keycodes
[i
];
1829 if (!vs
->modifiers_state
[keycode
]) {
1832 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1836 static const char *code2name(int keycode
)
1838 return QKeyCode_lookup
[qemu_input_key_number_to_qcode(keycode
)];
1841 static void key_event(VncState
*vs
, int down
, uint32_t sym
)
1846 if (lsym
>= 'A' && lsym
<= 'Z' && qemu_console_is_graphic(NULL
)) {
1847 lsym
= lsym
- 'A' + 'a';
1850 keycode
= keysym2scancode(vs
->vd
->kbd_layout
, lsym
& 0xFFFF) & SCANCODE_KEYMASK
;
1851 trace_vnc_key_event_map(down
, sym
, keycode
, code2name(keycode
));
1852 do_key_event(vs
, down
, keycode
, sym
);
1855 static void ext_key_event(VncState
*vs
, int down
,
1856 uint32_t sym
, uint16_t keycode
)
1858 /* if the user specifies a keyboard layout, always use it */
1859 if (keyboard_layout
) {
1860 key_event(vs
, down
, sym
);
1862 trace_vnc_key_event_ext(down
, sym
, keycode
, code2name(keycode
));
1863 do_key_event(vs
, down
, keycode
, sym
);
1867 static void framebuffer_update_request(VncState
*vs
, int incremental
,
1868 int x_position
, int y_position
,
1872 const size_t width
= surface_width(vs
->vd
->ds
) / VNC_DIRTY_PIXELS_PER_BIT
;
1873 const size_t height
= surface_height(vs
->vd
->ds
);
1875 if (y_position
> height
) {
1876 y_position
= height
;
1878 if (y_position
+ h
>= height
) {
1879 h
= height
- y_position
;
1882 vs
->need_update
= 1;
1884 vs
->force_update
= 1;
1885 for (i
= 0; i
< h
; i
++) {
1886 bitmap_set(vs
->dirty
[y_position
+ i
], 0, width
);
1887 bitmap_clear(vs
->dirty
[y_position
+ i
], width
,
1888 VNC_DIRTY_BITS
- width
);
1893 static void send_ext_key_event_ack(VncState
*vs
)
1895 vnc_lock_output(vs
);
1896 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1897 vnc_write_u8(vs
, 0);
1898 vnc_write_u16(vs
, 1);
1899 vnc_framebuffer_update(vs
, 0, 0,
1900 surface_width(vs
->vd
->ds
),
1901 surface_height(vs
->vd
->ds
),
1902 VNC_ENCODING_EXT_KEY_EVENT
);
1903 vnc_unlock_output(vs
);
1907 static void send_ext_audio_ack(VncState
*vs
)
1909 vnc_lock_output(vs
);
1910 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1911 vnc_write_u8(vs
, 0);
1912 vnc_write_u16(vs
, 1);
1913 vnc_framebuffer_update(vs
, 0, 0,
1914 surface_width(vs
->vd
->ds
),
1915 surface_height(vs
->vd
->ds
),
1916 VNC_ENCODING_AUDIO
);
1917 vnc_unlock_output(vs
);
1921 static void set_encodings(VncState
*vs
, int32_t *encodings
, size_t n_encodings
)
1924 unsigned int enc
= 0;
1927 vs
->vnc_encoding
= 0;
1928 vs
->tight
.compression
= 9;
1929 vs
->tight
.quality
= -1; /* Lossless by default */
1933 * Start from the end because the encodings are sent in order of preference.
1934 * This way the preferred encoding (first encoding defined in the array)
1935 * will be set at the end of the loop.
1937 for (i
= n_encodings
- 1; i
>= 0; i
--) {
1940 case VNC_ENCODING_RAW
:
1941 vs
->vnc_encoding
= enc
;
1943 case VNC_ENCODING_COPYRECT
:
1944 vs
->features
|= VNC_FEATURE_COPYRECT_MASK
;
1946 case VNC_ENCODING_HEXTILE
:
1947 vs
->features
|= VNC_FEATURE_HEXTILE_MASK
;
1948 vs
->vnc_encoding
= enc
;
1950 case VNC_ENCODING_TIGHT
:
1951 vs
->features
|= VNC_FEATURE_TIGHT_MASK
;
1952 vs
->vnc_encoding
= enc
;
1954 #ifdef CONFIG_VNC_PNG
1955 case VNC_ENCODING_TIGHT_PNG
:
1956 vs
->features
|= VNC_FEATURE_TIGHT_PNG_MASK
;
1957 vs
->vnc_encoding
= enc
;
1960 case VNC_ENCODING_ZLIB
:
1961 vs
->features
|= VNC_FEATURE_ZLIB_MASK
;
1962 vs
->vnc_encoding
= enc
;
1964 case VNC_ENCODING_ZRLE
:
1965 vs
->features
|= VNC_FEATURE_ZRLE_MASK
;
1966 vs
->vnc_encoding
= enc
;
1968 case VNC_ENCODING_ZYWRLE
:
1969 vs
->features
|= VNC_FEATURE_ZYWRLE_MASK
;
1970 vs
->vnc_encoding
= enc
;
1972 case VNC_ENCODING_DESKTOPRESIZE
:
1973 vs
->features
|= VNC_FEATURE_RESIZE_MASK
;
1975 case VNC_ENCODING_POINTER_TYPE_CHANGE
:
1976 vs
->features
|= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK
;
1978 case VNC_ENCODING_RICH_CURSOR
:
1979 vs
->features
|= VNC_FEATURE_RICH_CURSOR_MASK
;
1981 case VNC_ENCODING_EXT_KEY_EVENT
:
1982 send_ext_key_event_ack(vs
);
1984 case VNC_ENCODING_AUDIO
:
1985 send_ext_audio_ack(vs
);
1987 case VNC_ENCODING_WMVi
:
1988 vs
->features
|= VNC_FEATURE_WMVI_MASK
;
1990 case VNC_ENCODING_LED_STATE
:
1991 vs
->features
|= VNC_FEATURE_LED_STATE_MASK
;
1993 case VNC_ENCODING_COMPRESSLEVEL0
... VNC_ENCODING_COMPRESSLEVEL0
+ 9:
1994 vs
->tight
.compression
= (enc
& 0x0F);
1996 case VNC_ENCODING_QUALITYLEVEL0
... VNC_ENCODING_QUALITYLEVEL0
+ 9:
1997 if (vs
->vd
->lossy
) {
1998 vs
->tight
.quality
= (enc
& 0x0F);
2002 VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i
, enc
, enc
);
2006 vnc_desktop_resize(vs
);
2007 check_pointer_type_change(&vs
->mouse_mode_notifier
, NULL
);
2008 vnc_led_state_change(vs
);
2011 static void set_pixel_conversion(VncState
*vs
)
2013 pixman_format_code_t fmt
= qemu_pixman_get_format(&vs
->client_pf
);
2015 if (fmt
== VNC_SERVER_FB_FORMAT
) {
2016 vs
->write_pixels
= vnc_write_pixels_copy
;
2017 vnc_hextile_set_pixel_conversion(vs
, 0);
2019 vs
->write_pixels
= vnc_write_pixels_generic
;
2020 vnc_hextile_set_pixel_conversion(vs
, 1);
2024 static void set_pixel_format(VncState
*vs
,
2025 int bits_per_pixel
, int depth
,
2026 int big_endian_flag
, int true_color_flag
,
2027 int red_max
, int green_max
, int blue_max
,
2028 int red_shift
, int green_shift
, int blue_shift
)
2030 if (!true_color_flag
) {
2031 vnc_client_error(vs
);
2035 vs
->client_pf
.rmax
= red_max
;
2036 vs
->client_pf
.rbits
= hweight_long(red_max
);
2037 vs
->client_pf
.rshift
= red_shift
;
2038 vs
->client_pf
.rmask
= red_max
<< red_shift
;
2039 vs
->client_pf
.gmax
= green_max
;
2040 vs
->client_pf
.gbits
= hweight_long(green_max
);
2041 vs
->client_pf
.gshift
= green_shift
;
2042 vs
->client_pf
.gmask
= green_max
<< green_shift
;
2043 vs
->client_pf
.bmax
= blue_max
;
2044 vs
->client_pf
.bbits
= hweight_long(blue_max
);
2045 vs
->client_pf
.bshift
= blue_shift
;
2046 vs
->client_pf
.bmask
= blue_max
<< blue_shift
;
2047 vs
->client_pf
.bits_per_pixel
= bits_per_pixel
;
2048 vs
->client_pf
.bytes_per_pixel
= bits_per_pixel
/ 8;
2049 vs
->client_pf
.depth
= bits_per_pixel
== 32 ? 24 : bits_per_pixel
;
2050 vs
->client_be
= big_endian_flag
;
2052 set_pixel_conversion(vs
);
2054 graphic_hw_invalidate(NULL
);
2055 graphic_hw_update(NULL
);
2058 static void pixel_format_message (VncState
*vs
) {
2059 char pad
[3] = { 0, 0, 0 };
2061 vs
->client_pf
= qemu_default_pixelformat(32);
2063 vnc_write_u8(vs
, vs
->client_pf
.bits_per_pixel
); /* bits-per-pixel */
2064 vnc_write_u8(vs
, vs
->client_pf
.depth
); /* depth */
2066 #ifdef HOST_WORDS_BIGENDIAN
2067 vnc_write_u8(vs
, 1); /* big-endian-flag */
2069 vnc_write_u8(vs
, 0); /* big-endian-flag */
2071 vnc_write_u8(vs
, 1); /* true-color-flag */
2072 vnc_write_u16(vs
, vs
->client_pf
.rmax
); /* red-max */
2073 vnc_write_u16(vs
, vs
->client_pf
.gmax
); /* green-max */
2074 vnc_write_u16(vs
, vs
->client_pf
.bmax
); /* blue-max */
2075 vnc_write_u8(vs
, vs
->client_pf
.rshift
); /* red-shift */
2076 vnc_write_u8(vs
, vs
->client_pf
.gshift
); /* green-shift */
2077 vnc_write_u8(vs
, vs
->client_pf
.bshift
); /* blue-shift */
2078 vnc_write(vs
, pad
, 3); /* padding */
2080 vnc_hextile_set_pixel_conversion(vs
, 0);
2081 vs
->write_pixels
= vnc_write_pixels_copy
;
2084 static void vnc_colordepth(VncState
*vs
)
2086 if (vnc_has_feature(vs
, VNC_FEATURE_WMVI
)) {
2087 /* Sending a WMVi message to notify the client*/
2088 vnc_lock_output(vs
);
2089 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
2090 vnc_write_u8(vs
, 0);
2091 vnc_write_u16(vs
, 1); /* number of rects */
2092 vnc_framebuffer_update(vs
, 0, 0,
2093 surface_width(vs
->vd
->ds
),
2094 surface_height(vs
->vd
->ds
),
2096 pixel_format_message(vs
);
2097 vnc_unlock_output(vs
);
2100 set_pixel_conversion(vs
);
2104 static int protocol_client_msg(VncState
*vs
, uint8_t *data
, size_t len
)
2108 VncDisplay
*vd
= vs
->vd
;
2111 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2115 case VNC_MSG_CLIENT_SET_PIXEL_FORMAT
:
2119 set_pixel_format(vs
, read_u8(data
, 4), read_u8(data
, 5),
2120 read_u8(data
, 6), read_u8(data
, 7),
2121 read_u16(data
, 8), read_u16(data
, 10),
2122 read_u16(data
, 12), read_u8(data
, 14),
2123 read_u8(data
, 15), read_u8(data
, 16));
2125 case VNC_MSG_CLIENT_SET_ENCODINGS
:
2130 limit
= read_u16(data
, 2);
2132 return 4 + (limit
* 4);
2134 limit
= read_u16(data
, 2);
2136 for (i
= 0; i
< limit
; i
++) {
2137 int32_t val
= read_s32(data
, 4 + (i
* 4));
2138 memcpy(data
+ 4 + (i
* 4), &val
, sizeof(val
));
2141 set_encodings(vs
, (int32_t *)(data
+ 4), limit
);
2143 case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST
:
2147 framebuffer_update_request(vs
,
2148 read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4),
2149 read_u16(data
, 6), read_u16(data
, 8));
2151 case VNC_MSG_CLIENT_KEY_EVENT
:
2155 key_event(vs
, read_u8(data
, 1), read_u32(data
, 4));
2157 case VNC_MSG_CLIENT_POINTER_EVENT
:
2161 pointer_event(vs
, read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4));
2163 case VNC_MSG_CLIENT_CUT_TEXT
:
2168 uint32_t dlen
= read_u32(data
, 4);
2173 client_cut_text(vs
, read_u32(data
, 4), data
+ 8);
2175 case VNC_MSG_CLIENT_QEMU
:
2179 switch (read_u8(data
, 1)) {
2180 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT
:
2184 ext_key_event(vs
, read_u16(data
, 2),
2185 read_u32(data
, 4), read_u32(data
, 8));
2187 case VNC_MSG_CLIENT_QEMU_AUDIO
:
2191 switch (read_u16 (data
, 2)) {
2192 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE
:
2195 case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE
:
2198 case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT
:
2201 switch (read_u8(data
, 4)) {
2202 case 0: vs
->as
.fmt
= AUD_FMT_U8
; break;
2203 case 1: vs
->as
.fmt
= AUD_FMT_S8
; break;
2204 case 2: vs
->as
.fmt
= AUD_FMT_U16
; break;
2205 case 3: vs
->as
.fmt
= AUD_FMT_S16
; break;
2206 case 4: vs
->as
.fmt
= AUD_FMT_U32
; break;
2207 case 5: vs
->as
.fmt
= AUD_FMT_S32
; break;
2209 printf("Invalid audio format %d\n", read_u8(data
, 4));
2210 vnc_client_error(vs
);
2213 vs
->as
.nchannels
= read_u8(data
, 5);
2214 if (vs
->as
.nchannels
!= 1 && vs
->as
.nchannels
!= 2) {
2215 printf("Invalid audio channel coount %d\n",
2217 vnc_client_error(vs
);
2220 vs
->as
.freq
= read_u32(data
, 6);
2223 printf ("Invalid audio message %d\n", read_u8(data
, 4));
2224 vnc_client_error(vs
);
2230 printf("Msg: %d\n", read_u16(data
, 0));
2231 vnc_client_error(vs
);
2236 printf("Msg: %d\n", data
[0]);
2237 vnc_client_error(vs
);
2241 vnc_read_when(vs
, protocol_client_msg
, 1);
2245 static int protocol_client_init(VncState
*vs
, uint8_t *data
, size_t len
)
2251 mode
= data
[0] ? VNC_SHARE_MODE_SHARED
: VNC_SHARE_MODE_EXCLUSIVE
;
2252 switch (vs
->vd
->share_policy
) {
2253 case VNC_SHARE_POLICY_IGNORE
:
2255 * Ignore the shared flag. Nothing to do here.
2257 * Doesn't conform to the rfb spec but is traditional qemu
2258 * behavior, thus left here as option for compatibility
2262 case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
:
2264 * Policy: Allow clients ask for exclusive access.
2266 * Implementation: When a client asks for exclusive access,
2267 * disconnect all others. Shared connects are allowed as long
2268 * as no exclusive connection exists.
2270 * This is how the rfb spec suggests to handle the shared flag.
2272 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2274 QTAILQ_FOREACH(client
, &vs
->vd
->clients
, next
) {
2278 if (client
->share_mode
!= VNC_SHARE_MODE_EXCLUSIVE
&&
2279 client
->share_mode
!= VNC_SHARE_MODE_SHARED
) {
2282 vnc_disconnect_start(client
);
2285 if (mode
== VNC_SHARE_MODE_SHARED
) {
2286 if (vs
->vd
->num_exclusive
> 0) {
2287 vnc_disconnect_start(vs
);
2292 case VNC_SHARE_POLICY_FORCE_SHARED
:
2294 * Policy: Shared connects only.
2295 * Implementation: Disallow clients asking for exclusive access.
2297 * Useful for shared desktop sessions where you don't want
2298 * someone forgetting to say -shared when running the vnc
2299 * client disconnect everybody else.
2301 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2302 vnc_disconnect_start(vs
);
2307 vnc_set_share_mode(vs
, mode
);
2309 vs
->client_width
= surface_width(vs
->vd
->ds
);
2310 vs
->client_height
= surface_height(vs
->vd
->ds
);
2311 vnc_write_u16(vs
, vs
->client_width
);
2312 vnc_write_u16(vs
, vs
->client_height
);
2314 pixel_format_message(vs
);
2317 size
= snprintf(buf
, sizeof(buf
), "QEMU (%s)", qemu_name
);
2319 size
= snprintf(buf
, sizeof(buf
), "QEMU");
2321 vnc_write_u32(vs
, size
);
2322 vnc_write(vs
, buf
, size
);
2325 vnc_client_cache_auth(vs
);
2326 vnc_qmp_event(vs
, QEVENT_VNC_INITIALIZED
);
2328 vnc_read_when(vs
, protocol_client_msg
, 1);
2333 void start_client_init(VncState
*vs
)
2335 vnc_read_when(vs
, protocol_client_init
, 1);
2338 static void make_challenge(VncState
*vs
)
2342 srand(time(NULL
)+getpid()+getpid()*987654+rand());
2344 for (i
= 0 ; i
< sizeof(vs
->challenge
) ; i
++)
2345 vs
->challenge
[i
] = (int) (256.0*rand()/(RAND_MAX
+1.0));
2348 static int protocol_client_auth_vnc(VncState
*vs
, uint8_t *data
, size_t len
)
2350 unsigned char response
[VNC_AUTH_CHALLENGE_SIZE
];
2352 unsigned char key
[8];
2353 time_t now
= time(NULL
);
2355 if (!vs
->vd
->password
) {
2356 VNC_DEBUG("No password configured on server");
2359 if (vs
->vd
->expires
< now
) {
2360 VNC_DEBUG("Password is expired");
2364 memcpy(response
, vs
->challenge
, VNC_AUTH_CHALLENGE_SIZE
);
2366 /* Calculate the expected challenge response */
2367 pwlen
= strlen(vs
->vd
->password
);
2368 for (i
=0; i
<sizeof(key
); i
++)
2369 key
[i
] = i
<pwlen
? vs
->vd
->password
[i
] : 0;
2371 for (j
= 0; j
< VNC_AUTH_CHALLENGE_SIZE
; j
+= 8)
2372 des(response
+j
, response
+j
);
2374 /* Compare expected vs actual challenge response */
2375 if (memcmp(response
, data
, VNC_AUTH_CHALLENGE_SIZE
) != 0) {
2376 VNC_DEBUG("Client challenge response did not match\n");
2379 VNC_DEBUG("Accepting VNC challenge response\n");
2380 vnc_write_u32(vs
, 0); /* Accept auth */
2383 start_client_init(vs
);
2388 vnc_write_u32(vs
, 1); /* Reject auth */
2389 if (vs
->minor
>= 8) {
2390 static const char err
[] = "Authentication failed";
2391 vnc_write_u32(vs
, sizeof(err
));
2392 vnc_write(vs
, err
, sizeof(err
));
2395 vnc_client_error(vs
);
2399 void start_auth_vnc(VncState
*vs
)
2402 /* Send client a 'random' challenge */
2403 vnc_write(vs
, vs
->challenge
, sizeof(vs
->challenge
));
2406 vnc_read_when(vs
, protocol_client_auth_vnc
, sizeof(vs
->challenge
));
2410 static int protocol_client_auth(VncState
*vs
, uint8_t *data
, size_t len
)
2412 /* We only advertise 1 auth scheme at a time, so client
2413 * must pick the one we sent. Verify this */
2414 if (data
[0] != vs
->auth
) { /* Reject auth */
2415 VNC_DEBUG("Reject auth %d because it didn't match advertized\n", (int)data
[0]);
2416 vnc_write_u32(vs
, 1);
2417 if (vs
->minor
>= 8) {
2418 static const char err
[] = "Authentication failed";
2419 vnc_write_u32(vs
, sizeof(err
));
2420 vnc_write(vs
, err
, sizeof(err
));
2422 vnc_client_error(vs
);
2423 } else { /* Accept requested auth */
2424 VNC_DEBUG("Client requested auth %d\n", (int)data
[0]);
2427 VNC_DEBUG("Accept auth none\n");
2428 if (vs
->minor
>= 8) {
2429 vnc_write_u32(vs
, 0); /* Accept auth completion */
2432 start_client_init(vs
);
2436 VNC_DEBUG("Start VNC auth\n");
2440 #ifdef CONFIG_VNC_TLS
2441 case VNC_AUTH_VENCRYPT
:
2442 VNC_DEBUG("Accept VeNCrypt auth\n");
2443 start_auth_vencrypt(vs
);
2445 #endif /* CONFIG_VNC_TLS */
2447 #ifdef CONFIG_VNC_SASL
2449 VNC_DEBUG("Accept SASL auth\n");
2450 start_auth_sasl(vs
);
2452 #endif /* CONFIG_VNC_SASL */
2454 default: /* Should not be possible, but just in case */
2455 VNC_DEBUG("Reject auth %d server code bug\n", vs
->auth
);
2456 vnc_write_u8(vs
, 1);
2457 if (vs
->minor
>= 8) {
2458 static const char err
[] = "Authentication failed";
2459 vnc_write_u32(vs
, sizeof(err
));
2460 vnc_write(vs
, err
, sizeof(err
));
2462 vnc_client_error(vs
);
2468 static int protocol_version(VncState
*vs
, uint8_t *version
, size_t len
)
2472 memcpy(local
, version
, 12);
2475 if (sscanf(local
, "RFB %03d.%03d\n", &vs
->major
, &vs
->minor
) != 2) {
2476 VNC_DEBUG("Malformed protocol version %s\n", local
);
2477 vnc_client_error(vs
);
2480 VNC_DEBUG("Client request protocol version %d.%d\n", vs
->major
, vs
->minor
);
2481 if (vs
->major
!= 3 ||
2487 VNC_DEBUG("Unsupported client version\n");
2488 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2490 vnc_client_error(vs
);
2493 /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2494 * as equivalent to v3.3 by servers
2496 if (vs
->minor
== 4 || vs
->minor
== 5)
2499 if (vs
->minor
== 3) {
2500 if (vs
->auth
== VNC_AUTH_NONE
) {
2501 VNC_DEBUG("Tell client auth none\n");
2502 vnc_write_u32(vs
, vs
->auth
);
2504 start_client_init(vs
);
2505 } else if (vs
->auth
== VNC_AUTH_VNC
) {
2506 VNC_DEBUG("Tell client VNC auth\n");
2507 vnc_write_u32(vs
, vs
->auth
);
2511 VNC_DEBUG("Unsupported auth %d for protocol 3.3\n", vs
->auth
);
2512 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2514 vnc_client_error(vs
);
2517 VNC_DEBUG("Telling client we support auth %d\n", vs
->auth
);
2518 vnc_write_u8(vs
, 1); /* num auth */
2519 vnc_write_u8(vs
, vs
->auth
);
2520 vnc_read_when(vs
, protocol_client_auth
, 1);
2527 static VncRectStat
*vnc_stat_rect(VncDisplay
*vd
, int x
, int y
)
2529 struct VncSurface
*vs
= &vd
->guest
;
2531 return &vs
->stats
[y
/ VNC_STAT_RECT
][x
/ VNC_STAT_RECT
];
2534 void vnc_sent_lossy_rect(VncState
*vs
, int x
, int y
, int w
, int h
)
2538 w
= (x
+ w
) / VNC_STAT_RECT
;
2539 h
= (y
+ h
) / VNC_STAT_RECT
;
2543 for (j
= y
; j
<= h
; j
++) {
2544 for (i
= x
; i
<= w
; i
++) {
2545 vs
->lossy_rect
[j
][i
] = 1;
2550 static int vnc_refresh_lossy_rect(VncDisplay
*vd
, int x
, int y
)
2553 int sty
= y
/ VNC_STAT_RECT
;
2554 int stx
= x
/ VNC_STAT_RECT
;
2557 y
= y
/ VNC_STAT_RECT
* VNC_STAT_RECT
;
2558 x
= x
/ VNC_STAT_RECT
* VNC_STAT_RECT
;
2560 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
2563 /* kernel send buffers are full -> refresh later */
2564 if (vs
->output
.offset
) {
2568 if (!vs
->lossy_rect
[sty
][stx
]) {
2572 vs
->lossy_rect
[sty
][stx
] = 0;
2573 for (j
= 0; j
< VNC_STAT_RECT
; ++j
) {
2574 bitmap_set(vs
->dirty
[y
+ j
],
2575 x
/ VNC_DIRTY_PIXELS_PER_BIT
,
2576 VNC_STAT_RECT
/ VNC_DIRTY_PIXELS_PER_BIT
);
2584 static int vnc_update_stats(VncDisplay
*vd
, struct timeval
* tv
)
2586 int width
= pixman_image_get_width(vd
->guest
.fb
);
2587 int height
= pixman_image_get_height(vd
->guest
.fb
);
2592 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2593 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2594 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2596 rect
->updated
= false;
2600 qemu_timersub(tv
, &VNC_REFRESH_STATS
, &res
);
2602 if (timercmp(&vd
->guest
.last_freq_check
, &res
, >)) {
2605 vd
->guest
.last_freq_check
= *tv
;
2607 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2608 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2609 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2610 int count
= ARRAY_SIZE(rect
->times
);
2611 struct timeval min
, max
;
2613 if (!timerisset(&rect
->times
[count
- 1])) {
2617 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2618 qemu_timersub(tv
, &max
, &res
);
2620 if (timercmp(&res
, &VNC_REFRESH_LOSSY
, >)) {
2622 has_dirty
+= vnc_refresh_lossy_rect(vd
, x
, y
);
2623 memset(rect
->times
, 0, sizeof (rect
->times
));
2627 min
= rect
->times
[rect
->idx
];
2628 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2629 qemu_timersub(&max
, &min
, &res
);
2631 rect
->freq
= res
.tv_sec
+ res
.tv_usec
/ 1000000.;
2632 rect
->freq
/= count
;
2633 rect
->freq
= 1. / rect
->freq
;
2639 double vnc_update_freq(VncState
*vs
, int x
, int y
, int w
, int h
)
2645 x
= (x
/ VNC_STAT_RECT
) * VNC_STAT_RECT
;
2646 y
= (y
/ VNC_STAT_RECT
) * VNC_STAT_RECT
;
2648 for (j
= y
; j
<= y
+ h
; j
+= VNC_STAT_RECT
) {
2649 for (i
= x
; i
<= x
+ w
; i
+= VNC_STAT_RECT
) {
2650 total
+= vnc_stat_rect(vs
->vd
, i
, j
)->freq
;
2662 static void vnc_rect_updated(VncDisplay
*vd
, int x
, int y
, struct timeval
* tv
)
2666 rect
= vnc_stat_rect(vd
, x
, y
);
2667 if (rect
->updated
) {
2670 rect
->times
[rect
->idx
] = *tv
;
2671 rect
->idx
= (rect
->idx
+ 1) % ARRAY_SIZE(rect
->times
);
2672 rect
->updated
= true;
2675 static int vnc_refresh_server_surface(VncDisplay
*vd
)
2677 int width
= pixman_image_get_width(vd
->guest
.fb
);
2678 int height
= pixman_image_get_height(vd
->guest
.fb
);
2680 uint8_t *guest_row0
= NULL
, *server_row0
;
2681 int guest_stride
= 0, server_stride
;
2685 pixman_image_t
*tmpbuf
= NULL
;
2687 struct timeval tv
= { 0, 0 };
2689 if (!vd
->non_adaptive
) {
2690 gettimeofday(&tv
, NULL
);
2691 has_dirty
= vnc_update_stats(vd
, &tv
);
2695 * Walk through the guest dirty map.
2696 * Check and copy modified bits from guest to server surface.
2697 * Update server dirty map.
2699 cmp_bytes
= VNC_DIRTY_PIXELS_PER_BIT
* VNC_SERVER_FB_BYTES
;
2700 if (cmp_bytes
> vnc_server_fb_stride(vd
)) {
2701 cmp_bytes
= vnc_server_fb_stride(vd
);
2703 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2704 int width
= pixman_image_get_width(vd
->server
);
2705 tmpbuf
= qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT
, width
);
2707 guest_row0
= (uint8_t *)pixman_image_get_data(vd
->guest
.fb
);
2708 guest_stride
= pixman_image_get_stride(vd
->guest
.fb
);
2710 server_row0
= (uint8_t *)pixman_image_get_data(vd
->server
);
2711 server_stride
= pixman_image_get_stride(vd
->server
);
2716 uint8_t *guest_ptr
, *server_ptr
;
2717 unsigned long offset
= find_next_bit((unsigned long *) &vd
->guest
.dirty
,
2718 height
* VNC_DIRTY_BPL(&vd
->guest
),
2719 y
* VNC_DIRTY_BPL(&vd
->guest
));
2720 if (offset
== height
* VNC_DIRTY_BPL(&vd
->guest
)) {
2721 /* no more dirty bits */
2724 y
= offset
/ VNC_DIRTY_BPL(&vd
->guest
);
2725 x
= offset
% VNC_DIRTY_BPL(&vd
->guest
);
2727 server_ptr
= server_row0
+ y
* server_stride
+ x
* cmp_bytes
;
2729 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2730 qemu_pixman_linebuf_fill(tmpbuf
, vd
->guest
.fb
, width
, 0, y
);
2731 guest_ptr
= (uint8_t *)pixman_image_get_data(tmpbuf
);
2733 guest_ptr
= guest_row0
+ y
* guest_stride
;
2735 guest_ptr
+= x
* cmp_bytes
;
2737 for (; x
< DIV_ROUND_UP(width
, VNC_DIRTY_PIXELS_PER_BIT
);
2738 x
++, guest_ptr
+= cmp_bytes
, server_ptr
+= cmp_bytes
) {
2739 if (!test_and_clear_bit(x
, vd
->guest
.dirty
[y
])) {
2742 if (memcmp(server_ptr
, guest_ptr
, cmp_bytes
) == 0) {
2745 memcpy(server_ptr
, guest_ptr
, cmp_bytes
);
2746 if (!vd
->non_adaptive
) {
2747 vnc_rect_updated(vd
, x
* VNC_DIRTY_PIXELS_PER_BIT
,
2750 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
2751 set_bit(x
, vs
->dirty
[y
]);
2758 qemu_pixman_image_unref(tmpbuf
);
2762 static void vnc_refresh(DisplayChangeListener
*dcl
)
2764 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
2766 int has_dirty
, rects
= 0;
2768 graphic_hw_update(NULL
);
2770 if (vnc_trylock_display(vd
)) {
2771 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2775 has_dirty
= vnc_refresh_server_surface(vd
);
2776 vnc_unlock_display(vd
);
2778 QTAILQ_FOREACH_SAFE(vs
, &vd
->clients
, next
, vn
) {
2779 rects
+= vnc_update_client(vs
, has_dirty
, false);
2780 /* vs might be free()ed here */
2783 if (QTAILQ_EMPTY(&vd
->clients
)) {
2784 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_MAX
);
2788 if (has_dirty
&& rects
) {
2789 vd
->dcl
.update_interval
/= 2;
2790 if (vd
->dcl
.update_interval
< VNC_REFRESH_INTERVAL_BASE
) {
2791 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_BASE
;
2794 vd
->dcl
.update_interval
+= VNC_REFRESH_INTERVAL_INC
;
2795 if (vd
->dcl
.update_interval
> VNC_REFRESH_INTERVAL_MAX
) {
2796 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_MAX
;
2801 static void vnc_connect(VncDisplay
*vd
, int csock
,
2802 bool skipauth
, bool websocket
)
2804 VncState
*vs
= g_malloc0(sizeof(VncState
));
2810 vs
->auth
= VNC_AUTH_NONE
;
2811 #ifdef CONFIG_VNC_TLS
2812 vs
->subauth
= VNC_AUTH_INVALID
;
2815 vs
->auth
= vd
->auth
;
2816 #ifdef CONFIG_VNC_TLS
2817 vs
->subauth
= vd
->subauth
;
2821 vs
->lossy_rect
= g_malloc0(VNC_STAT_ROWS
* sizeof (*vs
->lossy_rect
));
2822 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
2823 vs
->lossy_rect
[i
] = g_malloc0(VNC_STAT_COLS
* sizeof (uint8_t));
2826 VNC_DEBUG("New client on socket %d\n", csock
);
2827 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2828 qemu_set_nonblock(vs
->csock
);
2829 #ifdef CONFIG_VNC_WS
2832 #ifdef CONFIG_VNC_TLS
2833 if (vd
->tls
.x509cert
) {
2834 qemu_set_fd_handler2(vs
->csock
, NULL
, vncws_tls_handshake_peek
,
2837 #endif /* CONFIG_VNC_TLS */
2839 qemu_set_fd_handler2(vs
->csock
, NULL
, vncws_handshake_read
,
2843 #endif /* CONFIG_VNC_WS */
2845 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
2848 vnc_client_cache_addr(vs
);
2849 vnc_qmp_event(vs
, QEVENT_VNC_CONNECTED
);
2850 vnc_set_share_mode(vs
, VNC_SHARE_MODE_CONNECTING
);
2854 #ifdef CONFIG_VNC_WS
2862 void vnc_init_state(VncState
*vs
)
2864 vs
->initialized
= true;
2865 VncDisplay
*vd
= vs
->vd
;
2870 vs
->as
.freq
= 44100;
2871 vs
->as
.nchannels
= 2;
2872 vs
->as
.fmt
= AUD_FMT_S16
;
2873 vs
->as
.endianness
= 0;
2875 qemu_mutex_init(&vs
->output_mutex
);
2876 vs
->bh
= qemu_bh_new(vnc_jobs_bh
, vs
);
2878 QTAILQ_INSERT_HEAD(&vd
->clients
, vs
, next
);
2880 graphic_hw_update(NULL
);
2882 vnc_write(vs
, "RFB 003.008\n", 12);
2884 vnc_read_when(vs
, protocol_version
, 12);
2886 if (vs
->vd
->lock_key_sync
)
2887 vs
->led
= qemu_add_led_event_handler(kbd_leds
, vs
);
2889 vs
->mouse_mode_notifier
.notify
= check_pointer_type_change
;
2890 qemu_add_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
2892 /* vs might be free()ed here */
2895 static void vnc_listen_read(void *opaque
, bool websocket
)
2897 VncDisplay
*vs
= opaque
;
2898 struct sockaddr_in addr
;
2899 socklen_t addrlen
= sizeof(addr
);
2903 graphic_hw_update(NULL
);
2904 #ifdef CONFIG_VNC_WS
2906 csock
= qemu_accept(vs
->lwebsock
, (struct sockaddr
*)&addr
, &addrlen
);
2908 #endif /* CONFIG_VNC_WS */
2910 csock
= qemu_accept(vs
->lsock
, (struct sockaddr
*)&addr
, &addrlen
);
2914 vnc_connect(vs
, csock
, false, websocket
);
2918 static void vnc_listen_regular_read(void *opaque
)
2920 vnc_listen_read(opaque
, false);
2923 #ifdef CONFIG_VNC_WS
2924 static void vnc_listen_websocket_read(void *opaque
)
2926 vnc_listen_read(opaque
, true);
2928 #endif /* CONFIG_VNC_WS */
2930 static const DisplayChangeListenerOps dcl_ops
= {
2932 .dpy_refresh
= vnc_refresh
,
2933 .dpy_gfx_copy
= vnc_dpy_copy
,
2934 .dpy_gfx_update
= vnc_dpy_update
,
2935 .dpy_gfx_switch
= vnc_dpy_switch
,
2936 .dpy_mouse_set
= vnc_mouse_set
,
2937 .dpy_cursor_define
= vnc_dpy_cursor_define
,
2940 void vnc_display_init(DisplayState
*ds
)
2942 VncDisplay
*vs
= g_malloc0(sizeof(*vs
));
2947 #ifdef CONFIG_VNC_WS
2951 QTAILQ_INIT(&vs
->clients
);
2952 vs
->expires
= TIME_MAX
;
2954 if (keyboard_layout
) {
2955 trace_vnc_key_map_init(keyboard_layout
);
2956 vs
->kbd_layout
= init_keyboard_layout(name2keysym
, keyboard_layout
);
2958 vs
->kbd_layout
= init_keyboard_layout(name2keysym
, "en-us");
2961 if (!vs
->kbd_layout
)
2964 qemu_mutex_init(&vs
->mutex
);
2965 vnc_start_worker_thread();
2967 vs
->dcl
.ops
= &dcl_ops
;
2968 register_displaychangelistener(&vs
->dcl
);
2972 static void vnc_display_close(DisplayState
*ds
)
2974 VncDisplay
*vs
= vnc_display
;
2978 g_free(vs
->display
);
2980 if (vs
->lsock
!= -1) {
2981 qemu_set_fd_handler2(vs
->lsock
, NULL
, NULL
, NULL
, NULL
);
2985 #ifdef CONFIG_VNC_WS
2986 g_free(vs
->ws_display
);
2987 vs
->ws_display
= NULL
;
2988 if (vs
->lwebsock
!= -1) {
2989 qemu_set_fd_handler2(vs
->lwebsock
, NULL
, NULL
, NULL
, NULL
);
2990 close(vs
->lwebsock
);
2993 #endif /* CONFIG_VNC_WS */
2994 vs
->auth
= VNC_AUTH_INVALID
;
2995 #ifdef CONFIG_VNC_TLS
2996 vs
->subauth
= VNC_AUTH_INVALID
;
2997 vs
->tls
.x509verify
= 0;
3001 int vnc_display_password(DisplayState
*ds
, const char *password
)
3003 VncDisplay
*vs
= vnc_display
;
3008 if (vs
->auth
== VNC_AUTH_NONE
) {
3009 error_printf_unless_qmp("If you want use passwords please enable "
3010 "password auth using '-vnc ${dpy},password'.");
3014 g_free(vs
->password
);
3015 vs
->password
= g_strdup(password
);
3020 int vnc_display_pw_expire(DisplayState
*ds
, time_t expires
)
3022 VncDisplay
*vs
= vnc_display
;
3028 vs
->expires
= expires
;
3032 char *vnc_display_local_addr(DisplayState
*ds
)
3034 VncDisplay
*vs
= vnc_display
;
3036 return vnc_socket_local_addr("%s:%s", vs
->lsock
);
3039 void vnc_display_open(DisplayState
*ds
, const char *display
, Error
**errp
)
3041 VncDisplay
*vs
= vnc_display
;
3042 const char *options
;
3045 #ifdef CONFIG_VNC_TLS
3046 int tls
= 0, x509
= 0;
3048 #ifdef CONFIG_VNC_SASL
3052 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
3055 int lock_key_sync
= 1;
3058 error_setg(errp
, "VNC display not active");
3061 vnc_display_close(ds
);
3062 if (strcmp(display
, "none") == 0)
3065 vs
->display
= g_strdup(display
);
3066 vs
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3069 while ((options
= strchr(options
, ','))) {
3071 if (strncmp(options
, "password", 8) == 0) {
3072 if (fips_get_state()) {
3074 "VNC password auth disabled due to FIPS mode, "
3075 "consider using the VeNCrypt or SASL authentication "
3076 "methods as an alternative");
3079 password
= 1; /* Require password auth */
3080 } else if (strncmp(options
, "reverse", 7) == 0) {
3082 } else if (strncmp(options
, "no-lock-key-sync", 16) == 0) {
3084 #ifdef CONFIG_VNC_SASL
3085 } else if (strncmp(options
, "sasl", 4) == 0) {
3086 sasl
= 1; /* Require SASL auth */
3088 #ifdef CONFIG_VNC_WS
3089 } else if (strncmp(options
, "websocket", 9) == 0) {
3093 /* Check for 'websocket=<port>' */
3094 start
= strchr(options
, '=');
3095 end
= strchr(options
, ',');
3096 if (start
&& (!end
|| (start
< end
))) {
3097 int len
= end
? end
-(start
+1) : strlen(start
+1);
3099 /* extract the host specification from display */
3100 char *host
= NULL
, *port
= NULL
, *host_end
= NULL
;
3101 port
= g_strndup(start
+ 1, len
);
3103 /* ipv6 hosts have colons */
3104 end
= strchr(display
, ',');
3105 host_end
= g_strrstr_len(display
, end
- display
, ":");
3108 host
= g_strndup(display
, host_end
- display
+ 1);
3110 host
= g_strndup(":", 1);
3112 vs
->ws_display
= g_strconcat(host
, port
, NULL
);
3117 #endif /* CONFIG_VNC_WS */
3118 #ifdef CONFIG_VNC_TLS
3119 } else if (strncmp(options
, "tls", 3) == 0) {
3120 tls
= 1; /* Require TLS */
3121 } else if (strncmp(options
, "x509", 4) == 0) {
3123 x509
= 1; /* Require x509 certificates */
3124 if (strncmp(options
, "x509verify", 10) == 0)
3125 vs
->tls
.x509verify
= 1; /* ...and verify client certs */
3127 /* Now check for 'x509=/some/path' postfix
3128 * and use that to setup x509 certificate/key paths */
3129 start
= strchr(options
, '=');
3130 end
= strchr(options
, ',');
3131 if (start
&& (!end
|| (start
< end
))) {
3132 int len
= end
? end
-(start
+1) : strlen(start
+1);
3133 char *path
= g_strndup(start
+ 1, len
);
3135 VNC_DEBUG("Trying certificate path '%s'\n", path
);
3136 if (vnc_tls_set_x509_creds_dir(vs
, path
) < 0) {
3137 error_setg(errp
, "Failed to find x509 certificates/keys in %s", path
);
3143 error_setg(errp
, "No certificate path provided");
3147 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
3148 } else if (strncmp(options
, "acl", 3) == 0) {
3151 } else if (strncmp(options
, "lossy", 5) == 0) {
3152 #ifdef CONFIG_VNC_JPEG
3155 } else if (strncmp(options
, "non-adaptive", 12) == 0) {
3156 vs
->non_adaptive
= true;
3157 } else if (strncmp(options
, "share=", 6) == 0) {
3158 if (strncmp(options
+6, "ignore", 6) == 0) {
3159 vs
->share_policy
= VNC_SHARE_POLICY_IGNORE
;
3160 } else if (strncmp(options
+6, "allow-exclusive", 15) == 0) {
3161 vs
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3162 } else if (strncmp(options
+6, "force-shared", 12) == 0) {
3163 vs
->share_policy
= VNC_SHARE_POLICY_FORCE_SHARED
;
3165 error_setg(errp
, "unknown vnc share= option");
3171 /* adaptive updates are only used with tight encoding and
3172 * if lossy updates are enabled so we can disable all the
3173 * calculations otherwise */
3175 vs
->non_adaptive
= true;
3178 #ifdef CONFIG_VNC_TLS
3179 if (acl
&& x509
&& vs
->tls
.x509verify
) {
3180 if (!(vs
->tls
.acl
= qemu_acl_init("vnc.x509dname"))) {
3181 fprintf(stderr
, "Failed to create x509 dname ACL\n");
3186 #ifdef CONFIG_VNC_SASL
3188 if (!(vs
->sasl
.acl
= qemu_acl_init("vnc.username"))) {
3189 fprintf(stderr
, "Failed to create username ACL\n");
3196 * Combinations we support here:
3198 * - no-auth (clear text, no auth)
3199 * - password (clear text, weak auth)
3200 * - sasl (encrypt, good auth *IF* using Kerberos via GSSAPI)
3201 * - tls (encrypt, weak anonymous creds, no auth)
3202 * - tls + password (encrypt, weak anonymous creds, weak auth)
3203 * - tls + sasl (encrypt, weak anonymous creds, good auth)
3204 * - tls + x509 (encrypt, good x509 creds, no auth)
3205 * - tls + x509 + password (encrypt, good x509 creds, weak auth)
3206 * - tls + x509 + sasl (encrypt, good x509 creds, good auth)
3208 * NB1. TLS is a stackable auth scheme.
3209 * NB2. the x509 schemes have option to validate a client cert dname
3212 #ifdef CONFIG_VNC_TLS
3214 vs
->auth
= VNC_AUTH_VENCRYPT
;
3216 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3217 vs
->subauth
= VNC_AUTH_VENCRYPT_X509VNC
;
3219 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3220 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSVNC
;
3223 #endif /* CONFIG_VNC_TLS */
3224 VNC_DEBUG("Initializing VNC server with password auth\n");
3225 vs
->auth
= VNC_AUTH_VNC
;
3226 #ifdef CONFIG_VNC_TLS
3227 vs
->subauth
= VNC_AUTH_INVALID
;
3229 #endif /* CONFIG_VNC_TLS */
3230 #ifdef CONFIG_VNC_SASL
3232 #ifdef CONFIG_VNC_TLS
3234 vs
->auth
= VNC_AUTH_VENCRYPT
;
3236 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3237 vs
->subauth
= VNC_AUTH_VENCRYPT_X509SASL
;
3239 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3240 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSSASL
;
3243 #endif /* CONFIG_VNC_TLS */
3244 VNC_DEBUG("Initializing VNC server with SASL auth\n");
3245 vs
->auth
= VNC_AUTH_SASL
;
3246 #ifdef CONFIG_VNC_TLS
3247 vs
->subauth
= VNC_AUTH_INVALID
;
3249 #endif /* CONFIG_VNC_TLS */
3250 #endif /* CONFIG_VNC_SASL */
3252 #ifdef CONFIG_VNC_TLS
3254 vs
->auth
= VNC_AUTH_VENCRYPT
;
3256 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3257 vs
->subauth
= VNC_AUTH_VENCRYPT_X509NONE
;
3259 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3260 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSNONE
;
3264 VNC_DEBUG("Initializing VNC server with no auth\n");
3265 vs
->auth
= VNC_AUTH_NONE
;
3266 #ifdef CONFIG_VNC_TLS
3267 vs
->subauth
= VNC_AUTH_INVALID
;
3272 #ifdef CONFIG_VNC_SASL
3273 if ((saslErr
= sasl_server_init(NULL
, "qemu")) != SASL_OK
) {
3274 error_setg(errp
, "Failed to initialize SASL auth: %s",
3275 sasl_errstring(saslErr
, NULL
, NULL
));
3279 vs
->lock_key_sync
= lock_key_sync
;
3282 /* connect to viewer */
3285 #ifdef CONFIG_VNC_WS
3288 if (strncmp(display
, "unix:", 5) == 0) {
3289 csock
= unix_connect(display
+5, errp
);
3291 csock
= inet_connect(display
, errp
);
3296 vnc_connect(vs
, csock
, false, false);
3298 /* listen for connects */
3300 dpy
= g_malloc(256);
3301 if (strncmp(display
, "unix:", 5) == 0) {
3302 pstrcpy(dpy
, 256, "unix:");
3303 vs
->lsock
= unix_listen(display
+5, dpy
+5, 256-5, errp
);
3305 vs
->lsock
= inet_listen(display
, dpy
, 256,
3306 SOCK_STREAM
, 5900, errp
);
3307 if (vs
->lsock
< 0) {
3311 #ifdef CONFIG_VNC_WS
3312 if (vs
->websocket
) {
3313 if (vs
->ws_display
) {
3314 vs
->lwebsock
= inet_listen(vs
->ws_display
, NULL
, 256,
3315 SOCK_STREAM
, 0, errp
);
3317 vs
->lwebsock
= inet_listen(vs
->display
, NULL
, 256,
3318 SOCK_STREAM
, 5700, errp
);
3321 if (vs
->lwebsock
< 0) {
3330 #endif /* CONFIG_VNC_WS */
3332 g_free(vs
->display
);
3334 qemu_set_fd_handler2(vs
->lsock
, NULL
,
3335 vnc_listen_regular_read
, NULL
, vs
);
3336 #ifdef CONFIG_VNC_WS
3337 if (vs
->websocket
) {
3338 qemu_set_fd_handler2(vs
->lwebsock
, NULL
,
3339 vnc_listen_websocket_read
, NULL
, vs
);
3341 #endif /* CONFIG_VNC_WS */
3346 g_free(vs
->display
);
3348 #ifdef CONFIG_VNC_WS
3349 g_free(vs
->ws_display
);
3350 vs
->ws_display
= NULL
;
3351 #endif /* CONFIG_VNC_WS */
3354 void vnc_display_add_client(DisplayState
*ds
, int csock
, bool skipauth
)
3356 VncDisplay
*vs
= vnc_display
;
3358 vnc_connect(vs
, csock
, skipauth
, false);