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
29 #include "sysemu/sysemu.h"
30 #include "qemu/sockets.h"
31 #include "qemu/timer.h"
33 #include "qapi/qmp/types.h"
34 #include "qmp-commands.h"
35 #include "qemu/osdep.h"
38 #define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
39 #define VNC_REFRESH_INTERVAL_INC 50
40 #define VNC_REFRESH_INTERVAL_MAX GUI_REFRESH_INTERVAL_IDLE
41 static const struct timeval VNC_REFRESH_STATS
= { 0, 500000 };
42 static const struct timeval VNC_REFRESH_LOSSY
= { 2, 0 };
44 #include "vnc_keysym.h"
47 static VncDisplay
*vnc_display
; /* needed for info vnc */
49 static int vnc_cursor_define(VncState
*vs
);
50 static void vnc_release_modifiers(VncState
*vs
);
52 static void vnc_set_share_mode(VncState
*vs
, VncShareMode mode
)
55 static const char *mn
[] = {
57 [VNC_SHARE_MODE_CONNECTING
] = "connecting",
58 [VNC_SHARE_MODE_SHARED
] = "shared",
59 [VNC_SHARE_MODE_EXCLUSIVE
] = "exclusive",
60 [VNC_SHARE_MODE_DISCONNECTED
] = "disconnected",
62 fprintf(stderr
, "%s/%d: %s -> %s\n", __func__
,
63 vs
->csock
, mn
[vs
->share_mode
], mn
[mode
]);
66 if (vs
->share_mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
67 vs
->vd
->num_exclusive
--;
69 vs
->share_mode
= mode
;
70 if (vs
->share_mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
71 vs
->vd
->num_exclusive
++;
75 static char *addr_to_string(const char *format
,
76 struct sockaddr_storage
*sa
,
79 char host
[NI_MAXHOST
];
80 char serv
[NI_MAXSERV
];
84 if ((err
= getnameinfo((struct sockaddr
*)sa
, salen
,
87 NI_NUMERICHOST
| NI_NUMERICSERV
)) != 0) {
88 VNC_DEBUG("Cannot resolve address %d: %s\n",
89 err
, gai_strerror(err
));
93 /* Enough for the existing format + the 2 vars we're
95 addrlen
= strlen(format
) + strlen(host
) + strlen(serv
);
96 addr
= g_malloc(addrlen
+ 1);
97 snprintf(addr
, addrlen
, format
, host
, serv
);
104 char *vnc_socket_local_addr(const char *format
, int fd
) {
105 struct sockaddr_storage sa
;
109 if (getsockname(fd
, (struct sockaddr
*)&sa
, &salen
) < 0)
112 return addr_to_string(format
, &sa
, salen
);
115 char *vnc_socket_remote_addr(const char *format
, int fd
) {
116 struct sockaddr_storage sa
;
120 if (getpeername(fd
, (struct sockaddr
*)&sa
, &salen
) < 0)
123 return addr_to_string(format
, &sa
, salen
);
126 static int put_addr_qdict(QDict
*qdict
, struct sockaddr_storage
*sa
,
129 char host
[NI_MAXHOST
];
130 char serv
[NI_MAXSERV
];
133 if ((err
= getnameinfo((struct sockaddr
*)sa
, salen
,
136 NI_NUMERICHOST
| NI_NUMERICSERV
)) != 0) {
137 VNC_DEBUG("Cannot resolve address %d: %s\n",
138 err
, gai_strerror(err
));
142 qdict_put(qdict
, "host", qstring_from_str(host
));
143 qdict_put(qdict
, "service", qstring_from_str(serv
));
144 qdict_put(qdict
, "family",qstring_from_str(inet_strfamily(sa
->ss_family
)));
149 static int vnc_server_addr_put(QDict
*qdict
, int fd
)
151 struct sockaddr_storage sa
;
155 if (getsockname(fd
, (struct sockaddr
*)&sa
, &salen
) < 0) {
159 return put_addr_qdict(qdict
, &sa
, salen
);
162 static int vnc_qdict_remote_addr(QDict
*qdict
, int fd
)
164 struct sockaddr_storage sa
;
168 if (getpeername(fd
, (struct sockaddr
*)&sa
, &salen
) < 0) {
172 return put_addr_qdict(qdict
, &sa
, salen
);
175 static const char *vnc_auth_name(VncDisplay
*vd
) {
177 case VNC_AUTH_INVALID
:
193 case VNC_AUTH_VENCRYPT
:
194 #ifdef CONFIG_VNC_TLS
195 switch (vd
->subauth
) {
196 case VNC_AUTH_VENCRYPT_PLAIN
:
197 return "vencrypt+plain";
198 case VNC_AUTH_VENCRYPT_TLSNONE
:
199 return "vencrypt+tls+none";
200 case VNC_AUTH_VENCRYPT_TLSVNC
:
201 return "vencrypt+tls+vnc";
202 case VNC_AUTH_VENCRYPT_TLSPLAIN
:
203 return "vencrypt+tls+plain";
204 case VNC_AUTH_VENCRYPT_X509NONE
:
205 return "vencrypt+x509+none";
206 case VNC_AUTH_VENCRYPT_X509VNC
:
207 return "vencrypt+x509+vnc";
208 case VNC_AUTH_VENCRYPT_X509PLAIN
:
209 return "vencrypt+x509+plain";
210 case VNC_AUTH_VENCRYPT_TLSSASL
:
211 return "vencrypt+tls+sasl";
212 case VNC_AUTH_VENCRYPT_X509SASL
:
213 return "vencrypt+x509+sasl";
226 static int vnc_server_info_put(QDict
*qdict
)
228 if (vnc_server_addr_put(qdict
, vnc_display
->lsock
) < 0) {
232 qdict_put(qdict
, "auth", qstring_from_str(vnc_auth_name(vnc_display
)));
236 static void vnc_client_cache_auth(VncState
*client
)
238 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
246 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
247 qdict
= qobject_to_qdict(client
->info
);
250 #ifdef CONFIG_VNC_TLS
251 if (client
->tls
.session
&&
253 qdict_put(qdict
, "x509_dname", qstring_from_str(client
->tls
.dname
));
256 #ifdef CONFIG_VNC_SASL
257 if (client
->sasl
.conn
&&
258 client
->sasl
.username
) {
259 qdict_put(qdict
, "sasl_username",
260 qstring_from_str(client
->sasl
.username
));
265 static void vnc_client_cache_addr(VncState
*client
)
270 if (vnc_qdict_remote_addr(qdict
, client
->csock
) < 0) {
272 /* XXX: how to report the error? */
276 client
->info
= QOBJECT(qdict
);
279 static void vnc_qmp_event(VncState
*vs
, MonitorEvent event
)
288 server
= qdict_new();
289 if (vnc_server_info_put(server
) < 0) {
294 data
= qobject_from_jsonf("{ 'client': %p, 'server': %p }",
295 vs
->info
, QOBJECT(server
));
297 monitor_protocol_event(event
, data
);
299 qobject_incref(vs
->info
);
300 qobject_decref(data
);
303 static VncClientInfo
*qmp_query_vnc_client(const VncState
*client
)
305 struct sockaddr_storage sa
;
306 socklen_t salen
= sizeof(sa
);
307 char host
[NI_MAXHOST
];
308 char serv
[NI_MAXSERV
];
311 if (getpeername(client
->csock
, (struct sockaddr
*)&sa
, &salen
) < 0) {
315 if (getnameinfo((struct sockaddr
*)&sa
, salen
,
318 NI_NUMERICHOST
| NI_NUMERICSERV
) < 0) {
322 info
= g_malloc0(sizeof(*info
));
323 info
->host
= g_strdup(host
);
324 info
->service
= g_strdup(serv
);
325 info
->family
= g_strdup(inet_strfamily(sa
.ss_family
));
327 #ifdef CONFIG_VNC_TLS
328 if (client
->tls
.session
&& client
->tls
.dname
) {
329 info
->has_x509_dname
= true;
330 info
->x509_dname
= g_strdup(client
->tls
.dname
);
333 #ifdef CONFIG_VNC_SASL
334 if (client
->sasl
.conn
&& client
->sasl
.username
) {
335 info
->has_sasl_username
= true;
336 info
->sasl_username
= g_strdup(client
->sasl
.username
);
343 VncInfo
*qmp_query_vnc(Error
**errp
)
345 VncInfo
*info
= g_malloc0(sizeof(*info
));
347 if (vnc_display
== NULL
|| vnc_display
->display
== NULL
) {
348 info
->enabled
= false;
350 VncClientInfoList
*cur_item
= NULL
;
351 struct sockaddr_storage sa
;
352 socklen_t salen
= sizeof(sa
);
353 char host
[NI_MAXHOST
];
354 char serv
[NI_MAXSERV
];
357 info
->enabled
= true;
359 /* for compatibility with the original command */
360 info
->has_clients
= true;
362 QTAILQ_FOREACH(client
, &vnc_display
->clients
, next
) {
363 VncClientInfoList
*cinfo
= g_malloc0(sizeof(*info
));
364 cinfo
->value
= qmp_query_vnc_client(client
);
366 /* XXX: waiting for the qapi to support GSList */
368 info
->clients
= cur_item
= cinfo
;
370 cur_item
->next
= cinfo
;
375 if (vnc_display
->lsock
== -1) {
379 if (getsockname(vnc_display
->lsock
, (struct sockaddr
*)&sa
,
381 error_set(errp
, QERR_UNDEFINED_ERROR
);
385 if (getnameinfo((struct sockaddr
*)&sa
, salen
,
388 NI_NUMERICHOST
| NI_NUMERICSERV
) < 0) {
389 error_set(errp
, QERR_UNDEFINED_ERROR
);
393 info
->has_host
= true;
394 info
->host
= g_strdup(host
);
396 info
->has_service
= true;
397 info
->service
= g_strdup(serv
);
399 info
->has_family
= true;
400 info
->family
= g_strdup(inet_strfamily(sa
.ss_family
));
402 info
->has_auth
= true;
403 info
->auth
= g_strdup(vnc_auth_name(vnc_display
));
409 qapi_free_VncInfo(info
);
414 1) Get the queue working for IO.
415 2) there is some weirdness when using the -S option (the screen is grey
416 and not totally invalidated
417 3) resolutions > 1024
420 static int vnc_update_client(VncState
*vs
, int has_dirty
, bool sync
);
421 static void vnc_disconnect_start(VncState
*vs
);
423 static void vnc_colordepth(VncState
*vs
);
424 static void framebuffer_update_request(VncState
*vs
, int incremental
,
425 int x_position
, int y_position
,
427 static void vnc_refresh(DisplayChangeListener
*dcl
);
428 static int vnc_refresh_server_surface(VncDisplay
*vd
);
430 static void vnc_dpy_update(DisplayChangeListener
*dcl
,
431 int x
, int y
, int w
, int h
)
433 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
434 struct VncSurface
*s
= &vd
->guest
;
435 int width
= surface_width(vd
->ds
);
436 int height
= surface_height(vd
->ds
);
438 /* this is needed this to ensure we updated all affected
439 * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
440 w
+= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
441 x
-= (x
% VNC_DIRTY_PIXELS_PER_BIT
);
445 w
= MIN(x
+ w
, width
) - x
;
446 h
= MIN(y
+ h
, height
);
449 bitmap_set(s
->dirty
[y
], x
/ VNC_DIRTY_PIXELS_PER_BIT
,
450 DIV_ROUND_UP(w
, VNC_DIRTY_PIXELS_PER_BIT
));
454 void vnc_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
,
457 vnc_write_u16(vs
, x
);
458 vnc_write_u16(vs
, y
);
459 vnc_write_u16(vs
, w
);
460 vnc_write_u16(vs
, h
);
462 vnc_write_s32(vs
, encoding
);
465 void buffer_reserve(Buffer
*buffer
, size_t len
)
467 if ((buffer
->capacity
- buffer
->offset
) < len
) {
468 buffer
->capacity
+= (len
+ 1024);
469 buffer
->buffer
= g_realloc(buffer
->buffer
, buffer
->capacity
);
470 if (buffer
->buffer
== NULL
) {
471 fprintf(stderr
, "vnc: out of memory\n");
477 static int buffer_empty(Buffer
*buffer
)
479 return buffer
->offset
== 0;
482 uint8_t *buffer_end(Buffer
*buffer
)
484 return buffer
->buffer
+ buffer
->offset
;
487 void buffer_reset(Buffer
*buffer
)
492 void buffer_free(Buffer
*buffer
)
494 g_free(buffer
->buffer
);
496 buffer
->capacity
= 0;
497 buffer
->buffer
= NULL
;
500 void buffer_append(Buffer
*buffer
, const void *data
, size_t len
)
502 memcpy(buffer
->buffer
+ buffer
->offset
, data
, len
);
503 buffer
->offset
+= len
;
506 void buffer_advance(Buffer
*buf
, size_t len
)
508 memmove(buf
->buffer
, buf
->buffer
+ len
,
509 (buf
->offset
- len
));
513 static void vnc_desktop_resize(VncState
*vs
)
515 DisplaySurface
*ds
= vs
->vd
->ds
;
517 if (vs
->csock
== -1 || !vnc_has_feature(vs
, VNC_FEATURE_RESIZE
)) {
520 if (vs
->client_width
== surface_width(ds
) &&
521 vs
->client_height
== surface_height(ds
)) {
524 vs
->client_width
= surface_width(ds
);
525 vs
->client_height
= surface_height(ds
);
527 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
529 vnc_write_u16(vs
, 1); /* number of rects */
530 vnc_framebuffer_update(vs
, 0, 0, vs
->client_width
, vs
->client_height
,
531 VNC_ENCODING_DESKTOPRESIZE
);
532 vnc_unlock_output(vs
);
536 static void vnc_abort_display_jobs(VncDisplay
*vd
)
540 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
543 vnc_unlock_output(vs
);
545 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
548 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
551 vnc_unlock_output(vs
);
555 int vnc_server_fb_stride(VncDisplay
*vd
)
557 return pixman_image_get_stride(vd
->server
);
560 void *vnc_server_fb_ptr(VncDisplay
*vd
, int x
, int y
)
564 ptr
= (uint8_t *)pixman_image_get_data(vd
->server
);
565 ptr
+= y
* vnc_server_fb_stride(vd
);
566 ptr
+= x
* VNC_SERVER_FB_BYTES
;
569 /* this sets only the visible pixels of a dirty bitmap */
570 #define VNC_SET_VISIBLE_PIXELS_DIRTY(bitmap, w, h) {\
572 memset(bitmap, 0x00, sizeof(bitmap));\
573 for (y = 0; y < h; y++) {\
574 bitmap_set(bitmap[y], 0,\
575 DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));\
579 static void vnc_dpy_switch(DisplayChangeListener
*dcl
,
580 DisplaySurface
*surface
)
582 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
585 vnc_abort_display_jobs(vd
);
588 qemu_pixman_image_unref(vd
->server
);
590 vd
->server
= pixman_image_create_bits(VNC_SERVER_FB_FORMAT
,
591 surface_width(vd
->ds
),
592 surface_height(vd
->ds
),
597 if (ds_get_bytes_per_pixel(ds
) != vd
->guest
.ds
->pf
.bytes_per_pixel
)
598 console_color_init(ds
);
600 qemu_pixman_image_unref(vd
->guest
.fb
);
601 vd
->guest
.fb
= pixman_image_ref(surface
->image
);
602 vd
->guest
.format
= surface
->format
;
603 VNC_SET_VISIBLE_PIXELS_DIRTY(vd
->guest
.dirty
,
604 surface_width(vd
->ds
),
605 surface_height(vd
->ds
));
607 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
609 vnc_desktop_resize(vs
);
610 if (vs
->vd
->cursor
) {
611 vnc_cursor_define(vs
);
613 VNC_SET_VISIBLE_PIXELS_DIRTY(vs
->dirty
,
614 surface_width(vd
->ds
),
615 surface_height(vd
->ds
));
620 static void vnc_write_pixels_copy(VncState
*vs
,
621 void *pixels
, int size
)
623 vnc_write(vs
, pixels
, size
);
626 /* slowest but generic code. */
627 void vnc_convert_pixel(VncState
*vs
, uint8_t *buf
, uint32_t v
)
631 #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
632 r
= (((v
& 0x00ff0000) >> 16) << vs
->client_pf
.rbits
) >> 8;
633 g
= (((v
& 0x0000ff00) >> 8) << vs
->client_pf
.gbits
) >> 8;
634 b
= (((v
& 0x000000ff) >> 0) << vs
->client_pf
.bbits
) >> 8;
636 # error need some bits here if you change VNC_SERVER_FB_FORMAT
638 v
= (r
<< vs
->client_pf
.rshift
) |
639 (g
<< vs
->client_pf
.gshift
) |
640 (b
<< vs
->client_pf
.bshift
);
641 switch (vs
->client_pf
.bytes_per_pixel
) {
671 static void vnc_write_pixels_generic(VncState
*vs
,
672 void *pixels1
, int size
)
676 if (VNC_SERVER_FB_BYTES
== 4) {
677 uint32_t *pixels
= pixels1
;
680 for (i
= 0; i
< n
; i
++) {
681 vnc_convert_pixel(vs
, buf
, pixels
[i
]);
682 vnc_write(vs
, buf
, vs
->client_pf
.bytes_per_pixel
);
687 int vnc_raw_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
691 VncDisplay
*vd
= vs
->vd
;
693 row
= vnc_server_fb_ptr(vd
, x
, y
);
694 for (i
= 0; i
< h
; i
++) {
695 vs
->write_pixels(vs
, row
, w
* VNC_SERVER_FB_BYTES
);
696 row
+= vnc_server_fb_stride(vd
);
701 int vnc_send_framebuffer_update(VncState
*vs
, int x
, int y
, int w
, int h
)
705 switch(vs
->vnc_encoding
) {
706 case VNC_ENCODING_ZLIB
:
707 n
= vnc_zlib_send_framebuffer_update(vs
, x
, y
, w
, h
);
709 case VNC_ENCODING_HEXTILE
:
710 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_HEXTILE
);
711 n
= vnc_hextile_send_framebuffer_update(vs
, x
, y
, w
, h
);
713 case VNC_ENCODING_TIGHT
:
714 n
= vnc_tight_send_framebuffer_update(vs
, x
, y
, w
, h
);
716 case VNC_ENCODING_TIGHT_PNG
:
717 n
= vnc_tight_png_send_framebuffer_update(vs
, x
, y
, w
, h
);
719 case VNC_ENCODING_ZRLE
:
720 n
= vnc_zrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
722 case VNC_ENCODING_ZYWRLE
:
723 n
= vnc_zywrle_send_framebuffer_update(vs
, x
, y
, w
, h
);
726 vnc_framebuffer_update(vs
, x
, y
, w
, h
, VNC_ENCODING_RAW
);
727 n
= vnc_raw_send_framebuffer_update(vs
, x
, y
, w
, h
);
733 static void vnc_copy(VncState
*vs
, int src_x
, int src_y
, int dst_x
, int dst_y
, int w
, int h
)
735 /* send bitblit op to the vnc client */
737 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
739 vnc_write_u16(vs
, 1); /* number of rects */
740 vnc_framebuffer_update(vs
, dst_x
, dst_y
, w
, h
, VNC_ENCODING_COPYRECT
);
741 vnc_write_u16(vs
, src_x
);
742 vnc_write_u16(vs
, src_y
);
743 vnc_unlock_output(vs
);
747 static void vnc_dpy_copy(DisplayChangeListener
*dcl
,
748 int src_x
, int src_y
,
749 int dst_x
, int dst_y
, int w
, int h
)
751 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
755 int i
, x
, y
, pitch
, inc
, w_lim
, s
;
758 vnc_refresh_server_surface(vd
);
759 QTAILQ_FOREACH_SAFE(vs
, &vd
->clients
, next
, vn
) {
760 if (vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
761 vs
->force_update
= 1;
762 vnc_update_client(vs
, 1, true);
763 /* vs might be free()ed here */
767 /* do bitblit op on the local surface too */
768 pitch
= vnc_server_fb_stride(vd
);
769 src_row
= vnc_server_fb_ptr(vd
, src_x
, src_y
);
770 dst_row
= vnc_server_fb_ptr(vd
, dst_x
, dst_y
);
775 src_row
+= pitch
* (h
-1);
776 dst_row
+= pitch
* (h
-1);
781 w_lim
= w
- (VNC_DIRTY_PIXELS_PER_BIT
- (dst_x
% VNC_DIRTY_PIXELS_PER_BIT
));
785 w_lim
= w
- (w_lim
% VNC_DIRTY_PIXELS_PER_BIT
);
787 for (i
= 0; i
< h
; i
++) {
788 for (x
= 0; x
<= w_lim
;
789 x
+= s
, src_row
+= cmp_bytes
, dst_row
+= cmp_bytes
) {
791 if ((s
= w
- w_lim
) == 0)
794 s
= (VNC_DIRTY_PIXELS_PER_BIT
-
795 (dst_x
% VNC_DIRTY_PIXELS_PER_BIT
));
798 s
= VNC_DIRTY_PIXELS_PER_BIT
;
800 cmp_bytes
= s
* VNC_SERVER_FB_BYTES
;
801 if (memcmp(src_row
, dst_row
, cmp_bytes
) == 0)
803 memmove(dst_row
, src_row
, cmp_bytes
);
804 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
805 if (!vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
806 set_bit(((x
+ dst_x
) / VNC_DIRTY_PIXELS_PER_BIT
),
811 src_row
+= pitch
- w
* VNC_SERVER_FB_BYTES
;
812 dst_row
+= pitch
- w
* VNC_SERVER_FB_BYTES
;
816 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
817 if (vnc_has_feature(vs
, VNC_FEATURE_COPYRECT
)) {
818 vnc_copy(vs
, src_x
, src_y
, dst_x
, dst_y
, w
, h
);
823 static void vnc_mouse_set(DisplayChangeListener
*dcl
,
824 int x
, int y
, int visible
)
826 /* can we ask the client(s) to move the pointer ??? */
829 static int vnc_cursor_define(VncState
*vs
)
831 QEMUCursor
*c
= vs
->vd
->cursor
;
834 if (vnc_has_feature(vs
, VNC_FEATURE_RICH_CURSOR
)) {
836 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
837 vnc_write_u8(vs
, 0); /* padding */
838 vnc_write_u16(vs
, 1); /* # of rects */
839 vnc_framebuffer_update(vs
, c
->hot_x
, c
->hot_y
, c
->width
, c
->height
,
840 VNC_ENCODING_RICH_CURSOR
);
841 isize
= c
->width
* c
->height
* vs
->client_pf
.bytes_per_pixel
;
842 vnc_write_pixels_generic(vs
, c
->data
, isize
);
843 vnc_write(vs
, vs
->vd
->cursor_mask
, vs
->vd
->cursor_msize
);
844 vnc_unlock_output(vs
);
850 static void vnc_dpy_cursor_define(DisplayChangeListener
*dcl
,
853 VncDisplay
*vd
= vnc_display
;
856 cursor_put(vd
->cursor
);
857 g_free(vd
->cursor_mask
);
860 cursor_get(vd
->cursor
);
861 vd
->cursor_msize
= cursor_get_mono_bpl(c
) * c
->height
;
862 vd
->cursor_mask
= g_malloc0(vd
->cursor_msize
);
863 cursor_get_mono_mask(c
, 0, vd
->cursor_mask
);
865 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
866 vnc_cursor_define(vs
);
870 static int find_and_clear_dirty_height(struct VncState
*vs
,
871 int y
, int last_x
, int x
, int height
)
875 for (h
= 1; h
< (height
- y
); h
++) {
876 if (!test_bit(last_x
, vs
->dirty
[y
+ h
])) {
879 bitmap_clear(vs
->dirty
[y
+ h
], last_x
, x
- last_x
);
885 static int vnc_update_client(VncState
*vs
, int has_dirty
, bool sync
)
887 if (vs
->need_update
&& vs
->csock
!= -1) {
888 VncDisplay
*vd
= vs
->vd
;
894 if (vs
->output
.offset
&& !vs
->audio_cap
&& !vs
->force_update
)
895 /* kernel send buffers are full -> drop frames to throttle */
898 if (!has_dirty
&& !vs
->audio_cap
&& !vs
->force_update
)
902 * Send screen updates to the vnc client using the server
903 * surface and server dirty map. guest surface updates
904 * happening in parallel don't disturb us, the next pass will
905 * send them to the client.
907 job
= vnc_job_new(vs
);
909 height
= MIN(pixman_image_get_height(vd
->server
), vs
->client_height
);
915 unsigned long offset
= find_next_bit((unsigned long *) &vs
->dirty
,
916 height
* VNC_DIRTY_BPL(vs
),
917 y
* VNC_DIRTY_BPL(vs
));
918 if (offset
== height
* VNC_DIRTY_BPL(vs
)) {
919 /* no more dirty bits */
922 y
= offset
/ VNC_DIRTY_BPL(vs
);
923 x
= offset
% VNC_DIRTY_BPL(vs
);
924 x2
= find_next_zero_bit((unsigned long *) &vs
->dirty
[y
],
925 VNC_DIRTY_BPL(vs
), x
);
926 bitmap_clear(vs
->dirty
[y
], x
, x2
- x
);
927 h
= find_and_clear_dirty_height(vs
, y
, x
, x2
, height
);
928 n
+= vnc_job_add_rect(job
, x
* VNC_DIRTY_PIXELS_PER_BIT
, y
,
929 (x2
- x
) * VNC_DIRTY_PIXELS_PER_BIT
, h
);
933 vs
->force_update
= 0;
937 if (vs
->csock
== -1) {
938 vnc_disconnect_finish(vs
);
947 static void audio_capture_notify(void *opaque
, audcnotification_e cmd
)
949 VncState
*vs
= opaque
;
952 case AUD_CNOTIFY_DISABLE
:
954 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
955 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
956 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_END
);
957 vnc_unlock_output(vs
);
961 case AUD_CNOTIFY_ENABLE
:
963 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
964 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
965 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN
);
966 vnc_unlock_output(vs
);
972 static void audio_capture_destroy(void *opaque
)
976 static void audio_capture(void *opaque
, void *buf
, int size
)
978 VncState
*vs
= opaque
;
981 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU
);
982 vnc_write_u8(vs
, VNC_MSG_SERVER_QEMU_AUDIO
);
983 vnc_write_u16(vs
, VNC_MSG_SERVER_QEMU_AUDIO_DATA
);
984 vnc_write_u32(vs
, size
);
985 vnc_write(vs
, buf
, size
);
986 vnc_unlock_output(vs
);
990 static void audio_add(VncState
*vs
)
992 struct audio_capture_ops ops
;
995 monitor_printf(default_mon
, "audio already running\n");
999 ops
.notify
= audio_capture_notify
;
1000 ops
.destroy
= audio_capture_destroy
;
1001 ops
.capture
= audio_capture
;
1003 vs
->audio_cap
= AUD_add_capture(&vs
->as
, &ops
, vs
);
1004 if (!vs
->audio_cap
) {
1005 monitor_printf(default_mon
, "Failed to add audio capture\n");
1009 static void audio_del(VncState
*vs
)
1011 if (vs
->audio_cap
) {
1012 AUD_del_capture(vs
->audio_cap
, vs
);
1013 vs
->audio_cap
= NULL
;
1017 static void vnc_disconnect_start(VncState
*vs
)
1019 if (vs
->csock
== -1)
1021 vnc_set_share_mode(vs
, VNC_SHARE_MODE_DISCONNECTED
);
1022 qemu_set_fd_handler2(vs
->csock
, NULL
, NULL
, NULL
, NULL
);
1023 closesocket(vs
->csock
);
1027 void vnc_disconnect_finish(VncState
*vs
)
1031 vnc_jobs_join(vs
); /* Wait encoding jobs */
1033 vnc_lock_output(vs
);
1034 vnc_qmp_event(vs
, QEVENT_VNC_DISCONNECTED
);
1036 buffer_free(&vs
->input
);
1037 buffer_free(&vs
->output
);
1038 #ifdef CONFIG_VNC_WS
1039 buffer_free(&vs
->ws_input
);
1040 buffer_free(&vs
->ws_output
);
1041 #endif /* CONFIG_VNC_WS */
1043 qobject_decref(vs
->info
);
1046 vnc_tight_clear(vs
);
1049 #ifdef CONFIG_VNC_TLS
1050 vnc_tls_client_cleanup(vs
);
1051 #endif /* CONFIG_VNC_TLS */
1052 #ifdef CONFIG_VNC_SASL
1053 vnc_sasl_client_cleanup(vs
);
1054 #endif /* CONFIG_VNC_SASL */
1056 vnc_release_modifiers(vs
);
1058 if (vs
->initialized
) {
1059 QTAILQ_REMOVE(&vs
->vd
->clients
, vs
, next
);
1060 qemu_remove_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
1063 if (vs
->vd
->lock_key_sync
)
1064 qemu_remove_led_event_handler(vs
->led
);
1065 vnc_unlock_output(vs
);
1067 qemu_mutex_destroy(&vs
->output_mutex
);
1068 if (vs
->bh
!= NULL
) {
1069 qemu_bh_delete(vs
->bh
);
1071 buffer_free(&vs
->jobs_buffer
);
1073 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
1074 g_free(vs
->lossy_rect
[i
]);
1076 g_free(vs
->lossy_rect
);
1080 int vnc_client_io_error(VncState
*vs
, int ret
, int last_errno
)
1082 if (ret
== 0 || ret
== -1) {
1084 switch (last_errno
) {
1088 case WSAEWOULDBLOCK
:
1096 VNC_DEBUG("Closing down client sock: ret %d, errno %d\n",
1097 ret
, ret
< 0 ? last_errno
: 0);
1098 vnc_disconnect_start(vs
);
1106 void vnc_client_error(VncState
*vs
)
1108 VNC_DEBUG("Closing down client sock: protocol error\n");
1109 vnc_disconnect_start(vs
);
1112 #ifdef CONFIG_VNC_TLS
1113 static long vnc_client_write_tls(gnutls_session_t
*session
,
1114 const uint8_t *data
,
1117 long ret
= gnutls_write(*session
, data
, datalen
);
1119 if (ret
== GNUTLS_E_AGAIN
) {
1128 #endif /* CONFIG_VNC_TLS */
1131 * Called to write a chunk of data to the client socket. The data may
1132 * be the raw data, or may have already been encoded by SASL.
1133 * The data will be written either straight onto the socket, or
1134 * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1136 * NB, it is theoretically possible to have 2 layers of encryption,
1137 * both SASL, and this TLS layer. It is highly unlikely in practice
1138 * though, since SASL encryption will typically be a no-op if TLS
1141 * Returns the number of bytes written, which may be less than
1142 * the requested 'datalen' if the socket would block. Returns
1143 * -1 on error, and disconnects the client socket.
1145 long vnc_client_write_buf(VncState
*vs
, const uint8_t *data
, size_t datalen
)
1148 #ifdef CONFIG_VNC_TLS
1149 if (vs
->tls
.session
) {
1150 ret
= vnc_client_write_tls(&vs
->tls
.session
, data
, datalen
);
1152 #ifdef CONFIG_VNC_WS
1153 if (vs
->ws_tls
.session
) {
1154 ret
= vnc_client_write_tls(&vs
->ws_tls
.session
, data
, datalen
);
1156 #endif /* CONFIG_VNC_WS */
1157 #endif /* CONFIG_VNC_TLS */
1159 ret
= send(vs
->csock
, (const void *)data
, datalen
, 0);
1161 #ifdef CONFIG_VNC_TLS
1163 #endif /* CONFIG_VNC_TLS */
1164 VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data
, datalen
, ret
);
1165 return vnc_client_io_error(vs
, ret
, socket_error());
1170 * Called to write buffered data to the client socket, when not
1171 * using any SASL SSF encryption layers. Will write as much data
1172 * as possible without blocking. If all buffered data is written,
1173 * will switch the FD poll() handler back to read monitoring.
1175 * Returns the number of bytes written, which may be less than
1176 * the buffered output data if the socket would block. Returns
1177 * -1 on error, and disconnects the client socket.
1179 static long vnc_client_write_plain(VncState
*vs
)
1183 #ifdef CONFIG_VNC_SASL
1184 VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1185 vs
->output
.buffer
, vs
->output
.capacity
, vs
->output
.offset
,
1186 vs
->sasl
.waitWriteSSF
);
1188 if (vs
->sasl
.conn
&&
1190 vs
->sasl
.waitWriteSSF
) {
1191 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->sasl
.waitWriteSSF
);
1193 vs
->sasl
.waitWriteSSF
-= ret
;
1195 #endif /* CONFIG_VNC_SASL */
1196 ret
= vnc_client_write_buf(vs
, vs
->output
.buffer
, vs
->output
.offset
);
1200 buffer_advance(&vs
->output
, ret
);
1202 if (vs
->output
.offset
== 0) {
1203 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
1211 * First function called whenever there is data to be written to
1212 * the client socket. Will delegate actual work according to whether
1213 * SASL SSF layers are enabled (thus requiring encryption calls)
1215 static void vnc_client_write_locked(void *opaque
)
1217 VncState
*vs
= opaque
;
1219 #ifdef CONFIG_VNC_SASL
1220 if (vs
->sasl
.conn
&&
1222 !vs
->sasl
.waitWriteSSF
) {
1223 vnc_client_write_sasl(vs
);
1225 #endif /* CONFIG_VNC_SASL */
1227 #ifdef CONFIG_VNC_WS
1228 if (vs
->encode_ws
) {
1229 vnc_client_write_ws(vs
);
1231 #endif /* CONFIG_VNC_WS */
1233 vnc_client_write_plain(vs
);
1238 void vnc_client_write(void *opaque
)
1240 VncState
*vs
= opaque
;
1242 vnc_lock_output(vs
);
1243 if (vs
->output
.offset
1244 #ifdef CONFIG_VNC_WS
1245 || vs
->ws_output
.offset
1248 vnc_client_write_locked(opaque
);
1249 } else if (vs
->csock
!= -1) {
1250 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
1252 vnc_unlock_output(vs
);
1255 void vnc_read_when(VncState
*vs
, VncReadEvent
*func
, size_t expecting
)
1257 vs
->read_handler
= func
;
1258 vs
->read_handler_expect
= expecting
;
1261 #ifdef CONFIG_VNC_TLS
1262 static long vnc_client_read_tls(gnutls_session_t
*session
, uint8_t *data
,
1265 long ret
= gnutls_read(*session
, data
, datalen
);
1267 if (ret
== GNUTLS_E_AGAIN
) {
1276 #endif /* CONFIG_VNC_TLS */
1279 * Called to read a chunk of data from the client socket. The data may
1280 * be the raw data, or may need to be further decoded by SASL.
1281 * The data will be read either straight from to the socket, or
1282 * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1284 * NB, it is theoretically possible to have 2 layers of encryption,
1285 * both SASL, and this TLS layer. It is highly unlikely in practice
1286 * though, since SASL encryption will typically be a no-op if TLS
1289 * Returns the number of bytes read, which may be less than
1290 * the requested 'datalen' if the socket would block. Returns
1291 * -1 on error, and disconnects the client socket.
1293 long vnc_client_read_buf(VncState
*vs
, uint8_t *data
, size_t datalen
)
1296 #ifdef CONFIG_VNC_TLS
1297 if (vs
->tls
.session
) {
1298 ret
= vnc_client_read_tls(&vs
->tls
.session
, data
, datalen
);
1300 #ifdef CONFIG_VNC_WS
1301 if (vs
->ws_tls
.session
) {
1302 ret
= vnc_client_read_tls(&vs
->ws_tls
.session
, data
, datalen
);
1304 #endif /* CONFIG_VNC_WS */
1305 #endif /* CONFIG_VNC_TLS */
1307 ret
= qemu_recv(vs
->csock
, data
, datalen
, 0);
1309 #ifdef CONFIG_VNC_TLS
1311 #endif /* CONFIG_VNC_TLS */
1312 VNC_DEBUG("Read wire %p %zd -> %ld\n", data
, datalen
, ret
);
1313 return vnc_client_io_error(vs
, ret
, socket_error());
1318 * Called to read data from the client socket to the input buffer,
1319 * when not using any SASL SSF encryption layers. Will read as much
1320 * data as possible without blocking.
1322 * Returns the number of bytes read. Returns -1 on error, and
1323 * disconnects the client socket.
1325 static long vnc_client_read_plain(VncState
*vs
)
1328 VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1329 vs
->input
.buffer
, vs
->input
.capacity
, vs
->input
.offset
);
1330 buffer_reserve(&vs
->input
, 4096);
1331 ret
= vnc_client_read_buf(vs
, buffer_end(&vs
->input
), 4096);
1334 vs
->input
.offset
+= ret
;
1338 static void vnc_jobs_bh(void *opaque
)
1340 VncState
*vs
= opaque
;
1342 vnc_jobs_consume_buffer(vs
);
1346 * First function called whenever there is more data to be read from
1347 * the client socket. Will delegate actual work according to whether
1348 * SASL SSF layers are enabled (thus requiring decryption calls)
1350 void vnc_client_read(void *opaque
)
1352 VncState
*vs
= opaque
;
1355 #ifdef CONFIG_VNC_SASL
1356 if (vs
->sasl
.conn
&& vs
->sasl
.runSSF
)
1357 ret
= vnc_client_read_sasl(vs
);
1359 #endif /* CONFIG_VNC_SASL */
1360 #ifdef CONFIG_VNC_WS
1361 if (vs
->encode_ws
) {
1362 ret
= vnc_client_read_ws(vs
);
1364 vnc_disconnect_start(vs
);
1366 } else if (ret
== -2) {
1367 vnc_client_error(vs
);
1371 #endif /* CONFIG_VNC_WS */
1373 ret
= vnc_client_read_plain(vs
);
1376 if (vs
->csock
== -1)
1377 vnc_disconnect_finish(vs
);
1381 while (vs
->read_handler
&& vs
->input
.offset
>= vs
->read_handler_expect
) {
1382 size_t len
= vs
->read_handler_expect
;
1385 ret
= vs
->read_handler(vs
, vs
->input
.buffer
, len
);
1386 if (vs
->csock
== -1) {
1387 vnc_disconnect_finish(vs
);
1392 buffer_advance(&vs
->input
, len
);
1394 vs
->read_handler_expect
= ret
;
1399 void vnc_write(VncState
*vs
, const void *data
, size_t len
)
1401 buffer_reserve(&vs
->output
, len
);
1403 if (vs
->csock
!= -1 && buffer_empty(&vs
->output
)) {
1404 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, vnc_client_write
, vs
);
1407 buffer_append(&vs
->output
, data
, len
);
1410 void vnc_write_s32(VncState
*vs
, int32_t value
)
1412 vnc_write_u32(vs
, *(uint32_t *)&value
);
1415 void vnc_write_u32(VncState
*vs
, uint32_t value
)
1419 buf
[0] = (value
>> 24) & 0xFF;
1420 buf
[1] = (value
>> 16) & 0xFF;
1421 buf
[2] = (value
>> 8) & 0xFF;
1422 buf
[3] = value
& 0xFF;
1424 vnc_write(vs
, buf
, 4);
1427 void vnc_write_u16(VncState
*vs
, uint16_t value
)
1431 buf
[0] = (value
>> 8) & 0xFF;
1432 buf
[1] = value
& 0xFF;
1434 vnc_write(vs
, buf
, 2);
1437 void vnc_write_u8(VncState
*vs
, uint8_t value
)
1439 vnc_write(vs
, (char *)&value
, 1);
1442 void vnc_flush(VncState
*vs
)
1444 vnc_lock_output(vs
);
1445 if (vs
->csock
!= -1 && (vs
->output
.offset
1446 #ifdef CONFIG_VNC_WS
1447 || vs
->ws_output
.offset
1450 vnc_client_write_locked(vs
);
1452 vnc_unlock_output(vs
);
1455 static uint8_t read_u8(uint8_t *data
, size_t offset
)
1457 return data
[offset
];
1460 static uint16_t read_u16(uint8_t *data
, size_t offset
)
1462 return ((data
[offset
] & 0xFF) << 8) | (data
[offset
+ 1] & 0xFF);
1465 static int32_t read_s32(uint8_t *data
, size_t offset
)
1467 return (int32_t)((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1468 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1471 uint32_t read_u32(uint8_t *data
, size_t offset
)
1473 return ((data
[offset
] << 24) | (data
[offset
+ 1] << 16) |
1474 (data
[offset
+ 2] << 8) | data
[offset
+ 3]);
1477 static void client_cut_text(VncState
*vs
, size_t len
, uint8_t *text
)
1481 static void check_pointer_type_change(Notifier
*notifier
, void *data
)
1483 VncState
*vs
= container_of(notifier
, VncState
, mouse_mode_notifier
);
1484 int absolute
= qemu_input_is_absolute();
1486 if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
) && vs
->absolute
!= absolute
) {
1487 vnc_lock_output(vs
);
1488 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1489 vnc_write_u8(vs
, 0);
1490 vnc_write_u16(vs
, 1);
1491 vnc_framebuffer_update(vs
, absolute
, 0,
1492 surface_width(vs
->vd
->ds
),
1493 surface_height(vs
->vd
->ds
),
1494 VNC_ENCODING_POINTER_TYPE_CHANGE
);
1495 vnc_unlock_output(vs
);
1498 vs
->absolute
= absolute
;
1501 static void pointer_event(VncState
*vs
, int button_mask
, int x
, int y
)
1503 static uint32_t bmap
[INPUT_BUTTON_MAX
] = {
1504 [INPUT_BUTTON_LEFT
] = 0x01,
1505 [INPUT_BUTTON_MIDDLE
] = 0x02,
1506 [INPUT_BUTTON_RIGHT
] = 0x04,
1507 [INPUT_BUTTON_WHEEL_UP
] = 0x08,
1508 [INPUT_BUTTON_WHEEL_DOWN
] = 0x10,
1510 QemuConsole
*con
= vs
->vd
->dcl
.con
;
1511 int width
= surface_width(vs
->vd
->ds
);
1512 int height
= surface_height(vs
->vd
->ds
);
1514 if (vs
->last_bmask
!= button_mask
) {
1515 qemu_input_update_buttons(con
, bmap
, vs
->last_bmask
, button_mask
);
1516 vs
->last_bmask
= button_mask
;
1520 qemu_input_queue_abs(con
, INPUT_AXIS_X
, x
, width
);
1521 qemu_input_queue_abs(con
, INPUT_AXIS_Y
, y
, height
);
1522 } else if (vnc_has_feature(vs
, VNC_FEATURE_POINTER_TYPE_CHANGE
)) {
1523 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- 0x7FFF);
1524 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- 0x7FFF);
1526 if (vs
->last_x
!= -1) {
1527 qemu_input_queue_rel(con
, INPUT_AXIS_X
, x
- vs
->last_x
);
1528 qemu_input_queue_rel(con
, INPUT_AXIS_Y
, y
- vs
->last_y
);
1533 qemu_input_event_sync();
1536 static void reset_keys(VncState
*vs
)
1539 for(i
= 0; i
< 256; i
++) {
1540 if (vs
->modifiers_state
[i
]) {
1541 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, i
, false);
1542 vs
->modifiers_state
[i
] = 0;
1547 static void press_key(VncState
*vs
, int keysym
)
1549 int keycode
= keysym2scancode(vs
->vd
->kbd_layout
, keysym
) & SCANCODE_KEYMASK
;
1550 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, true);
1551 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1554 static int current_led_state(VncState
*vs
)
1558 if (vs
->modifiers_state
[0x46]) {
1559 ledstate
|= QEMU_SCROLL_LOCK_LED
;
1561 if (vs
->modifiers_state
[0x45]) {
1562 ledstate
|= QEMU_NUM_LOCK_LED
;
1564 if (vs
->modifiers_state
[0x3a]) {
1565 ledstate
|= QEMU_CAPS_LOCK_LED
;
1571 static void vnc_led_state_change(VncState
*vs
)
1575 if (!vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
)) {
1579 ledstate
= current_led_state(vs
);
1580 vnc_lock_output(vs
);
1581 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1582 vnc_write_u8(vs
, 0);
1583 vnc_write_u16(vs
, 1);
1584 vnc_framebuffer_update(vs
, 0, 0, 1, 1, VNC_ENCODING_LED_STATE
);
1585 vnc_write_u8(vs
, ledstate
);
1586 vnc_unlock_output(vs
);
1590 static void kbd_leds(void *opaque
, int ledstate
)
1592 VncState
*vs
= opaque
;
1594 bool has_changed
= (ledstate
!= current_led_state(vs
));
1596 caps
= ledstate
& QEMU_CAPS_LOCK_LED
? 1 : 0;
1597 num
= ledstate
& QEMU_NUM_LOCK_LED
? 1 : 0;
1598 scr
= ledstate
& QEMU_SCROLL_LOCK_LED
? 1 : 0;
1600 if (vs
->modifiers_state
[0x3a] != caps
) {
1601 vs
->modifiers_state
[0x3a] = caps
;
1603 if (vs
->modifiers_state
[0x45] != num
) {
1604 vs
->modifiers_state
[0x45] = num
;
1606 if (vs
->modifiers_state
[0x46] != scr
) {
1607 vs
->modifiers_state
[0x46] = scr
;
1610 /* Sending the current led state message to the client */
1612 vnc_led_state_change(vs
);
1616 static void do_key_event(VncState
*vs
, int down
, int keycode
, int sym
)
1618 /* QEMU console switch */
1620 case 0x2a: /* Left Shift */
1621 case 0x36: /* Right Shift */
1622 case 0x1d: /* Left CTRL */
1623 case 0x9d: /* Right CTRL */
1624 case 0x38: /* Left ALT */
1625 case 0xb8: /* Right ALT */
1627 vs
->modifiers_state
[keycode
] = 1;
1629 vs
->modifiers_state
[keycode
] = 0;
1631 case 0x02 ... 0x0a: /* '1' to '9' keys */
1632 if (down
&& vs
->modifiers_state
[0x1d] && vs
->modifiers_state
[0x38]) {
1633 /* Reset the modifiers sent to the current console */
1635 console_select(keycode
- 0x02);
1639 case 0x3a: /* CapsLock */
1640 case 0x45: /* NumLock */
1642 vs
->modifiers_state
[keycode
] ^= 1;
1646 /* Turn off the lock state sync logic if the client support the led
1649 if (down
&& vs
->vd
->lock_key_sync
&&
1650 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1651 keycode_is_keypad(vs
->vd
->kbd_layout
, keycode
)) {
1652 /* If the numlock state needs to change then simulate an additional
1653 keypress before sending this one. This will happen if the user
1654 toggles numlock away from the VNC window.
1656 if (keysym_is_numlock(vs
->vd
->kbd_layout
, sym
& 0xFFFF)) {
1657 if (!vs
->modifiers_state
[0x45]) {
1658 vs
->modifiers_state
[0x45] = 1;
1659 press_key(vs
, 0xff7f);
1662 if (vs
->modifiers_state
[0x45]) {
1663 vs
->modifiers_state
[0x45] = 0;
1664 press_key(vs
, 0xff7f);
1669 if (down
&& vs
->vd
->lock_key_sync
&&
1670 !vnc_has_feature(vs
, VNC_FEATURE_LED_STATE
) &&
1671 ((sym
>= 'A' && sym
<= 'Z') || (sym
>= 'a' && sym
<= 'z'))) {
1672 /* If the capslock state needs to change then simulate an additional
1673 keypress before sending this one. This will happen if the user
1674 toggles capslock away from the VNC window.
1676 int uppercase
= !!(sym
>= 'A' && sym
<= 'Z');
1677 int shift
= !!(vs
->modifiers_state
[0x2a] | vs
->modifiers_state
[0x36]);
1678 int capslock
= !!(vs
->modifiers_state
[0x3a]);
1680 if (uppercase
== shift
) {
1681 vs
->modifiers_state
[0x3a] = 0;
1682 press_key(vs
, 0xffe5);
1685 if (uppercase
!= shift
) {
1686 vs
->modifiers_state
[0x3a] = 1;
1687 press_key(vs
, 0xffe5);
1692 if (qemu_console_is_graphic(NULL
)) {
1693 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, down
);
1695 bool numlock
= vs
->modifiers_state
[0x45];
1696 bool control
= (vs
->modifiers_state
[0x1d] ||
1697 vs
->modifiers_state
[0x9d]);
1698 /* QEMU console emulation */
1701 case 0x2a: /* Left Shift */
1702 case 0x36: /* Right Shift */
1703 case 0x1d: /* Left CTRL */
1704 case 0x9d: /* Right CTRL */
1705 case 0x38: /* Left ALT */
1706 case 0xb8: /* Right ALT */
1709 kbd_put_keysym(QEMU_KEY_UP
);
1712 kbd_put_keysym(QEMU_KEY_DOWN
);
1715 kbd_put_keysym(QEMU_KEY_LEFT
);
1718 kbd_put_keysym(QEMU_KEY_RIGHT
);
1721 kbd_put_keysym(QEMU_KEY_DELETE
);
1724 kbd_put_keysym(QEMU_KEY_HOME
);
1727 kbd_put_keysym(QEMU_KEY_END
);
1730 kbd_put_keysym(QEMU_KEY_PAGEUP
);
1733 kbd_put_keysym(QEMU_KEY_PAGEDOWN
);
1737 kbd_put_keysym(numlock
? '7' : QEMU_KEY_HOME
);
1740 kbd_put_keysym(numlock
? '8' : QEMU_KEY_UP
);
1743 kbd_put_keysym(numlock
? '9' : QEMU_KEY_PAGEUP
);
1746 kbd_put_keysym(numlock
? '4' : QEMU_KEY_LEFT
);
1749 kbd_put_keysym('5');
1752 kbd_put_keysym(numlock
? '6' : QEMU_KEY_RIGHT
);
1755 kbd_put_keysym(numlock
? '1' : QEMU_KEY_END
);
1758 kbd_put_keysym(numlock
? '2' : QEMU_KEY_DOWN
);
1761 kbd_put_keysym(numlock
? '3' : QEMU_KEY_PAGEDOWN
);
1764 kbd_put_keysym('0');
1767 kbd_put_keysym(numlock
? '.' : QEMU_KEY_DELETE
);
1771 kbd_put_keysym('/');
1774 kbd_put_keysym('*');
1777 kbd_put_keysym('-');
1780 kbd_put_keysym('+');
1783 kbd_put_keysym('\n');
1788 kbd_put_keysym(sym
& 0x1f);
1790 kbd_put_keysym(sym
);
1798 static void vnc_release_modifiers(VncState
*vs
)
1800 static const int keycodes
[] = {
1801 /* shift, control, alt keys, both left & right */
1802 0x2a, 0x36, 0x1d, 0x9d, 0x38, 0xb8,
1806 if (!qemu_console_is_graphic(NULL
)) {
1809 for (i
= 0; i
< ARRAY_SIZE(keycodes
); i
++) {
1810 keycode
= keycodes
[i
];
1811 if (!vs
->modifiers_state
[keycode
]) {
1814 qemu_input_event_send_key_number(vs
->vd
->dcl
.con
, keycode
, false);
1818 static void key_event(VncState
*vs
, int down
, uint32_t sym
)
1823 if (lsym
>= 'A' && lsym
<= 'Z' && qemu_console_is_graphic(NULL
)) {
1824 lsym
= lsym
- 'A' + 'a';
1827 keycode
= keysym2scancode(vs
->vd
->kbd_layout
, lsym
& 0xFFFF) & SCANCODE_KEYMASK
;
1828 do_key_event(vs
, down
, keycode
, sym
);
1831 static void ext_key_event(VncState
*vs
, int down
,
1832 uint32_t sym
, uint16_t keycode
)
1834 /* if the user specifies a keyboard layout, always use it */
1835 if (keyboard_layout
)
1836 key_event(vs
, down
, sym
);
1838 do_key_event(vs
, down
, keycode
, sym
);
1841 static void framebuffer_update_request(VncState
*vs
, int incremental
,
1842 int x_position
, int y_position
,
1846 const size_t width
= surface_width(vs
->vd
->ds
) / VNC_DIRTY_PIXELS_PER_BIT
;
1847 const size_t height
= surface_height(vs
->vd
->ds
);
1849 if (y_position
> height
) {
1850 y_position
= height
;
1852 if (y_position
+ h
>= height
) {
1853 h
= height
- y_position
;
1856 vs
->need_update
= 1;
1858 vs
->force_update
= 1;
1859 for (i
= 0; i
< h
; i
++) {
1860 bitmap_set(vs
->dirty
[y_position
+ i
], 0, width
);
1861 bitmap_clear(vs
->dirty
[y_position
+ i
], width
,
1862 VNC_DIRTY_BITS
- width
);
1867 static void send_ext_key_event_ack(VncState
*vs
)
1869 vnc_lock_output(vs
);
1870 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1871 vnc_write_u8(vs
, 0);
1872 vnc_write_u16(vs
, 1);
1873 vnc_framebuffer_update(vs
, 0, 0,
1874 surface_width(vs
->vd
->ds
),
1875 surface_height(vs
->vd
->ds
),
1876 VNC_ENCODING_EXT_KEY_EVENT
);
1877 vnc_unlock_output(vs
);
1881 static void send_ext_audio_ack(VncState
*vs
)
1883 vnc_lock_output(vs
);
1884 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
1885 vnc_write_u8(vs
, 0);
1886 vnc_write_u16(vs
, 1);
1887 vnc_framebuffer_update(vs
, 0, 0,
1888 surface_width(vs
->vd
->ds
),
1889 surface_height(vs
->vd
->ds
),
1890 VNC_ENCODING_AUDIO
);
1891 vnc_unlock_output(vs
);
1895 static void set_encodings(VncState
*vs
, int32_t *encodings
, size_t n_encodings
)
1898 unsigned int enc
= 0;
1901 vs
->vnc_encoding
= 0;
1902 vs
->tight
.compression
= 9;
1903 vs
->tight
.quality
= -1; /* Lossless by default */
1907 * Start from the end because the encodings are sent in order of preference.
1908 * This way the preferred encoding (first encoding defined in the array)
1909 * will be set at the end of the loop.
1911 for (i
= n_encodings
- 1; i
>= 0; i
--) {
1914 case VNC_ENCODING_RAW
:
1915 vs
->vnc_encoding
= enc
;
1917 case VNC_ENCODING_COPYRECT
:
1918 vs
->features
|= VNC_FEATURE_COPYRECT_MASK
;
1920 case VNC_ENCODING_HEXTILE
:
1921 vs
->features
|= VNC_FEATURE_HEXTILE_MASK
;
1922 vs
->vnc_encoding
= enc
;
1924 case VNC_ENCODING_TIGHT
:
1925 vs
->features
|= VNC_FEATURE_TIGHT_MASK
;
1926 vs
->vnc_encoding
= enc
;
1928 #ifdef CONFIG_VNC_PNG
1929 case VNC_ENCODING_TIGHT_PNG
:
1930 vs
->features
|= VNC_FEATURE_TIGHT_PNG_MASK
;
1931 vs
->vnc_encoding
= enc
;
1934 case VNC_ENCODING_ZLIB
:
1935 vs
->features
|= VNC_FEATURE_ZLIB_MASK
;
1936 vs
->vnc_encoding
= enc
;
1938 case VNC_ENCODING_ZRLE
:
1939 vs
->features
|= VNC_FEATURE_ZRLE_MASK
;
1940 vs
->vnc_encoding
= enc
;
1942 case VNC_ENCODING_ZYWRLE
:
1943 vs
->features
|= VNC_FEATURE_ZYWRLE_MASK
;
1944 vs
->vnc_encoding
= enc
;
1946 case VNC_ENCODING_DESKTOPRESIZE
:
1947 vs
->features
|= VNC_FEATURE_RESIZE_MASK
;
1949 case VNC_ENCODING_POINTER_TYPE_CHANGE
:
1950 vs
->features
|= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK
;
1952 case VNC_ENCODING_RICH_CURSOR
:
1953 vs
->features
|= VNC_FEATURE_RICH_CURSOR_MASK
;
1955 case VNC_ENCODING_EXT_KEY_EVENT
:
1956 send_ext_key_event_ack(vs
);
1958 case VNC_ENCODING_AUDIO
:
1959 send_ext_audio_ack(vs
);
1961 case VNC_ENCODING_WMVi
:
1962 vs
->features
|= VNC_FEATURE_WMVI_MASK
;
1964 case VNC_ENCODING_LED_STATE
:
1965 vs
->features
|= VNC_FEATURE_LED_STATE_MASK
;
1967 case VNC_ENCODING_COMPRESSLEVEL0
... VNC_ENCODING_COMPRESSLEVEL0
+ 9:
1968 vs
->tight
.compression
= (enc
& 0x0F);
1970 case VNC_ENCODING_QUALITYLEVEL0
... VNC_ENCODING_QUALITYLEVEL0
+ 9:
1971 if (vs
->vd
->lossy
) {
1972 vs
->tight
.quality
= (enc
& 0x0F);
1976 VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i
, enc
, enc
);
1980 vnc_desktop_resize(vs
);
1981 check_pointer_type_change(&vs
->mouse_mode_notifier
, NULL
);
1982 vnc_led_state_change(vs
);
1985 static void set_pixel_conversion(VncState
*vs
)
1987 pixman_format_code_t fmt
= qemu_pixman_get_format(&vs
->client_pf
);
1989 if (fmt
== VNC_SERVER_FB_FORMAT
) {
1990 vs
->write_pixels
= vnc_write_pixels_copy
;
1991 vnc_hextile_set_pixel_conversion(vs
, 0);
1993 vs
->write_pixels
= vnc_write_pixels_generic
;
1994 vnc_hextile_set_pixel_conversion(vs
, 1);
1998 static void set_pixel_format(VncState
*vs
,
1999 int bits_per_pixel
, int depth
,
2000 int big_endian_flag
, int true_color_flag
,
2001 int red_max
, int green_max
, int blue_max
,
2002 int red_shift
, int green_shift
, int blue_shift
)
2004 if (!true_color_flag
) {
2005 vnc_client_error(vs
);
2009 vs
->client_pf
.rmax
= red_max
;
2010 vs
->client_pf
.rbits
= hweight_long(red_max
);
2011 vs
->client_pf
.rshift
= red_shift
;
2012 vs
->client_pf
.rmask
= red_max
<< red_shift
;
2013 vs
->client_pf
.gmax
= green_max
;
2014 vs
->client_pf
.gbits
= hweight_long(green_max
);
2015 vs
->client_pf
.gshift
= green_shift
;
2016 vs
->client_pf
.gmask
= green_max
<< green_shift
;
2017 vs
->client_pf
.bmax
= blue_max
;
2018 vs
->client_pf
.bbits
= hweight_long(blue_max
);
2019 vs
->client_pf
.bshift
= blue_shift
;
2020 vs
->client_pf
.bmask
= blue_max
<< blue_shift
;
2021 vs
->client_pf
.bits_per_pixel
= bits_per_pixel
;
2022 vs
->client_pf
.bytes_per_pixel
= bits_per_pixel
/ 8;
2023 vs
->client_pf
.depth
= bits_per_pixel
== 32 ? 24 : bits_per_pixel
;
2024 vs
->client_be
= big_endian_flag
;
2026 set_pixel_conversion(vs
);
2028 graphic_hw_invalidate(NULL
);
2029 graphic_hw_update(NULL
);
2032 static void pixel_format_message (VncState
*vs
) {
2033 char pad
[3] = { 0, 0, 0 };
2035 vs
->client_pf
= qemu_default_pixelformat(32);
2037 vnc_write_u8(vs
, vs
->client_pf
.bits_per_pixel
); /* bits-per-pixel */
2038 vnc_write_u8(vs
, vs
->client_pf
.depth
); /* depth */
2040 #ifdef HOST_WORDS_BIGENDIAN
2041 vnc_write_u8(vs
, 1); /* big-endian-flag */
2043 vnc_write_u8(vs
, 0); /* big-endian-flag */
2045 vnc_write_u8(vs
, 1); /* true-color-flag */
2046 vnc_write_u16(vs
, vs
->client_pf
.rmax
); /* red-max */
2047 vnc_write_u16(vs
, vs
->client_pf
.gmax
); /* green-max */
2048 vnc_write_u16(vs
, vs
->client_pf
.bmax
); /* blue-max */
2049 vnc_write_u8(vs
, vs
->client_pf
.rshift
); /* red-shift */
2050 vnc_write_u8(vs
, vs
->client_pf
.gshift
); /* green-shift */
2051 vnc_write_u8(vs
, vs
->client_pf
.bshift
); /* blue-shift */
2052 vnc_write(vs
, pad
, 3); /* padding */
2054 vnc_hextile_set_pixel_conversion(vs
, 0);
2055 vs
->write_pixels
= vnc_write_pixels_copy
;
2058 static void vnc_colordepth(VncState
*vs
)
2060 if (vnc_has_feature(vs
, VNC_FEATURE_WMVI
)) {
2061 /* Sending a WMVi message to notify the client*/
2062 vnc_lock_output(vs
);
2063 vnc_write_u8(vs
, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE
);
2064 vnc_write_u8(vs
, 0);
2065 vnc_write_u16(vs
, 1); /* number of rects */
2066 vnc_framebuffer_update(vs
, 0, 0,
2067 surface_width(vs
->vd
->ds
),
2068 surface_height(vs
->vd
->ds
),
2070 pixel_format_message(vs
);
2071 vnc_unlock_output(vs
);
2074 set_pixel_conversion(vs
);
2078 static int protocol_client_msg(VncState
*vs
, uint8_t *data
, size_t len
)
2082 VncDisplay
*vd
= vs
->vd
;
2085 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2089 case VNC_MSG_CLIENT_SET_PIXEL_FORMAT
:
2093 set_pixel_format(vs
, read_u8(data
, 4), read_u8(data
, 5),
2094 read_u8(data
, 6), read_u8(data
, 7),
2095 read_u16(data
, 8), read_u16(data
, 10),
2096 read_u16(data
, 12), read_u8(data
, 14),
2097 read_u8(data
, 15), read_u8(data
, 16));
2099 case VNC_MSG_CLIENT_SET_ENCODINGS
:
2104 limit
= read_u16(data
, 2);
2106 return 4 + (limit
* 4);
2108 limit
= read_u16(data
, 2);
2110 for (i
= 0; i
< limit
; i
++) {
2111 int32_t val
= read_s32(data
, 4 + (i
* 4));
2112 memcpy(data
+ 4 + (i
* 4), &val
, sizeof(val
));
2115 set_encodings(vs
, (int32_t *)(data
+ 4), limit
);
2117 case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST
:
2121 framebuffer_update_request(vs
,
2122 read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4),
2123 read_u16(data
, 6), read_u16(data
, 8));
2125 case VNC_MSG_CLIENT_KEY_EVENT
:
2129 key_event(vs
, read_u8(data
, 1), read_u32(data
, 4));
2131 case VNC_MSG_CLIENT_POINTER_EVENT
:
2135 pointer_event(vs
, read_u8(data
, 1), read_u16(data
, 2), read_u16(data
, 4));
2137 case VNC_MSG_CLIENT_CUT_TEXT
:
2142 uint32_t dlen
= read_u32(data
, 4);
2147 client_cut_text(vs
, read_u32(data
, 4), data
+ 8);
2149 case VNC_MSG_CLIENT_QEMU
:
2153 switch (read_u8(data
, 1)) {
2154 case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT
:
2158 ext_key_event(vs
, read_u16(data
, 2),
2159 read_u32(data
, 4), read_u32(data
, 8));
2161 case VNC_MSG_CLIENT_QEMU_AUDIO
:
2165 switch (read_u16 (data
, 2)) {
2166 case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE
:
2169 case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE
:
2172 case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT
:
2175 switch (read_u8(data
, 4)) {
2176 case 0: vs
->as
.fmt
= AUD_FMT_U8
; break;
2177 case 1: vs
->as
.fmt
= AUD_FMT_S8
; break;
2178 case 2: vs
->as
.fmt
= AUD_FMT_U16
; break;
2179 case 3: vs
->as
.fmt
= AUD_FMT_S16
; break;
2180 case 4: vs
->as
.fmt
= AUD_FMT_U32
; break;
2181 case 5: vs
->as
.fmt
= AUD_FMT_S32
; break;
2183 printf("Invalid audio format %d\n", read_u8(data
, 4));
2184 vnc_client_error(vs
);
2187 vs
->as
.nchannels
= read_u8(data
, 5);
2188 if (vs
->as
.nchannels
!= 1 && vs
->as
.nchannels
!= 2) {
2189 printf("Invalid audio channel coount %d\n",
2191 vnc_client_error(vs
);
2194 vs
->as
.freq
= read_u32(data
, 6);
2197 printf ("Invalid audio message %d\n", read_u8(data
, 4));
2198 vnc_client_error(vs
);
2204 printf("Msg: %d\n", read_u16(data
, 0));
2205 vnc_client_error(vs
);
2210 printf("Msg: %d\n", data
[0]);
2211 vnc_client_error(vs
);
2215 vnc_read_when(vs
, protocol_client_msg
, 1);
2219 static int protocol_client_init(VncState
*vs
, uint8_t *data
, size_t len
)
2225 mode
= data
[0] ? VNC_SHARE_MODE_SHARED
: VNC_SHARE_MODE_EXCLUSIVE
;
2226 switch (vs
->vd
->share_policy
) {
2227 case VNC_SHARE_POLICY_IGNORE
:
2229 * Ignore the shared flag. Nothing to do here.
2231 * Doesn't conform to the rfb spec but is traditional qemu
2232 * behavior, thus left here as option for compatibility
2236 case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
:
2238 * Policy: Allow clients ask for exclusive access.
2240 * Implementation: When a client asks for exclusive access,
2241 * disconnect all others. Shared connects are allowed as long
2242 * as no exclusive connection exists.
2244 * This is how the rfb spec suggests to handle the shared flag.
2246 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2248 QTAILQ_FOREACH(client
, &vs
->vd
->clients
, next
) {
2252 if (client
->share_mode
!= VNC_SHARE_MODE_EXCLUSIVE
&&
2253 client
->share_mode
!= VNC_SHARE_MODE_SHARED
) {
2256 vnc_disconnect_start(client
);
2259 if (mode
== VNC_SHARE_MODE_SHARED
) {
2260 if (vs
->vd
->num_exclusive
> 0) {
2261 vnc_disconnect_start(vs
);
2266 case VNC_SHARE_POLICY_FORCE_SHARED
:
2268 * Policy: Shared connects only.
2269 * Implementation: Disallow clients asking for exclusive access.
2271 * Useful for shared desktop sessions where you don't want
2272 * someone forgetting to say -shared when running the vnc
2273 * client disconnect everybody else.
2275 if (mode
== VNC_SHARE_MODE_EXCLUSIVE
) {
2276 vnc_disconnect_start(vs
);
2281 vnc_set_share_mode(vs
, mode
);
2283 vs
->client_width
= surface_width(vs
->vd
->ds
);
2284 vs
->client_height
= surface_height(vs
->vd
->ds
);
2285 vnc_write_u16(vs
, vs
->client_width
);
2286 vnc_write_u16(vs
, vs
->client_height
);
2288 pixel_format_message(vs
);
2291 size
= snprintf(buf
, sizeof(buf
), "QEMU (%s)", qemu_name
);
2293 size
= snprintf(buf
, sizeof(buf
), "QEMU");
2295 vnc_write_u32(vs
, size
);
2296 vnc_write(vs
, buf
, size
);
2299 vnc_client_cache_auth(vs
);
2300 vnc_qmp_event(vs
, QEVENT_VNC_INITIALIZED
);
2302 vnc_read_when(vs
, protocol_client_msg
, 1);
2307 void start_client_init(VncState
*vs
)
2309 vnc_read_when(vs
, protocol_client_init
, 1);
2312 static void make_challenge(VncState
*vs
)
2316 srand(time(NULL
)+getpid()+getpid()*987654+rand());
2318 for (i
= 0 ; i
< sizeof(vs
->challenge
) ; i
++)
2319 vs
->challenge
[i
] = (int) (256.0*rand()/(RAND_MAX
+1.0));
2322 static int protocol_client_auth_vnc(VncState
*vs
, uint8_t *data
, size_t len
)
2324 unsigned char response
[VNC_AUTH_CHALLENGE_SIZE
];
2326 unsigned char key
[8];
2327 time_t now
= time(NULL
);
2329 if (!vs
->vd
->password
) {
2330 VNC_DEBUG("No password configured on server");
2333 if (vs
->vd
->expires
< now
) {
2334 VNC_DEBUG("Password is expired");
2338 memcpy(response
, vs
->challenge
, VNC_AUTH_CHALLENGE_SIZE
);
2340 /* Calculate the expected challenge response */
2341 pwlen
= strlen(vs
->vd
->password
);
2342 for (i
=0; i
<sizeof(key
); i
++)
2343 key
[i
] = i
<pwlen
? vs
->vd
->password
[i
] : 0;
2345 for (j
= 0; j
< VNC_AUTH_CHALLENGE_SIZE
; j
+= 8)
2346 des(response
+j
, response
+j
);
2348 /* Compare expected vs actual challenge response */
2349 if (memcmp(response
, data
, VNC_AUTH_CHALLENGE_SIZE
) != 0) {
2350 VNC_DEBUG("Client challenge response did not match\n");
2353 VNC_DEBUG("Accepting VNC challenge response\n");
2354 vnc_write_u32(vs
, 0); /* Accept auth */
2357 start_client_init(vs
);
2362 vnc_write_u32(vs
, 1); /* Reject auth */
2363 if (vs
->minor
>= 8) {
2364 static const char err
[] = "Authentication failed";
2365 vnc_write_u32(vs
, sizeof(err
));
2366 vnc_write(vs
, err
, sizeof(err
));
2369 vnc_client_error(vs
);
2373 void start_auth_vnc(VncState
*vs
)
2376 /* Send client a 'random' challenge */
2377 vnc_write(vs
, vs
->challenge
, sizeof(vs
->challenge
));
2380 vnc_read_when(vs
, protocol_client_auth_vnc
, sizeof(vs
->challenge
));
2384 static int protocol_client_auth(VncState
*vs
, uint8_t *data
, size_t len
)
2386 /* We only advertise 1 auth scheme at a time, so client
2387 * must pick the one we sent. Verify this */
2388 if (data
[0] != vs
->auth
) { /* Reject auth */
2389 VNC_DEBUG("Reject auth %d because it didn't match advertized\n", (int)data
[0]);
2390 vnc_write_u32(vs
, 1);
2391 if (vs
->minor
>= 8) {
2392 static const char err
[] = "Authentication failed";
2393 vnc_write_u32(vs
, sizeof(err
));
2394 vnc_write(vs
, err
, sizeof(err
));
2396 vnc_client_error(vs
);
2397 } else { /* Accept requested auth */
2398 VNC_DEBUG("Client requested auth %d\n", (int)data
[0]);
2401 VNC_DEBUG("Accept auth none\n");
2402 if (vs
->minor
>= 8) {
2403 vnc_write_u32(vs
, 0); /* Accept auth completion */
2406 start_client_init(vs
);
2410 VNC_DEBUG("Start VNC auth\n");
2414 #ifdef CONFIG_VNC_TLS
2415 case VNC_AUTH_VENCRYPT
:
2416 VNC_DEBUG("Accept VeNCrypt auth\n");
2417 start_auth_vencrypt(vs
);
2419 #endif /* CONFIG_VNC_TLS */
2421 #ifdef CONFIG_VNC_SASL
2423 VNC_DEBUG("Accept SASL auth\n");
2424 start_auth_sasl(vs
);
2426 #endif /* CONFIG_VNC_SASL */
2428 default: /* Should not be possible, but just in case */
2429 VNC_DEBUG("Reject auth %d server code bug\n", vs
->auth
);
2430 vnc_write_u8(vs
, 1);
2431 if (vs
->minor
>= 8) {
2432 static const char err
[] = "Authentication failed";
2433 vnc_write_u32(vs
, sizeof(err
));
2434 vnc_write(vs
, err
, sizeof(err
));
2436 vnc_client_error(vs
);
2442 static int protocol_version(VncState
*vs
, uint8_t *version
, size_t len
)
2446 memcpy(local
, version
, 12);
2449 if (sscanf(local
, "RFB %03d.%03d\n", &vs
->major
, &vs
->minor
) != 2) {
2450 VNC_DEBUG("Malformed protocol version %s\n", local
);
2451 vnc_client_error(vs
);
2454 VNC_DEBUG("Client request protocol version %d.%d\n", vs
->major
, vs
->minor
);
2455 if (vs
->major
!= 3 ||
2461 VNC_DEBUG("Unsupported client version\n");
2462 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2464 vnc_client_error(vs
);
2467 /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2468 * as equivalent to v3.3 by servers
2470 if (vs
->minor
== 4 || vs
->minor
== 5)
2473 if (vs
->minor
== 3) {
2474 if (vs
->auth
== VNC_AUTH_NONE
) {
2475 VNC_DEBUG("Tell client auth none\n");
2476 vnc_write_u32(vs
, vs
->auth
);
2478 start_client_init(vs
);
2479 } else if (vs
->auth
== VNC_AUTH_VNC
) {
2480 VNC_DEBUG("Tell client VNC auth\n");
2481 vnc_write_u32(vs
, vs
->auth
);
2485 VNC_DEBUG("Unsupported auth %d for protocol 3.3\n", vs
->auth
);
2486 vnc_write_u32(vs
, VNC_AUTH_INVALID
);
2488 vnc_client_error(vs
);
2491 VNC_DEBUG("Telling client we support auth %d\n", vs
->auth
);
2492 vnc_write_u8(vs
, 1); /* num auth */
2493 vnc_write_u8(vs
, vs
->auth
);
2494 vnc_read_when(vs
, protocol_client_auth
, 1);
2501 static VncRectStat
*vnc_stat_rect(VncDisplay
*vd
, int x
, int y
)
2503 struct VncSurface
*vs
= &vd
->guest
;
2505 return &vs
->stats
[y
/ VNC_STAT_RECT
][x
/ VNC_STAT_RECT
];
2508 void vnc_sent_lossy_rect(VncState
*vs
, int x
, int y
, int w
, int h
)
2512 w
= (x
+ w
) / VNC_STAT_RECT
;
2513 h
= (y
+ h
) / VNC_STAT_RECT
;
2517 for (j
= y
; j
<= h
; j
++) {
2518 for (i
= x
; i
<= w
; i
++) {
2519 vs
->lossy_rect
[j
][i
] = 1;
2524 static int vnc_refresh_lossy_rect(VncDisplay
*vd
, int x
, int y
)
2527 int sty
= y
/ VNC_STAT_RECT
;
2528 int stx
= x
/ VNC_STAT_RECT
;
2531 y
= y
/ VNC_STAT_RECT
* VNC_STAT_RECT
;
2532 x
= x
/ VNC_STAT_RECT
* VNC_STAT_RECT
;
2534 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
2537 /* kernel send buffers are full -> refresh later */
2538 if (vs
->output
.offset
) {
2542 if (!vs
->lossy_rect
[sty
][stx
]) {
2546 vs
->lossy_rect
[sty
][stx
] = 0;
2547 for (j
= 0; j
< VNC_STAT_RECT
; ++j
) {
2548 bitmap_set(vs
->dirty
[y
+ j
],
2549 x
/ VNC_DIRTY_PIXELS_PER_BIT
,
2550 VNC_STAT_RECT
/ VNC_DIRTY_PIXELS_PER_BIT
);
2558 static int vnc_update_stats(VncDisplay
*vd
, struct timeval
* tv
)
2560 int width
= pixman_image_get_width(vd
->guest
.fb
);
2561 int height
= pixman_image_get_height(vd
->guest
.fb
);
2566 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2567 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2568 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2570 rect
->updated
= false;
2574 qemu_timersub(tv
, &VNC_REFRESH_STATS
, &res
);
2576 if (timercmp(&vd
->guest
.last_freq_check
, &res
, >)) {
2579 vd
->guest
.last_freq_check
= *tv
;
2581 for (y
= 0; y
< height
; y
+= VNC_STAT_RECT
) {
2582 for (x
= 0; x
< width
; x
+= VNC_STAT_RECT
) {
2583 VncRectStat
*rect
= vnc_stat_rect(vd
, x
, y
);
2584 int count
= ARRAY_SIZE(rect
->times
);
2585 struct timeval min
, max
;
2587 if (!timerisset(&rect
->times
[count
- 1])) {
2591 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2592 qemu_timersub(tv
, &max
, &res
);
2594 if (timercmp(&res
, &VNC_REFRESH_LOSSY
, >)) {
2596 has_dirty
+= vnc_refresh_lossy_rect(vd
, x
, y
);
2597 memset(rect
->times
, 0, sizeof (rect
->times
));
2601 min
= rect
->times
[rect
->idx
];
2602 max
= rect
->times
[(rect
->idx
+ count
- 1) % count
];
2603 qemu_timersub(&max
, &min
, &res
);
2605 rect
->freq
= res
.tv_sec
+ res
.tv_usec
/ 1000000.;
2606 rect
->freq
/= count
;
2607 rect
->freq
= 1. / rect
->freq
;
2613 double vnc_update_freq(VncState
*vs
, int x
, int y
, int w
, int h
)
2619 x
= (x
/ VNC_STAT_RECT
) * VNC_STAT_RECT
;
2620 y
= (y
/ VNC_STAT_RECT
) * VNC_STAT_RECT
;
2622 for (j
= y
; j
<= y
+ h
; j
+= VNC_STAT_RECT
) {
2623 for (i
= x
; i
<= x
+ w
; i
+= VNC_STAT_RECT
) {
2624 total
+= vnc_stat_rect(vs
->vd
, i
, j
)->freq
;
2636 static void vnc_rect_updated(VncDisplay
*vd
, int x
, int y
, struct timeval
* tv
)
2640 rect
= vnc_stat_rect(vd
, x
, y
);
2641 if (rect
->updated
) {
2644 rect
->times
[rect
->idx
] = *tv
;
2645 rect
->idx
= (rect
->idx
+ 1) % ARRAY_SIZE(rect
->times
);
2646 rect
->updated
= true;
2649 static int vnc_refresh_server_surface(VncDisplay
*vd
)
2651 int width
= pixman_image_get_width(vd
->guest
.fb
);
2652 int height
= pixman_image_get_height(vd
->guest
.fb
);
2654 uint8_t *guest_row0
= NULL
, *server_row0
;
2655 int guest_stride
= 0, server_stride
;
2659 pixman_image_t
*tmpbuf
= NULL
;
2661 struct timeval tv
= { 0, 0 };
2663 if (!vd
->non_adaptive
) {
2664 gettimeofday(&tv
, NULL
);
2665 has_dirty
= vnc_update_stats(vd
, &tv
);
2669 * Walk through the guest dirty map.
2670 * Check and copy modified bits from guest to server surface.
2671 * Update server dirty map.
2673 cmp_bytes
= VNC_DIRTY_PIXELS_PER_BIT
* VNC_SERVER_FB_BYTES
;
2674 if (cmp_bytes
> vnc_server_fb_stride(vd
)) {
2675 cmp_bytes
= vnc_server_fb_stride(vd
);
2677 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2678 int width
= pixman_image_get_width(vd
->server
);
2679 tmpbuf
= qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT
, width
);
2681 guest_row0
= (uint8_t *)pixman_image_get_data(vd
->guest
.fb
);
2682 guest_stride
= pixman_image_get_stride(vd
->guest
.fb
);
2684 server_row0
= (uint8_t *)pixman_image_get_data(vd
->server
);
2685 server_stride
= pixman_image_get_stride(vd
->server
);
2690 uint8_t *guest_ptr
, *server_ptr
;
2691 unsigned long offset
= find_next_bit((unsigned long *) &vd
->guest
.dirty
,
2692 height
* VNC_DIRTY_BPL(&vd
->guest
),
2693 y
* VNC_DIRTY_BPL(&vd
->guest
));
2694 if (offset
== height
* VNC_DIRTY_BPL(&vd
->guest
)) {
2695 /* no more dirty bits */
2698 y
= offset
/ VNC_DIRTY_BPL(&vd
->guest
);
2699 x
= offset
% VNC_DIRTY_BPL(&vd
->guest
);
2701 server_ptr
= server_row0
+ y
* server_stride
+ x
* cmp_bytes
;
2703 if (vd
->guest
.format
!= VNC_SERVER_FB_FORMAT
) {
2704 qemu_pixman_linebuf_fill(tmpbuf
, vd
->guest
.fb
, width
, 0, y
);
2705 guest_ptr
= (uint8_t *)pixman_image_get_data(tmpbuf
);
2707 guest_ptr
= guest_row0
+ y
* guest_stride
;
2709 guest_ptr
+= x
* cmp_bytes
;
2711 for (; x
< DIV_ROUND_UP(width
, VNC_DIRTY_PIXELS_PER_BIT
);
2712 x
++, guest_ptr
+= cmp_bytes
, server_ptr
+= cmp_bytes
) {
2713 if (!test_and_clear_bit(x
, vd
->guest
.dirty
[y
])) {
2716 if (memcmp(server_ptr
, guest_ptr
, cmp_bytes
) == 0) {
2719 memcpy(server_ptr
, guest_ptr
, cmp_bytes
);
2720 if (!vd
->non_adaptive
) {
2721 vnc_rect_updated(vd
, x
* VNC_DIRTY_PIXELS_PER_BIT
,
2724 QTAILQ_FOREACH(vs
, &vd
->clients
, next
) {
2725 set_bit(x
, vs
->dirty
[y
]);
2732 qemu_pixman_image_unref(tmpbuf
);
2736 static void vnc_refresh(DisplayChangeListener
*dcl
)
2738 VncDisplay
*vd
= container_of(dcl
, VncDisplay
, dcl
);
2740 int has_dirty
, rects
= 0;
2742 graphic_hw_update(NULL
);
2744 if (vnc_trylock_display(vd
)) {
2745 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2749 has_dirty
= vnc_refresh_server_surface(vd
);
2750 vnc_unlock_display(vd
);
2752 QTAILQ_FOREACH_SAFE(vs
, &vd
->clients
, next
, vn
) {
2753 rects
+= vnc_update_client(vs
, has_dirty
, false);
2754 /* vs might be free()ed here */
2757 if (QTAILQ_EMPTY(&vd
->clients
)) {
2758 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_MAX
);
2762 if (has_dirty
&& rects
) {
2763 vd
->dcl
.update_interval
/= 2;
2764 if (vd
->dcl
.update_interval
< VNC_REFRESH_INTERVAL_BASE
) {
2765 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_BASE
;
2768 vd
->dcl
.update_interval
+= VNC_REFRESH_INTERVAL_INC
;
2769 if (vd
->dcl
.update_interval
> VNC_REFRESH_INTERVAL_MAX
) {
2770 vd
->dcl
.update_interval
= VNC_REFRESH_INTERVAL_MAX
;
2775 static void vnc_connect(VncDisplay
*vd
, int csock
,
2776 bool skipauth
, bool websocket
)
2778 VncState
*vs
= g_malloc0(sizeof(VncState
));
2784 vs
->auth
= VNC_AUTH_NONE
;
2785 #ifdef CONFIG_VNC_TLS
2786 vs
->subauth
= VNC_AUTH_INVALID
;
2789 vs
->auth
= vd
->auth
;
2790 #ifdef CONFIG_VNC_TLS
2791 vs
->subauth
= vd
->subauth
;
2795 vs
->lossy_rect
= g_malloc0(VNC_STAT_ROWS
* sizeof (*vs
->lossy_rect
));
2796 for (i
= 0; i
< VNC_STAT_ROWS
; ++i
) {
2797 vs
->lossy_rect
[i
] = g_malloc0(VNC_STAT_COLS
* sizeof (uint8_t));
2800 VNC_DEBUG("New client on socket %d\n", csock
);
2801 update_displaychangelistener(&vd
->dcl
, VNC_REFRESH_INTERVAL_BASE
);
2802 qemu_set_nonblock(vs
->csock
);
2803 #ifdef CONFIG_VNC_WS
2806 #ifdef CONFIG_VNC_TLS
2807 if (vd
->tls
.x509cert
) {
2808 qemu_set_fd_handler2(vs
->csock
, NULL
, vncws_tls_handshake_peek
,
2811 #endif /* CONFIG_VNC_TLS */
2813 qemu_set_fd_handler2(vs
->csock
, NULL
, vncws_handshake_read
,
2817 #endif /* CONFIG_VNC_WS */
2819 qemu_set_fd_handler2(vs
->csock
, NULL
, vnc_client_read
, NULL
, vs
);
2822 vnc_client_cache_addr(vs
);
2823 vnc_qmp_event(vs
, QEVENT_VNC_CONNECTED
);
2824 vnc_set_share_mode(vs
, VNC_SHARE_MODE_CONNECTING
);
2828 #ifdef CONFIG_VNC_WS
2836 void vnc_init_state(VncState
*vs
)
2838 vs
->initialized
= true;
2839 VncDisplay
*vd
= vs
->vd
;
2844 vs
->as
.freq
= 44100;
2845 vs
->as
.nchannels
= 2;
2846 vs
->as
.fmt
= AUD_FMT_S16
;
2847 vs
->as
.endianness
= 0;
2849 qemu_mutex_init(&vs
->output_mutex
);
2850 vs
->bh
= qemu_bh_new(vnc_jobs_bh
, vs
);
2852 QTAILQ_INSERT_HEAD(&vd
->clients
, vs
, next
);
2854 graphic_hw_update(NULL
);
2856 vnc_write(vs
, "RFB 003.008\n", 12);
2858 vnc_read_when(vs
, protocol_version
, 12);
2860 if (vs
->vd
->lock_key_sync
)
2861 vs
->led
= qemu_add_led_event_handler(kbd_leds
, vs
);
2863 vs
->mouse_mode_notifier
.notify
= check_pointer_type_change
;
2864 qemu_add_mouse_mode_change_notifier(&vs
->mouse_mode_notifier
);
2866 /* vs might be free()ed here */
2869 static void vnc_listen_read(void *opaque
, bool websocket
)
2871 VncDisplay
*vs
= opaque
;
2872 struct sockaddr_in addr
;
2873 socklen_t addrlen
= sizeof(addr
);
2877 graphic_hw_update(NULL
);
2878 #ifdef CONFIG_VNC_WS
2880 csock
= qemu_accept(vs
->lwebsock
, (struct sockaddr
*)&addr
, &addrlen
);
2882 #endif /* CONFIG_VNC_WS */
2884 csock
= qemu_accept(vs
->lsock
, (struct sockaddr
*)&addr
, &addrlen
);
2888 vnc_connect(vs
, csock
, false, websocket
);
2892 static void vnc_listen_regular_read(void *opaque
)
2894 vnc_listen_read(opaque
, false);
2897 #ifdef CONFIG_VNC_WS
2898 static void vnc_listen_websocket_read(void *opaque
)
2900 vnc_listen_read(opaque
, true);
2902 #endif /* CONFIG_VNC_WS */
2904 static const DisplayChangeListenerOps dcl_ops
= {
2906 .dpy_refresh
= vnc_refresh
,
2907 .dpy_gfx_copy
= vnc_dpy_copy
,
2908 .dpy_gfx_update
= vnc_dpy_update
,
2909 .dpy_gfx_switch
= vnc_dpy_switch
,
2910 .dpy_mouse_set
= vnc_mouse_set
,
2911 .dpy_cursor_define
= vnc_dpy_cursor_define
,
2914 void vnc_display_init(DisplayState
*ds
)
2916 VncDisplay
*vs
= g_malloc0(sizeof(*vs
));
2921 #ifdef CONFIG_VNC_WS
2925 QTAILQ_INIT(&vs
->clients
);
2926 vs
->expires
= TIME_MAX
;
2928 if (keyboard_layout
)
2929 vs
->kbd_layout
= init_keyboard_layout(name2keysym
, keyboard_layout
);
2931 vs
->kbd_layout
= init_keyboard_layout(name2keysym
, "en-us");
2933 if (!vs
->kbd_layout
)
2936 qemu_mutex_init(&vs
->mutex
);
2937 vnc_start_worker_thread();
2939 vs
->dcl
.ops
= &dcl_ops
;
2940 register_displaychangelistener(&vs
->dcl
);
2944 static void vnc_display_close(DisplayState
*ds
)
2946 VncDisplay
*vs
= vnc_display
;
2951 g_free(vs
->display
);
2954 if (vs
->lsock
!= -1) {
2955 qemu_set_fd_handler2(vs
->lsock
, NULL
, NULL
, NULL
, NULL
);
2959 #ifdef CONFIG_VNC_WS
2960 g_free(vs
->ws_display
);
2961 vs
->ws_display
= NULL
;
2962 if (vs
->lwebsock
!= -1) {
2963 qemu_set_fd_handler2(vs
->lwebsock
, NULL
, NULL
, NULL
, NULL
);
2964 close(vs
->lwebsock
);
2967 #endif /* CONFIG_VNC_WS */
2968 vs
->auth
= VNC_AUTH_INVALID
;
2969 #ifdef CONFIG_VNC_TLS
2970 vs
->subauth
= VNC_AUTH_INVALID
;
2971 vs
->tls
.x509verify
= 0;
2975 static int vnc_display_disable_login(DisplayState
*ds
)
2977 VncDisplay
*vs
= vnc_display
;
2984 g_free(vs
->password
);
2987 vs
->password
= NULL
;
2988 if (vs
->auth
== VNC_AUTH_NONE
) {
2989 vs
->auth
= VNC_AUTH_VNC
;
2995 int vnc_display_password(DisplayState
*ds
, const char *password
)
2997 VncDisplay
*vs
= vnc_display
;
3004 /* This is not the intention of this interface but err on the side
3006 return vnc_display_disable_login(ds
);
3010 g_free(vs
->password
);
3011 vs
->password
= NULL
;
3013 vs
->password
= g_strdup(password
);
3014 if (vs
->auth
== VNC_AUTH_NONE
) {
3015 vs
->auth
= VNC_AUTH_VNC
;
3021 int vnc_display_pw_expire(DisplayState
*ds
, time_t expires
)
3023 VncDisplay
*vs
= vnc_display
;
3029 vs
->expires
= expires
;
3033 char *vnc_display_local_addr(DisplayState
*ds
)
3035 VncDisplay
*vs
= vnc_display
;
3037 return vnc_socket_local_addr("%s:%s", vs
->lsock
);
3040 void vnc_display_open(DisplayState
*ds
, const char *display
, Error
**errp
)
3042 VncDisplay
*vs
= vnc_display
;
3043 const char *options
;
3046 #ifdef CONFIG_VNC_TLS
3047 int tls
= 0, x509
= 0;
3049 #ifdef CONFIG_VNC_SASL
3053 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
3056 int lock_key_sync
= 1;
3059 error_setg(errp
, "VNC display not active");
3062 vnc_display_close(ds
);
3063 if (strcmp(display
, "none") == 0)
3066 vs
->display
= g_strdup(display
);
3067 vs
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3070 while ((options
= strchr(options
, ','))) {
3072 if (strncmp(options
, "password", 8) == 0) {
3073 if (fips_get_state()) {
3075 "VNC password auth disabled due to FIPS mode, "
3076 "consider using the VeNCrypt or SASL authentication "
3077 "methods as an alternative");
3080 password
= 1; /* Require password auth */
3081 } else if (strncmp(options
, "reverse", 7) == 0) {
3083 } else if (strncmp(options
, "no-lock-key-sync", 16) == 0) {
3085 #ifdef CONFIG_VNC_SASL
3086 } else if (strncmp(options
, "sasl", 4) == 0) {
3087 sasl
= 1; /* Require SASL auth */
3089 #ifdef CONFIG_VNC_WS
3090 } else if (strncmp(options
, "websocket", 9) == 0) {
3094 /* Check for 'websocket=<port>' */
3095 start
= strchr(options
, '=');
3096 end
= strchr(options
, ',');
3097 if (start
&& (!end
|| (start
< end
))) {
3098 int len
= end
? end
-(start
+1) : strlen(start
+1);
3100 /* extract the host specification from display */
3101 char *host
= NULL
, *port
= NULL
, *host_end
= NULL
;
3102 port
= g_strndup(start
+ 1, len
);
3104 /* ipv6 hosts have colons */
3105 end
= strchr(display
, ',');
3106 host_end
= g_strrstr_len(display
, end
- display
, ":");
3109 host
= g_strndup(display
, host_end
- display
+ 1);
3111 host
= g_strndup(":", 1);
3113 vs
->ws_display
= g_strconcat(host
, port
, NULL
);
3118 #endif /* CONFIG_VNC_WS */
3119 #ifdef CONFIG_VNC_TLS
3120 } else if (strncmp(options
, "tls", 3) == 0) {
3121 tls
= 1; /* Require TLS */
3122 } else if (strncmp(options
, "x509", 4) == 0) {
3124 x509
= 1; /* Require x509 certificates */
3125 if (strncmp(options
, "x509verify", 10) == 0)
3126 vs
->tls
.x509verify
= 1; /* ...and verify client certs */
3128 /* Now check for 'x509=/some/path' postfix
3129 * and use that to setup x509 certificate/key paths */
3130 start
= strchr(options
, '=');
3131 end
= strchr(options
, ',');
3132 if (start
&& (!end
|| (start
< end
))) {
3133 int len
= end
? end
-(start
+1) : strlen(start
+1);
3134 char *path
= g_strndup(start
+ 1, len
);
3136 VNC_DEBUG("Trying certificate path '%s'\n", path
);
3137 if (vnc_tls_set_x509_creds_dir(vs
, path
) < 0) {
3138 error_setg(errp
, "Failed to find x509 certificates/keys in %s", path
);
3144 error_setg(errp
, "No certificate path provided");
3148 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
3149 } else if (strncmp(options
, "acl", 3) == 0) {
3152 } else if (strncmp(options
, "lossy", 5) == 0) {
3153 #ifdef CONFIG_VNC_JPEG
3156 } else if (strncmp(options
, "non-adaptive", 12) == 0) {
3157 vs
->non_adaptive
= true;
3158 } else if (strncmp(options
, "share=", 6) == 0) {
3159 if (strncmp(options
+6, "ignore", 6) == 0) {
3160 vs
->share_policy
= VNC_SHARE_POLICY_IGNORE
;
3161 } else if (strncmp(options
+6, "allow-exclusive", 15) == 0) {
3162 vs
->share_policy
= VNC_SHARE_POLICY_ALLOW_EXCLUSIVE
;
3163 } else if (strncmp(options
+6, "force-shared", 12) == 0) {
3164 vs
->share_policy
= VNC_SHARE_POLICY_FORCE_SHARED
;
3166 error_setg(errp
, "unknown vnc share= option");
3172 /* adaptive updates are only used with tight encoding and
3173 * if lossy updates are enabled so we can disable all the
3174 * calculations otherwise */
3176 vs
->non_adaptive
= true;
3179 #ifdef CONFIG_VNC_TLS
3180 if (acl
&& x509
&& vs
->tls
.x509verify
) {
3181 if (!(vs
->tls
.acl
= qemu_acl_init("vnc.x509dname"))) {
3182 fprintf(stderr
, "Failed to create x509 dname ACL\n");
3187 #ifdef CONFIG_VNC_SASL
3189 if (!(vs
->sasl
.acl
= qemu_acl_init("vnc.username"))) {
3190 fprintf(stderr
, "Failed to create username ACL\n");
3197 * Combinations we support here:
3199 * - no-auth (clear text, no auth)
3200 * - password (clear text, weak auth)
3201 * - sasl (encrypt, good auth *IF* using Kerberos via GSSAPI)
3202 * - tls (encrypt, weak anonymous creds, no auth)
3203 * - tls + password (encrypt, weak anonymous creds, weak auth)
3204 * - tls + sasl (encrypt, weak anonymous creds, good auth)
3205 * - tls + x509 (encrypt, good x509 creds, no auth)
3206 * - tls + x509 + password (encrypt, good x509 creds, weak auth)
3207 * - tls + x509 + sasl (encrypt, good x509 creds, good auth)
3209 * NB1. TLS is a stackable auth scheme.
3210 * NB2. the x509 schemes have option to validate a client cert dname
3213 #ifdef CONFIG_VNC_TLS
3215 vs
->auth
= VNC_AUTH_VENCRYPT
;
3217 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3218 vs
->subauth
= VNC_AUTH_VENCRYPT_X509VNC
;
3220 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3221 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSVNC
;
3224 #endif /* CONFIG_VNC_TLS */
3225 VNC_DEBUG("Initializing VNC server with password auth\n");
3226 vs
->auth
= VNC_AUTH_VNC
;
3227 #ifdef CONFIG_VNC_TLS
3228 vs
->subauth
= VNC_AUTH_INVALID
;
3230 #endif /* CONFIG_VNC_TLS */
3231 #ifdef CONFIG_VNC_SASL
3233 #ifdef CONFIG_VNC_TLS
3235 vs
->auth
= VNC_AUTH_VENCRYPT
;
3237 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3238 vs
->subauth
= VNC_AUTH_VENCRYPT_X509SASL
;
3240 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3241 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSSASL
;
3244 #endif /* CONFIG_VNC_TLS */
3245 VNC_DEBUG("Initializing VNC server with SASL auth\n");
3246 vs
->auth
= VNC_AUTH_SASL
;
3247 #ifdef CONFIG_VNC_TLS
3248 vs
->subauth
= VNC_AUTH_INVALID
;
3250 #endif /* CONFIG_VNC_TLS */
3251 #endif /* CONFIG_VNC_SASL */
3253 #ifdef CONFIG_VNC_TLS
3255 vs
->auth
= VNC_AUTH_VENCRYPT
;
3257 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3258 vs
->subauth
= VNC_AUTH_VENCRYPT_X509NONE
;
3260 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3261 vs
->subauth
= VNC_AUTH_VENCRYPT_TLSNONE
;
3265 VNC_DEBUG("Initializing VNC server with no auth\n");
3266 vs
->auth
= VNC_AUTH_NONE
;
3267 #ifdef CONFIG_VNC_TLS
3268 vs
->subauth
= VNC_AUTH_INVALID
;
3273 #ifdef CONFIG_VNC_SASL
3274 if ((saslErr
= sasl_server_init(NULL
, "qemu")) != SASL_OK
) {
3275 error_setg(errp
, "Failed to initialize SASL auth: %s",
3276 sasl_errstring(saslErr
, NULL
, NULL
));
3280 vs
->lock_key_sync
= lock_key_sync
;
3283 /* connect to viewer */
3286 #ifdef CONFIG_VNC_WS
3289 if (strncmp(display
, "unix:", 5) == 0) {
3290 csock
= unix_connect(display
+5, errp
);
3292 csock
= inet_connect(display
, errp
);
3297 vnc_connect(vs
, csock
, false, false);
3299 /* listen for connects */
3301 dpy
= g_malloc(256);
3302 if (strncmp(display
, "unix:", 5) == 0) {
3303 pstrcpy(dpy
, 256, "unix:");
3304 vs
->lsock
= unix_listen(display
+5, dpy
+5, 256-5, errp
);
3306 vs
->lsock
= inet_listen(display
, dpy
, 256,
3307 SOCK_STREAM
, 5900, errp
);
3308 if (vs
->lsock
< 0) {
3312 #ifdef CONFIG_VNC_WS
3313 if (vs
->websocket
) {
3314 if (vs
->ws_display
) {
3315 vs
->lwebsock
= inet_listen(vs
->ws_display
, NULL
, 256,
3316 SOCK_STREAM
, 0, errp
);
3318 vs
->lwebsock
= inet_listen(vs
->display
, NULL
, 256,
3319 SOCK_STREAM
, 5700, errp
);
3322 if (vs
->lwebsock
< 0) {
3331 #endif /* CONFIG_VNC_WS */
3333 g_free(vs
->display
);
3335 qemu_set_fd_handler2(vs
->lsock
, NULL
,
3336 vnc_listen_regular_read
, NULL
, vs
);
3337 #ifdef CONFIG_VNC_WS
3338 if (vs
->websocket
) {
3339 qemu_set_fd_handler2(vs
->lwebsock
, NULL
,
3340 vnc_listen_websocket_read
, NULL
, vs
);
3342 #endif /* CONFIG_VNC_WS */
3347 g_free(vs
->display
);
3349 #ifdef CONFIG_VNC_WS
3350 g_free(vs
->ws_display
);
3351 vs
->ws_display
= NULL
;
3352 #endif /* CONFIG_VNC_WS */
3355 void vnc_display_add_client(DisplayState
*ds
, int csock
, bool skipauth
)
3357 VncDisplay
*vs
= vnc_display
;
3359 vnc_connect(vs
, csock
, skipauth
, false);