xref: /openbmc/qemu/ui/vnc.c (revision ad4ec2798fd7066bc9d879dcbdeae96073ad370f)
1  /*
2   * QEMU VNC display driver
3   *
4   * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5   * Copyright (C) 2006 Fabrice Bellard
6   * Copyright (C) 2009 Red Hat, Inc
7   *
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:
14   *
15   * The above copyright notice and this permission notice shall be included in
16   * all copies or substantial portions of the Software.
17   *
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
24   * THE SOFTWARE.
25   */
26  
27  #include "qemu/osdep.h"
28  #include "vnc.h"
29  #include "vnc-jobs.h"
30  #include "trace.h"
31  #include "hw/qdev-core.h"
32  #include "sysemu/sysemu.h"
33  #include "sysemu/runstate.h"
34  #include "qemu/error-report.h"
35  #include "qemu/main-loop.h"
36  #include "qemu/module.h"
37  #include "qemu/option.h"
38  #include "qemu/sockets.h"
39  #include "qemu/timer.h"
40  #include "authz/list.h"
41  #include "qemu/config-file.h"
42  #include "qapi/qapi-emit-events.h"
43  #include "qapi/qapi-events-ui.h"
44  #include "qapi/error.h"
45  #include "qapi/qapi-commands-ui.h"
46  #include "ui/input.h"
47  #include "crypto/hash.h"
48  #include "crypto/tlscreds.h"
49  #include "crypto/tlscredsanon.h"
50  #include "crypto/tlscredsx509.h"
51  #include "crypto/random.h"
52  #include "crypto/secret_common.h"
53  #include "qom/object_interfaces.h"
54  #include "qemu/cutils.h"
55  #include "qemu/help_option.h"
56  #include "io/dns-resolver.h"
57  #include "monitor/monitor.h"
58  
59  #define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
60  #define VNC_REFRESH_INTERVAL_INC  50
61  #define VNC_REFRESH_INTERVAL_MAX  GUI_REFRESH_INTERVAL_IDLE
62  static const struct timeval VNC_REFRESH_STATS = { 0, 500000 };
63  static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
64  
65  #include "vnc_keysym.h"
66  #include "crypto/cipher.h"
67  
68  static QTAILQ_HEAD(, VncDisplay) vnc_displays =
69      QTAILQ_HEAD_INITIALIZER(vnc_displays);
70  
71  static int vnc_cursor_define(VncState *vs);
72  static void vnc_update_throttle_offset(VncState *vs);
73  
74  static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
75  {
76  #ifdef _VNC_DEBUG
77      static const char *mn[] = {
78          [0]                           = "undefined",
79          [VNC_SHARE_MODE_CONNECTING]   = "connecting",
80          [VNC_SHARE_MODE_SHARED]       = "shared",
81          [VNC_SHARE_MODE_EXCLUSIVE]    = "exclusive",
82          [VNC_SHARE_MODE_DISCONNECTED] = "disconnected",
83      };
84      fprintf(stderr, "%s/%p: %s -> %s\n", __func__,
85              vs->ioc, mn[vs->share_mode], mn[mode]);
86  #endif
87  
88      switch (vs->share_mode) {
89      case VNC_SHARE_MODE_CONNECTING:
90          vs->vd->num_connecting--;
91          break;
92      case VNC_SHARE_MODE_SHARED:
93          vs->vd->num_shared--;
94          break;
95      case VNC_SHARE_MODE_EXCLUSIVE:
96          vs->vd->num_exclusive--;
97          break;
98      default:
99          break;
100      }
101  
102      vs->share_mode = mode;
103  
104      switch (vs->share_mode) {
105      case VNC_SHARE_MODE_CONNECTING:
106          vs->vd->num_connecting++;
107          break;
108      case VNC_SHARE_MODE_SHARED:
109          vs->vd->num_shared++;
110          break;
111      case VNC_SHARE_MODE_EXCLUSIVE:
112          vs->vd->num_exclusive++;
113          break;
114      default:
115          break;
116      }
117  }
118  
119  
120  static void vnc_init_basic_info(SocketAddress *addr,
121                                  VncBasicInfo *info,
122                                  Error **errp)
123  {
124      switch (addr->type) {
125      case SOCKET_ADDRESS_TYPE_INET:
126          info->host = g_strdup(addr->u.inet.host);
127          info->service = g_strdup(addr->u.inet.port);
128          if (addr->u.inet.ipv6) {
129              info->family = NETWORK_ADDRESS_FAMILY_IPV6;
130          } else {
131              info->family = NETWORK_ADDRESS_FAMILY_IPV4;
132          }
133          break;
134  
135      case SOCKET_ADDRESS_TYPE_UNIX:
136          info->host = g_strdup("");
137          info->service = g_strdup(addr->u.q_unix.path);
138          info->family = NETWORK_ADDRESS_FAMILY_UNIX;
139          break;
140  
141      case SOCKET_ADDRESS_TYPE_VSOCK:
142      case SOCKET_ADDRESS_TYPE_FD:
143          error_setg(errp, "Unsupported socket address type %s",
144                     SocketAddressType_str(addr->type));
145          break;
146      default:
147          abort();
148      }
149  
150      return;
151  }
152  
153  static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
154                                                   VncBasicInfo *info,
155                                                   Error **errp)
156  {
157      SocketAddress *addr = NULL;
158  
159      if (!ioc) {
160          error_setg(errp, "No listener socket available");
161          return;
162      }
163  
164      addr = qio_channel_socket_get_local_address(ioc, errp);
165      if (!addr) {
166          return;
167      }
168  
169      vnc_init_basic_info(addr, info, errp);
170      qapi_free_SocketAddress(addr);
171  }
172  
173  static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
174                                                   VncBasicInfo *info,
175                                                   Error **errp)
176  {
177      SocketAddress *addr = NULL;
178  
179      addr = qio_channel_socket_get_remote_address(ioc, errp);
180      if (!addr) {
181          return;
182      }
183  
184      vnc_init_basic_info(addr, info, errp);
185      qapi_free_SocketAddress(addr);
186  }
187  
188  static const char *vnc_auth_name(VncDisplay *vd) {
189      switch (vd->auth) {
190      case VNC_AUTH_INVALID:
191          return "invalid";
192      case VNC_AUTH_NONE:
193          return "none";
194      case VNC_AUTH_VNC:
195          return "vnc";
196      case VNC_AUTH_RA2:
197          return "ra2";
198      case VNC_AUTH_RA2NE:
199          return "ra2ne";
200      case VNC_AUTH_TIGHT:
201          return "tight";
202      case VNC_AUTH_ULTRA:
203          return "ultra";
204      case VNC_AUTH_TLS:
205          return "tls";
206      case VNC_AUTH_VENCRYPT:
207          switch (vd->subauth) {
208          case VNC_AUTH_VENCRYPT_PLAIN:
209              return "vencrypt+plain";
210          case VNC_AUTH_VENCRYPT_TLSNONE:
211              return "vencrypt+tls+none";
212          case VNC_AUTH_VENCRYPT_TLSVNC:
213              return "vencrypt+tls+vnc";
214          case VNC_AUTH_VENCRYPT_TLSPLAIN:
215              return "vencrypt+tls+plain";
216          case VNC_AUTH_VENCRYPT_X509NONE:
217              return "vencrypt+x509+none";
218          case VNC_AUTH_VENCRYPT_X509VNC:
219              return "vencrypt+x509+vnc";
220          case VNC_AUTH_VENCRYPT_X509PLAIN:
221              return "vencrypt+x509+plain";
222          case VNC_AUTH_VENCRYPT_TLSSASL:
223              return "vencrypt+tls+sasl";
224          case VNC_AUTH_VENCRYPT_X509SASL:
225              return "vencrypt+x509+sasl";
226          default:
227              return "vencrypt";
228          }
229      case VNC_AUTH_SASL:
230          return "sasl";
231      }
232      return "unknown";
233  }
234  
235  static VncServerInfo *vnc_server_info_get(VncDisplay *vd)
236  {
237      VncServerInfo *info;
238      Error *err = NULL;
239  
240      if (!vd->listener || !vd->listener->nsioc) {
241          return NULL;
242      }
243  
244      info = g_malloc0(sizeof(*info));
245      vnc_init_basic_info_from_server_addr(vd->listener->sioc[0],
246                                           qapi_VncServerInfo_base(info), &err);
247      info->auth = g_strdup(vnc_auth_name(vd));
248      if (err) {
249          qapi_free_VncServerInfo(info);
250          info = NULL;
251          error_free(err);
252      }
253      return info;
254  }
255  
256  static void vnc_client_cache_auth(VncState *client)
257  {
258      if (!client->info) {
259          return;
260      }
261  
262      if (client->tls) {
263          client->info->x509_dname =
264              qcrypto_tls_session_get_peer_name(client->tls);
265      }
266  #ifdef CONFIG_VNC_SASL
267      if (client->sasl.conn &&
268          client->sasl.username) {
269          client->info->sasl_username = g_strdup(client->sasl.username);
270      }
271  #endif
272  }
273  
274  static void vnc_client_cache_addr(VncState *client)
275  {
276      Error *err = NULL;
277  
278      client->info = g_malloc0(sizeof(*client->info));
279      vnc_init_basic_info_from_remote_addr(client->sioc,
280                                           qapi_VncClientInfo_base(client->info),
281                                           &err);
282      client->info->websocket = client->websocket;
283      if (err) {
284          qapi_free_VncClientInfo(client->info);
285          client->info = NULL;
286          error_free(err);
287      }
288  }
289  
290  static void vnc_qmp_event(VncState *vs, QAPIEvent event)
291  {
292      VncServerInfo *si;
293  
294      if (!vs->info) {
295          return;
296      }
297  
298      si = vnc_server_info_get(vs->vd);
299      if (!si) {
300          return;
301      }
302  
303      switch (event) {
304      case QAPI_EVENT_VNC_CONNECTED:
305          qapi_event_send_vnc_connected(si, qapi_VncClientInfo_base(vs->info));
306          break;
307      case QAPI_EVENT_VNC_INITIALIZED:
308          qapi_event_send_vnc_initialized(si, vs->info);
309          break;
310      case QAPI_EVENT_VNC_DISCONNECTED:
311          qapi_event_send_vnc_disconnected(si, vs->info);
312          break;
313      default:
314          break;
315      }
316  
317      qapi_free_VncServerInfo(si);
318  }
319  
320  static VncClientInfo *qmp_query_vnc_client(const VncState *client)
321  {
322      VncClientInfo *info;
323      Error *err = NULL;
324  
325      info = g_malloc0(sizeof(*info));
326  
327      vnc_init_basic_info_from_remote_addr(client->sioc,
328                                           qapi_VncClientInfo_base(info),
329                                           &err);
330      if (err) {
331          error_free(err);
332          qapi_free_VncClientInfo(info);
333          return NULL;
334      }
335  
336      info->websocket = client->websocket;
337  
338      if (client->tls) {
339          info->x509_dname = qcrypto_tls_session_get_peer_name(client->tls);
340      }
341  #ifdef CONFIG_VNC_SASL
342      if (client->sasl.conn && client->sasl.username) {
343          info->sasl_username = g_strdup(client->sasl.username);
344      }
345  #endif
346  
347      return info;
348  }
349  
350  static VncDisplay *vnc_display_find(const char *id)
351  {
352      VncDisplay *vd;
353  
354      if (id == NULL) {
355          return QTAILQ_FIRST(&vnc_displays);
356      }
357      QTAILQ_FOREACH(vd, &vnc_displays, next) {
358          if (strcmp(id, vd->id) == 0) {
359              return vd;
360          }
361      }
362      return NULL;
363  }
364  
365  static VncClientInfoList *qmp_query_client_list(VncDisplay *vd)
366  {
367      VncClientInfoList *prev = NULL;
368      VncState *client;
369  
370      QTAILQ_FOREACH(client, &vd->clients, next) {
371          QAPI_LIST_PREPEND(prev, qmp_query_vnc_client(client));
372      }
373      return prev;
374  }
375  
376  VncInfo *qmp_query_vnc(Error **errp)
377  {
378      VncInfo *info = g_malloc0(sizeof(*info));
379      VncDisplay *vd = vnc_display_find(NULL);
380      SocketAddress *addr = NULL;
381  
382      if (vd == NULL || !vd->listener || !vd->listener->nsioc) {
383          info->enabled = false;
384      } else {
385          info->enabled = true;
386  
387          /* for compatibility with the original command */
388          info->has_clients = true;
389          info->clients = qmp_query_client_list(vd);
390  
391          addr = qio_channel_socket_get_local_address(vd->listener->sioc[0],
392                                                      errp);
393          if (!addr) {
394              goto out_error;
395          }
396  
397          switch (addr->type) {
398          case SOCKET_ADDRESS_TYPE_INET:
399              info->host = g_strdup(addr->u.inet.host);
400              info->service = g_strdup(addr->u.inet.port);
401              if (addr->u.inet.ipv6) {
402                  info->family = NETWORK_ADDRESS_FAMILY_IPV6;
403              } else {
404                  info->family = NETWORK_ADDRESS_FAMILY_IPV4;
405              }
406              break;
407  
408          case SOCKET_ADDRESS_TYPE_UNIX:
409              info->host = g_strdup("");
410              info->service = g_strdup(addr->u.q_unix.path);
411              info->family = NETWORK_ADDRESS_FAMILY_UNIX;
412              break;
413  
414          case SOCKET_ADDRESS_TYPE_VSOCK:
415          case SOCKET_ADDRESS_TYPE_FD:
416              error_setg(errp, "Unsupported socket address type %s",
417                         SocketAddressType_str(addr->type));
418              goto out_error;
419          default:
420              abort();
421          }
422  
423          info->has_family = true;
424  
425          info->auth = g_strdup(vnc_auth_name(vd));
426      }
427  
428      qapi_free_SocketAddress(addr);
429      return info;
430  
431  out_error:
432      qapi_free_SocketAddress(addr);
433      qapi_free_VncInfo(info);
434      return NULL;
435  }
436  
437  
438  static void qmp_query_auth(int auth, int subauth,
439                             VncPrimaryAuth *qmp_auth,
440                             VncVencryptSubAuth *qmp_vencrypt,
441                             bool *qmp_has_vencrypt);
442  
443  static VncServerInfo2List *qmp_query_server_entry(QIOChannelSocket *ioc,
444                                                    bool websocket,
445                                                    int auth,
446                                                    int subauth,
447                                                    VncServerInfo2List *prev)
448  {
449      VncServerInfo2 *info;
450      Error *err = NULL;
451      SocketAddress *addr;
452  
453      addr = qio_channel_socket_get_local_address(ioc, NULL);
454      if (!addr) {
455          return prev;
456      }
457  
458      info = g_new0(VncServerInfo2, 1);
459      vnc_init_basic_info(addr, qapi_VncServerInfo2_base(info), &err);
460      qapi_free_SocketAddress(addr);
461      if (err) {
462          qapi_free_VncServerInfo2(info);
463          error_free(err);
464          return prev;
465      }
466      info->websocket = websocket;
467  
468      qmp_query_auth(auth, subauth, &info->auth,
469                     &info->vencrypt, &info->has_vencrypt);
470  
471      QAPI_LIST_PREPEND(prev, info);
472      return prev;
473  }
474  
475  static void qmp_query_auth(int auth, int subauth,
476                             VncPrimaryAuth *qmp_auth,
477                             VncVencryptSubAuth *qmp_vencrypt,
478                             bool *qmp_has_vencrypt)
479  {
480      switch (auth) {
481      case VNC_AUTH_VNC:
482          *qmp_auth = VNC_PRIMARY_AUTH_VNC;
483          break;
484      case VNC_AUTH_RA2:
485          *qmp_auth = VNC_PRIMARY_AUTH_RA2;
486          break;
487      case VNC_AUTH_RA2NE:
488          *qmp_auth = VNC_PRIMARY_AUTH_RA2NE;
489          break;
490      case VNC_AUTH_TIGHT:
491          *qmp_auth = VNC_PRIMARY_AUTH_TIGHT;
492          break;
493      case VNC_AUTH_ULTRA:
494          *qmp_auth = VNC_PRIMARY_AUTH_ULTRA;
495          break;
496      case VNC_AUTH_TLS:
497          *qmp_auth = VNC_PRIMARY_AUTH_TLS;
498          break;
499      case VNC_AUTH_VENCRYPT:
500          *qmp_auth = VNC_PRIMARY_AUTH_VENCRYPT;
501          *qmp_has_vencrypt = true;
502          switch (subauth) {
503          case VNC_AUTH_VENCRYPT_PLAIN:
504              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_PLAIN;
505              break;
506          case VNC_AUTH_VENCRYPT_TLSNONE:
507              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_NONE;
508              break;
509          case VNC_AUTH_VENCRYPT_TLSVNC:
510              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_VNC;
511              break;
512          case VNC_AUTH_VENCRYPT_TLSPLAIN:
513              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_PLAIN;
514              break;
515          case VNC_AUTH_VENCRYPT_X509NONE:
516              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_NONE;
517              break;
518          case VNC_AUTH_VENCRYPT_X509VNC:
519              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_VNC;
520              break;
521          case VNC_AUTH_VENCRYPT_X509PLAIN:
522              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_PLAIN;
523              break;
524          case VNC_AUTH_VENCRYPT_TLSSASL:
525              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_TLS_SASL;
526              break;
527          case VNC_AUTH_VENCRYPT_X509SASL:
528              *qmp_vencrypt = VNC_VENCRYPT_SUB_AUTH_X509_SASL;
529              break;
530          default:
531              *qmp_has_vencrypt = false;
532              break;
533          }
534          break;
535      case VNC_AUTH_SASL:
536          *qmp_auth = VNC_PRIMARY_AUTH_SASL;
537          break;
538      case VNC_AUTH_NONE:
539      default:
540          *qmp_auth = VNC_PRIMARY_AUTH_NONE;
541          break;
542      }
543  }
544  
545  VncInfo2List *qmp_query_vnc_servers(Error **errp)
546  {
547      VncInfo2List *prev = NULL;
548      VncInfo2 *info;
549      VncDisplay *vd;
550      DeviceState *dev;
551      size_t i;
552  
553      QTAILQ_FOREACH(vd, &vnc_displays, next) {
554          info = g_new0(VncInfo2, 1);
555          info->id = g_strdup(vd->id);
556          info->clients = qmp_query_client_list(vd);
557          qmp_query_auth(vd->auth, vd->subauth, &info->auth,
558                         &info->vencrypt, &info->has_vencrypt);
559          if (vd->dcl.con) {
560              dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
561                                                    "device", &error_abort));
562              info->display = g_strdup(dev->id);
563          }
564          for (i = 0; vd->listener != NULL && i < vd->listener->nsioc; i++) {
565              info->server = qmp_query_server_entry(
566                  vd->listener->sioc[i], false, vd->auth, vd->subauth,
567                  info->server);
568          }
569          for (i = 0; vd->wslistener != NULL && i < vd->wslistener->nsioc; i++) {
570              info->server = qmp_query_server_entry(
571                  vd->wslistener->sioc[i], true, vd->ws_auth,
572                  vd->ws_subauth, info->server);
573          }
574  
575          QAPI_LIST_PREPEND(prev, info);
576      }
577      return prev;
578  }
579  
580  bool vnc_display_reload_certs(const char *id, Error **errp)
581  {
582      VncDisplay *vd = vnc_display_find(id);
583      QCryptoTLSCredsClass *creds = NULL;
584  
585      if (!vd) {
586          error_setg(errp, "Can not find vnc display");
587          return false;
588      }
589  
590      if (!vd->tlscreds) {
591          error_setg(errp, "vnc tls is not enabled");
592          return false;
593      }
594  
595      creds = QCRYPTO_TLS_CREDS_GET_CLASS(OBJECT(vd->tlscreds));
596      if (creds->reload == NULL) {
597          error_setg(errp, "%s doesn't support to reload TLS credential",
598                     object_get_typename(OBJECT(vd->tlscreds)));
599          return false;
600      }
601      if (!creds->reload(vd->tlscreds, errp)) {
602          return false;
603      }
604  
605      return true;
606  }
607  
608  /* TODO
609     1) Get the queue working for IO.
610     2) there is some weirdness when using the -S option (the screen is grey
611        and not totally invalidated
612     3) resolutions > 1024
613  */
614  
615  static int vnc_update_client(VncState *vs, int has_dirty);
616  static void vnc_disconnect_start(VncState *vs);
617  
618  static void vnc_colordepth(VncState *vs);
619  static void framebuffer_update_request(VncState *vs, int incremental,
620                                         int x_position, int y_position,
621                                         int w, int h);
622  static void vnc_refresh(DisplayChangeListener *dcl);
623  static int vnc_refresh_server_surface(VncDisplay *vd);
624  
625  static int vnc_width(VncDisplay *vd)
626  {
627      return MIN(VNC_MAX_WIDTH, ROUND_UP(surface_width(vd->ds),
628                                         VNC_DIRTY_PIXELS_PER_BIT));
629  }
630  
631  static int vnc_true_width(VncDisplay *vd)
632  {
633      return MIN(VNC_MAX_WIDTH, surface_width(vd->ds));
634  }
635  
636  static int vnc_height(VncDisplay *vd)
637  {
638      return MIN(VNC_MAX_HEIGHT, surface_height(vd->ds));
639  }
640  
641  static void vnc_set_area_dirty(DECLARE_BITMAP(dirty[VNC_MAX_HEIGHT],
642                                 VNC_MAX_WIDTH / VNC_DIRTY_PIXELS_PER_BIT),
643                                 VncDisplay *vd,
644                                 int x, int y, int w, int h)
645  {
646      int width = vnc_width(vd);
647      int height = vnc_height(vd);
648  
649      /* this is needed this to ensure we updated all affected
650       * blocks if x % VNC_DIRTY_PIXELS_PER_BIT != 0 */
651      w += (x % VNC_DIRTY_PIXELS_PER_BIT);
652      x -= (x % VNC_DIRTY_PIXELS_PER_BIT);
653  
654      x = MIN(x, width);
655      y = MIN(y, height);
656      w = MIN(x + w, width) - x;
657      h = MIN(y + h, height);
658  
659      for (; y < h; y++) {
660          bitmap_set(dirty[y], x / VNC_DIRTY_PIXELS_PER_BIT,
661                     DIV_ROUND_UP(w, VNC_DIRTY_PIXELS_PER_BIT));
662      }
663  }
664  
665  static void vnc_dpy_update(DisplayChangeListener *dcl,
666                             int x, int y, int w, int h)
667  {
668      VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
669      struct VncSurface *s = &vd->guest;
670  
671      vnc_set_area_dirty(s->dirty, vd, x, y, w, h);
672  }
673  
674  void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
675                              int32_t encoding)
676  {
677      vnc_write_u16(vs, x);
678      vnc_write_u16(vs, y);
679      vnc_write_u16(vs, w);
680      vnc_write_u16(vs, h);
681  
682      vnc_write_s32(vs, encoding);
683  }
684  
685  static void vnc_desktop_resize_ext(VncState *vs, int reject_reason)
686  {
687      trace_vnc_msg_server_ext_desktop_resize(
688          vs, vs->ioc, vs->client_width, vs->client_height, reject_reason);
689  
690      vnc_lock_output(vs);
691      vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
692      vnc_write_u8(vs, 0);
693      vnc_write_u16(vs, 1); /* number of rects */
694      vnc_framebuffer_update(vs,
695                             reject_reason ? 1 : 0,
696                             reject_reason,
697                             vs->client_width, vs->client_height,
698                             VNC_ENCODING_DESKTOP_RESIZE_EXT);
699      vnc_write_u8(vs, 1);  /* number of screens */
700      vnc_write_u8(vs, 0);  /* padding */
701      vnc_write_u8(vs, 0);  /* padding */
702      vnc_write_u8(vs, 0);  /* padding */
703      vnc_write_u32(vs, 0); /* screen id */
704      vnc_write_u16(vs, 0); /* screen x-pos */
705      vnc_write_u16(vs, 0); /* screen y-pos */
706      vnc_write_u16(vs, vs->client_width);
707      vnc_write_u16(vs, vs->client_height);
708      vnc_write_u32(vs, 0); /* screen flags */
709      vnc_unlock_output(vs);
710      vnc_flush(vs);
711  }
712  
713  static void vnc_desktop_resize(VncState *vs)
714  {
715      if (vs->ioc == NULL || (!vnc_has_feature(vs, VNC_FEATURE_RESIZE) &&
716                              !vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT))) {
717          return;
718      }
719      if (vs->client_width == vs->vd->true_width &&
720          vs->client_height == pixman_image_get_height(vs->vd->server)) {
721          return;
722      }
723  
724      assert(vs->vd->true_width < 65536 &&
725             vs->vd->true_width >= 0);
726      assert(pixman_image_get_height(vs->vd->server) < 65536 &&
727             pixman_image_get_height(vs->vd->server) >= 0);
728      vs->client_width = vs->vd->true_width;
729      vs->client_height = pixman_image_get_height(vs->vd->server);
730  
731      if (vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)) {
732          vnc_desktop_resize_ext(vs, 0);
733          return;
734      }
735  
736      trace_vnc_msg_server_desktop_resize(
737          vs, vs->ioc, vs->client_width, vs->client_height);
738  
739      vnc_lock_output(vs);
740      vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
741      vnc_write_u8(vs, 0);
742      vnc_write_u16(vs, 1); /* number of rects */
743      vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
744                             VNC_ENCODING_DESKTOPRESIZE);
745      vnc_unlock_output(vs);
746      vnc_flush(vs);
747  }
748  
749  static void vnc_abort_display_jobs(VncDisplay *vd)
750  {
751      VncState *vs;
752  
753      QTAILQ_FOREACH(vs, &vd->clients, next) {
754          vnc_lock_output(vs);
755          vs->abort = true;
756          vnc_unlock_output(vs);
757      }
758      QTAILQ_FOREACH(vs, &vd->clients, next) {
759          vnc_jobs_join(vs);
760      }
761      QTAILQ_FOREACH(vs, &vd->clients, next) {
762          vnc_lock_output(vs);
763          if (vs->update == VNC_STATE_UPDATE_NONE &&
764              vs->job_update != VNC_STATE_UPDATE_NONE) {
765              /* job aborted before completion */
766              vs->update = vs->job_update;
767              vs->job_update = VNC_STATE_UPDATE_NONE;
768          }
769          vs->abort = false;
770          vnc_unlock_output(vs);
771      }
772  }
773  
774  int vnc_server_fb_stride(VncDisplay *vd)
775  {
776      return pixman_image_get_stride(vd->server);
777  }
778  
779  void *vnc_server_fb_ptr(VncDisplay *vd, int x, int y)
780  {
781      uint8_t *ptr;
782  
783      ptr  = (uint8_t *)pixman_image_get_data(vd->server);
784      ptr += y * vnc_server_fb_stride(vd);
785      ptr += x * VNC_SERVER_FB_BYTES;
786      return ptr;
787  }
788  
789  static void vnc_update_server_surface(VncDisplay *vd)
790  {
791      int width, height;
792  
793      qemu_pixman_image_unref(vd->server);
794      vd->server = NULL;
795  
796      if (QTAILQ_EMPTY(&vd->clients)) {
797          return;
798      }
799  
800      width = vnc_width(vd);
801      height = vnc_height(vd);
802      vd->true_width = vnc_true_width(vd);
803      vd->server = pixman_image_create_bits(VNC_SERVER_FB_FORMAT,
804                                            width, height,
805                                            NULL, 0);
806  
807      memset(vd->guest.dirty, 0x00, sizeof(vd->guest.dirty));
808      vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
809                         width, height);
810  }
811  
812  static bool vnc_check_pageflip(DisplaySurface *s1,
813                                 DisplaySurface *s2)
814  {
815      return (s1 != NULL &&
816              s2 != NULL &&
817              surface_width(s1) == surface_width(s2) &&
818              surface_height(s1) == surface_height(s2) &&
819              surface_format(s1) == surface_format(s2));
820  
821  }
822  
823  static void vnc_dpy_switch(DisplayChangeListener *dcl,
824                             DisplaySurface *surface)
825  {
826      VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
827      bool pageflip = vnc_check_pageflip(vd->ds, surface);
828      VncState *vs;
829  
830      vnc_abort_display_jobs(vd);
831      vd->ds = surface;
832  
833      /* guest surface */
834      qemu_pixman_image_unref(vd->guest.fb);
835      vd->guest.fb = pixman_image_ref(surface->image);
836      vd->guest.format = surface_format(surface);
837  
838  
839      if (pageflip) {
840          trace_vnc_server_dpy_pageflip(vd,
841                                        surface_width(surface),
842                                        surface_height(surface),
843                                        surface_format(surface));
844          vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
845                             surface_width(surface),
846                             surface_height(surface));
847          return;
848      }
849  
850      trace_vnc_server_dpy_recreate(vd,
851                                    surface_width(surface),
852                                    surface_height(surface),
853                                    surface_format(surface));
854      /* server surface */
855      vnc_update_server_surface(vd);
856  
857      QTAILQ_FOREACH(vs, &vd->clients, next) {
858          vnc_colordepth(vs);
859          vnc_desktop_resize(vs);
860          vnc_cursor_define(vs);
861          memset(vs->dirty, 0x00, sizeof(vs->dirty));
862          vnc_set_area_dirty(vs->dirty, vd, 0, 0,
863                             vnc_width(vd),
864                             vnc_height(vd));
865          vnc_update_throttle_offset(vs);
866      }
867  }
868  
869  /* fastest code */
870  static void vnc_write_pixels_copy(VncState *vs,
871                                    void *pixels, int size)
872  {
873      vnc_write(vs, pixels, size);
874  }
875  
876  /* slowest but generic code. */
877  void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
878  {
879      uint8_t r, g, b;
880  
881  #if VNC_SERVER_FB_FORMAT == PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8)
882      r = (((v & 0x00ff0000) >> 16) << vs->client_pf.rbits) >> 8;
883      g = (((v & 0x0000ff00) >>  8) << vs->client_pf.gbits) >> 8;
884      b = (((v & 0x000000ff) >>  0) << vs->client_pf.bbits) >> 8;
885  #else
886  # error need some bits here if you change VNC_SERVER_FB_FORMAT
887  #endif
888      v = (r << vs->client_pf.rshift) |
889          (g << vs->client_pf.gshift) |
890          (b << vs->client_pf.bshift);
891      switch (vs->client_pf.bytes_per_pixel) {
892      case 1:
893          buf[0] = v;
894          break;
895      case 2:
896          if (vs->client_be) {
897              buf[0] = v >> 8;
898              buf[1] = v;
899          } else {
900              buf[1] = v >> 8;
901              buf[0] = v;
902          }
903          break;
904      default:
905      case 4:
906          if (vs->client_be) {
907              buf[0] = v >> 24;
908              buf[1] = v >> 16;
909              buf[2] = v >> 8;
910              buf[3] = v;
911          } else {
912              buf[3] = v >> 24;
913              buf[2] = v >> 16;
914              buf[1] = v >> 8;
915              buf[0] = v;
916          }
917          break;
918      }
919  }
920  
921  static void vnc_write_pixels_generic(VncState *vs,
922                                       void *pixels1, int size)
923  {
924      uint8_t buf[4];
925  
926      if (VNC_SERVER_FB_BYTES == 4) {
927          uint32_t *pixels = pixels1;
928          int n, i;
929          n = size >> 2;
930          for (i = 0; i < n; i++) {
931              vnc_convert_pixel(vs, buf, pixels[i]);
932              vnc_write(vs, buf, vs->client_pf.bytes_per_pixel);
933          }
934      }
935  }
936  
937  int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
938  {
939      int i;
940      uint8_t *row;
941      VncDisplay *vd = vs->vd;
942  
943      row = vnc_server_fb_ptr(vd, x, y);
944      for (i = 0; i < h; i++) {
945          vs->write_pixels(vs, row, w * VNC_SERVER_FB_BYTES);
946          row += vnc_server_fb_stride(vd);
947      }
948      return 1;
949  }
950  
951  int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
952  {
953      int n = 0;
954  
955      switch(vs->vnc_encoding) {
956          case VNC_ENCODING_ZLIB:
957              n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
958              break;
959          case VNC_ENCODING_HEXTILE:
960              vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
961              n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
962              break;
963          case VNC_ENCODING_TIGHT:
964              n = vnc_tight_send_framebuffer_update(vs, x, y, w, h);
965              break;
966          case VNC_ENCODING_TIGHT_PNG:
967              n = vnc_tight_png_send_framebuffer_update(vs, x, y, w, h);
968              break;
969          case VNC_ENCODING_ZRLE:
970              n = vnc_zrle_send_framebuffer_update(vs, x, y, w, h);
971              break;
972          case VNC_ENCODING_ZYWRLE:
973              n = vnc_zywrle_send_framebuffer_update(vs, x, y, w, h);
974              break;
975          default:
976              vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
977              n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
978              break;
979      }
980      return n;
981  }
982  
983  static void vnc_mouse_set(DisplayChangeListener *dcl,
984                            int x, int y, int visible)
985  {
986      /* can we ask the client(s) to move the pointer ??? */
987  }
988  
989  static int vnc_cursor_define(VncState *vs)
990  {
991      QEMUCursor *c = qemu_console_get_cursor(vs->vd->dcl.con);
992      int isize;
993  
994      if (!c) {
995          return -1;
996      }
997  
998      if (vnc_has_feature(vs, VNC_FEATURE_ALPHA_CURSOR)) {
999          vnc_lock_output(vs);
1000          vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1001          vnc_write_u8(vs,  0);  /*  padding     */
1002          vnc_write_u16(vs, 1);  /*  # of rects  */
1003          vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
1004                                 VNC_ENCODING_ALPHA_CURSOR);
1005          vnc_write_s32(vs, VNC_ENCODING_RAW);
1006          vnc_write(vs, c->data, c->width * c->height * 4);
1007          vnc_unlock_output(vs);
1008          return 0;
1009      }
1010      if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
1011          vnc_lock_output(vs);
1012          vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1013          vnc_write_u8(vs,  0);  /*  padding     */
1014          vnc_write_u16(vs, 1);  /*  # of rects  */
1015          vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
1016                                 VNC_ENCODING_RICH_CURSOR);
1017          isize = c->width * c->height * vs->client_pf.bytes_per_pixel;
1018          vnc_write_pixels_generic(vs, c->data, isize);
1019          vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
1020          vnc_unlock_output(vs);
1021          return 0;
1022      }
1023      return -1;
1024  }
1025  
1026  static void vnc_dpy_cursor_define(DisplayChangeListener *dcl,
1027                                    QEMUCursor *c)
1028  {
1029      VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
1030      VncState *vs;
1031  
1032      g_free(vd->cursor_mask);
1033      vd->cursor_msize = cursor_get_mono_bpl(c) * c->height;
1034      vd->cursor_mask = g_malloc0(vd->cursor_msize);
1035      cursor_get_mono_mask(c, 0, vd->cursor_mask);
1036  
1037      QTAILQ_FOREACH(vs, &vd->clients, next) {
1038          vnc_cursor_define(vs);
1039      }
1040  }
1041  
1042  static int find_and_clear_dirty_height(VncState *vs,
1043                                         int y, int last_x, int x, int height)
1044  {
1045      int h;
1046  
1047      for (h = 1; h < (height - y); h++) {
1048          if (!test_bit(last_x, vs->dirty[y + h])) {
1049              break;
1050          }
1051          bitmap_clear(vs->dirty[y + h], last_x, x - last_x);
1052      }
1053  
1054      return h;
1055  }
1056  
1057  /*
1058   * Figure out how much pending data we should allow in the output
1059   * buffer before we throttle incremental display updates, and/or
1060   * drop audio samples.
1061   *
1062   * We allow for equiv of 1 full display's worth of FB updates,
1063   * and 1 second of audio samples. If audio backlog was larger
1064   * than that the client would already suffering awful audio
1065   * glitches, so dropping samples is no worse really).
1066   */
1067  static void vnc_update_throttle_offset(VncState *vs)
1068  {
1069      size_t offset =
1070          vs->client_width * vs->client_height * vs->client_pf.bytes_per_pixel;
1071  
1072      if (vs->audio_cap) {
1073          int bps;
1074          switch (vs->as.fmt) {
1075          default:
1076          case  AUDIO_FORMAT_U8:
1077          case  AUDIO_FORMAT_S8:
1078              bps = 1;
1079              break;
1080          case  AUDIO_FORMAT_U16:
1081          case  AUDIO_FORMAT_S16:
1082              bps = 2;
1083              break;
1084          case  AUDIO_FORMAT_U32:
1085          case  AUDIO_FORMAT_S32:
1086              bps = 4;
1087              break;
1088          }
1089          offset += vs->as.freq * bps * vs->as.nchannels;
1090      }
1091  
1092      /* Put a floor of 1MB on offset, so that if we have a large pending
1093       * buffer and the display is resized to a small size & back again
1094       * we don't suddenly apply a tiny send limit
1095       */
1096      offset = MAX(offset, 1024 * 1024);
1097  
1098      if (vs->throttle_output_offset != offset) {
1099          trace_vnc_client_throttle_threshold(
1100              vs, vs->ioc, vs->throttle_output_offset, offset, vs->client_width,
1101              vs->client_height, vs->client_pf.bytes_per_pixel, vs->audio_cap);
1102      }
1103  
1104      vs->throttle_output_offset = offset;
1105  }
1106  
1107  static bool vnc_should_update(VncState *vs)
1108  {
1109      switch (vs->update) {
1110      case VNC_STATE_UPDATE_NONE:
1111          break;
1112      case VNC_STATE_UPDATE_INCREMENTAL:
1113          /* Only allow incremental updates if the pending send queue
1114           * is less than the permitted threshold, and the job worker
1115           * is completely idle.
1116           */
1117          if (vs->output.offset < vs->throttle_output_offset &&
1118              vs->job_update == VNC_STATE_UPDATE_NONE) {
1119              return true;
1120          }
1121          trace_vnc_client_throttle_incremental(
1122              vs, vs->ioc, vs->job_update, vs->output.offset);
1123          break;
1124      case VNC_STATE_UPDATE_FORCE:
1125          /* Only allow forced updates if the pending send queue
1126           * does not contain a previous forced update, and the
1127           * job worker is completely idle.
1128           *
1129           * Note this means we'll queue a forced update, even if
1130           * the output buffer size is otherwise over the throttle
1131           * output limit.
1132           */
1133          if (vs->force_update_offset == 0 &&
1134              vs->job_update == VNC_STATE_UPDATE_NONE) {
1135              return true;
1136          }
1137          trace_vnc_client_throttle_forced(
1138              vs, vs->ioc, vs->job_update, vs->force_update_offset);
1139          break;
1140      }
1141      return false;
1142  }
1143  
1144  static int vnc_update_client(VncState *vs, int has_dirty)
1145  {
1146      VncDisplay *vd = vs->vd;
1147      VncJob *job;
1148      int y;
1149      int height, width;
1150      int n = 0;
1151  
1152      if (vs->disconnecting) {
1153          vnc_disconnect_finish(vs);
1154          return 0;
1155      }
1156  
1157      vs->has_dirty += has_dirty;
1158      if (!vnc_should_update(vs)) {
1159          return 0;
1160      }
1161  
1162      if (!vs->has_dirty && vs->update != VNC_STATE_UPDATE_FORCE) {
1163          return 0;
1164      }
1165  
1166      /*
1167       * Send screen updates to the vnc client using the server
1168       * surface and server dirty map.  guest surface updates
1169       * happening in parallel don't disturb us, the next pass will
1170       * send them to the client.
1171       */
1172      job = vnc_job_new(vs);
1173  
1174      height = pixman_image_get_height(vd->server);
1175      width = pixman_image_get_width(vd->server);
1176  
1177      y = 0;
1178      for (;;) {
1179          int x, h;
1180          unsigned long x2;
1181          unsigned long offset = find_next_bit((unsigned long *) &vs->dirty,
1182                                               height * VNC_DIRTY_BPL(vs),
1183                                               y * VNC_DIRTY_BPL(vs));
1184          if (offset == height * VNC_DIRTY_BPL(vs)) {
1185              /* no more dirty bits */
1186              break;
1187          }
1188          y = offset / VNC_DIRTY_BPL(vs);
1189          x = offset % VNC_DIRTY_BPL(vs);
1190          x2 = find_next_zero_bit((unsigned long *) &vs->dirty[y],
1191                                  VNC_DIRTY_BPL(vs), x);
1192          bitmap_clear(vs->dirty[y], x, x2 - x);
1193          h = find_and_clear_dirty_height(vs, y, x, x2, height);
1194          x2 = MIN(x2, width / VNC_DIRTY_PIXELS_PER_BIT);
1195          if (x2 > x) {
1196              n += vnc_job_add_rect(job, x * VNC_DIRTY_PIXELS_PER_BIT, y,
1197                                    (x2 - x) * VNC_DIRTY_PIXELS_PER_BIT, h);
1198          }
1199          if (!x && x2 == width / VNC_DIRTY_PIXELS_PER_BIT) {
1200              y += h;
1201              if (y == height) {
1202                  break;
1203              }
1204          }
1205      }
1206  
1207      vs->job_update = vs->update;
1208      vs->update = VNC_STATE_UPDATE_NONE;
1209      vnc_job_push(job);
1210      vs->has_dirty = 0;
1211      return n;
1212  }
1213  
1214  /* audio */
1215  static void audio_capture_notify(void *opaque, audcnotification_e cmd)
1216  {
1217      VncState *vs = opaque;
1218  
1219      assert(vs->magic == VNC_MAGIC);
1220      switch (cmd) {
1221      case AUD_CNOTIFY_DISABLE:
1222          trace_vnc_msg_server_audio_end(vs, vs->ioc);
1223          vnc_lock_output(vs);
1224          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1225          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1226          vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_END);
1227          vnc_unlock_output(vs);
1228          vnc_flush(vs);
1229          break;
1230  
1231      case AUD_CNOTIFY_ENABLE:
1232          trace_vnc_msg_server_audio_begin(vs, vs->ioc);
1233          vnc_lock_output(vs);
1234          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1235          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1236          vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN);
1237          vnc_unlock_output(vs);
1238          vnc_flush(vs);
1239          break;
1240      }
1241  }
1242  
1243  static void audio_capture_destroy(void *opaque)
1244  {
1245  }
1246  
1247  static void audio_capture(void *opaque, const void *buf, int size)
1248  {
1249      VncState *vs = opaque;
1250  
1251      assert(vs->magic == VNC_MAGIC);
1252      trace_vnc_msg_server_audio_data(vs, vs->ioc, buf, size);
1253      vnc_lock_output(vs);
1254      if (vs->output.offset < vs->throttle_output_offset) {
1255          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
1256          vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
1257          vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_DATA);
1258          vnc_write_u32(vs, size);
1259          vnc_write(vs, buf, size);
1260      } else {
1261          trace_vnc_client_throttle_audio(vs, vs->ioc, vs->output.offset);
1262      }
1263      vnc_unlock_output(vs);
1264      vnc_flush(vs);
1265  }
1266  
1267  static void audio_add(VncState *vs)
1268  {
1269      struct audio_capture_ops ops;
1270  
1271      if (vs->audio_cap) {
1272          error_report("audio already running");
1273          return;
1274      }
1275  
1276      ops.notify = audio_capture_notify;
1277      ops.destroy = audio_capture_destroy;
1278      ops.capture = audio_capture;
1279  
1280      vs->audio_cap = AUD_add_capture(vs->vd->audio_state, &vs->as, &ops, vs);
1281      if (!vs->audio_cap) {
1282          error_report("Failed to add audio capture");
1283      }
1284  }
1285  
1286  static void audio_del(VncState *vs)
1287  {
1288      if (vs->audio_cap) {
1289          AUD_del_capture(vs->audio_cap, vs);
1290          vs->audio_cap = NULL;
1291      }
1292  }
1293  
1294  static void vnc_disconnect_start(VncState *vs)
1295  {
1296      if (vs->disconnecting) {
1297          return;
1298      }
1299      trace_vnc_client_disconnect_start(vs, vs->ioc);
1300      vnc_set_share_mode(vs, VNC_SHARE_MODE_DISCONNECTED);
1301      if (vs->ioc_tag) {
1302          g_source_remove(vs->ioc_tag);
1303          vs->ioc_tag = 0;
1304      }
1305      qio_channel_close(vs->ioc, NULL);
1306      vs->disconnecting = TRUE;
1307  }
1308  
1309  void vnc_disconnect_finish(VncState *vs)
1310  {
1311      int i;
1312  
1313      trace_vnc_client_disconnect_finish(vs, vs->ioc);
1314  
1315      vnc_jobs_join(vs); /* Wait encoding jobs */
1316  
1317      vnc_lock_output(vs);
1318      vnc_qmp_event(vs, QAPI_EVENT_VNC_DISCONNECTED);
1319  
1320      buffer_free(&vs->input);
1321      buffer_free(&vs->output);
1322  
1323      qapi_free_VncClientInfo(vs->info);
1324  
1325      vnc_zlib_clear(vs);
1326      vnc_tight_clear(vs);
1327      vnc_zrle_clear(vs);
1328  
1329  #ifdef CONFIG_VNC_SASL
1330      vnc_sasl_client_cleanup(vs);
1331  #endif /* CONFIG_VNC_SASL */
1332      audio_del(vs);
1333      qkbd_state_lift_all_keys(vs->vd->kbd);
1334  
1335      if (vs->mouse_mode_notifier.notify != NULL) {
1336          qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
1337      }
1338      QTAILQ_REMOVE(&vs->vd->clients, vs, next);
1339      if (QTAILQ_EMPTY(&vs->vd->clients)) {
1340          /* last client gone */
1341          vnc_update_server_surface(vs->vd);
1342      }
1343      vnc_unlock_output(vs);
1344  
1345      if (vs->cbpeer.notifier.notify) {
1346          qemu_clipboard_peer_unregister(&vs->cbpeer);
1347      }
1348  
1349      qemu_mutex_destroy(&vs->output_mutex);
1350      if (vs->bh != NULL) {
1351          qemu_bh_delete(vs->bh);
1352      }
1353      buffer_free(&vs->jobs_buffer);
1354  
1355      for (i = 0; i < VNC_STAT_ROWS; ++i) {
1356          g_free(vs->lossy_rect[i]);
1357      }
1358      g_free(vs->lossy_rect);
1359  
1360      object_unref(OBJECT(vs->ioc));
1361      vs->ioc = NULL;
1362      object_unref(OBJECT(vs->sioc));
1363      vs->sioc = NULL;
1364      vs->magic = 0;
1365      g_free(vs->zrle);
1366      g_free(vs->tight);
1367      g_free(vs);
1368  }
1369  
1370  size_t vnc_client_io_error(VncState *vs, ssize_t ret, Error *err)
1371  {
1372      if (ret <= 0) {
1373          if (ret == 0) {
1374              trace_vnc_client_eof(vs, vs->ioc);
1375              vnc_disconnect_start(vs);
1376          } else if (ret != QIO_CHANNEL_ERR_BLOCK) {
1377              trace_vnc_client_io_error(vs, vs->ioc,
1378                                        err ? error_get_pretty(err) : "Unknown");
1379              vnc_disconnect_start(vs);
1380          }
1381  
1382          error_free(err);
1383          return 0;
1384      }
1385      return ret;
1386  }
1387  
1388  
1389  void vnc_client_error(VncState *vs)
1390  {
1391      VNC_DEBUG("Closing down client sock: protocol error\n");
1392      vnc_disconnect_start(vs);
1393  }
1394  
1395  
1396  /*
1397   * Called to write a chunk of data to the client socket. The data may
1398   * be the raw data, or may have already been encoded by SASL.
1399   * The data will be written either straight onto the socket, or
1400   * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1401   *
1402   * NB, it is theoretically possible to have 2 layers of encryption,
1403   * both SASL, and this TLS layer. It is highly unlikely in practice
1404   * though, since SASL encryption will typically be a no-op if TLS
1405   * is active
1406   *
1407   * Returns the number of bytes written, which may be less than
1408   * the requested 'datalen' if the socket would block. Returns
1409   * 0 on I/O error, and disconnects the client socket.
1410   */
1411  size_t vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen)
1412  {
1413      Error *err = NULL;
1414      ssize_t ret;
1415      ret = qio_channel_write(vs->ioc, (const char *)data, datalen, &err);
1416      VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret);
1417      return vnc_client_io_error(vs, ret, err);
1418  }
1419  
1420  
1421  /*
1422   * Called to write buffered data to the client socket, when not
1423   * using any SASL SSF encryption layers. Will write as much data
1424   * as possible without blocking. If all buffered data is written,
1425   * will switch the FD poll() handler back to read monitoring.
1426   *
1427   * Returns the number of bytes written, which may be less than
1428   * the buffered output data if the socket would block.  Returns
1429   * 0 on I/O error, and disconnects the client socket.
1430   */
1431  static size_t vnc_client_write_plain(VncState *vs)
1432  {
1433      size_t offset;
1434      size_t ret;
1435  
1436  #ifdef CONFIG_VNC_SASL
1437      VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1438                vs->output.buffer, vs->output.capacity, vs->output.offset,
1439                vs->sasl.waitWriteSSF);
1440  
1441      if (vs->sasl.conn &&
1442          vs->sasl.runSSF &&
1443          vs->sasl.waitWriteSSF) {
1444          ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF);
1445          if (ret)
1446              vs->sasl.waitWriteSSF -= ret;
1447      } else
1448  #endif /* CONFIG_VNC_SASL */
1449          ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset);
1450      if (!ret)
1451          return 0;
1452  
1453      if (ret >= vs->force_update_offset) {
1454          if (vs->force_update_offset != 0) {
1455              trace_vnc_client_unthrottle_forced(vs, vs->ioc);
1456          }
1457          vs->force_update_offset = 0;
1458      } else {
1459          vs->force_update_offset -= ret;
1460      }
1461      offset = vs->output.offset;
1462      buffer_advance(&vs->output, ret);
1463      if (offset >= vs->throttle_output_offset &&
1464          vs->output.offset < vs->throttle_output_offset) {
1465          trace_vnc_client_unthrottle_incremental(vs, vs->ioc, vs->output.offset);
1466      }
1467  
1468      if (vs->output.offset == 0) {
1469          if (vs->ioc_tag) {
1470              g_source_remove(vs->ioc_tag);
1471          }
1472          vs->ioc_tag = qio_channel_add_watch(
1473              vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
1474              vnc_client_io, vs, NULL);
1475      }
1476  
1477      return ret;
1478  }
1479  
1480  
1481  /*
1482   * First function called whenever there is data to be written to
1483   * the client socket. Will delegate actual work according to whether
1484   * SASL SSF layers are enabled (thus requiring encryption calls)
1485   */
1486  static void vnc_client_write_locked(VncState *vs)
1487  {
1488  #ifdef CONFIG_VNC_SASL
1489      if (vs->sasl.conn &&
1490          vs->sasl.runSSF &&
1491          !vs->sasl.waitWriteSSF) {
1492          vnc_client_write_sasl(vs);
1493      } else
1494  #endif /* CONFIG_VNC_SASL */
1495      {
1496          vnc_client_write_plain(vs);
1497      }
1498  }
1499  
1500  static void vnc_client_write(VncState *vs)
1501  {
1502      assert(vs->magic == VNC_MAGIC);
1503      vnc_lock_output(vs);
1504      if (vs->output.offset) {
1505          vnc_client_write_locked(vs);
1506      } else if (vs->ioc != NULL) {
1507          if (vs->ioc_tag) {
1508              g_source_remove(vs->ioc_tag);
1509          }
1510          vs->ioc_tag = qio_channel_add_watch(
1511              vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
1512              vnc_client_io, vs, NULL);
1513      }
1514      vnc_unlock_output(vs);
1515  }
1516  
1517  void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
1518  {
1519      vs->read_handler = func;
1520      vs->read_handler_expect = expecting;
1521  }
1522  
1523  
1524  /*
1525   * Called to read a chunk of data from the client socket. The data may
1526   * be the raw data, or may need to be further decoded by SASL.
1527   * The data will be read either straight from to the socket, or
1528   * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1529   *
1530   * NB, it is theoretically possible to have 2 layers of encryption,
1531   * both SASL, and this TLS layer. It is highly unlikely in practice
1532   * though, since SASL encryption will typically be a no-op if TLS
1533   * is active
1534   *
1535   * Returns the number of bytes read, which may be less than
1536   * the requested 'datalen' if the socket would block. Returns
1537   * 0 on I/O error or EOF, and disconnects the client socket.
1538   */
1539  size_t vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen)
1540  {
1541      ssize_t ret;
1542      Error *err = NULL;
1543      ret = qio_channel_read(vs->ioc, (char *)data, datalen, &err);
1544      VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret);
1545      return vnc_client_io_error(vs, ret, err);
1546  }
1547  
1548  
1549  /*
1550   * Called to read data from the client socket to the input buffer,
1551   * when not using any SASL SSF encryption layers. Will read as much
1552   * data as possible without blocking.
1553   *
1554   * Returns the number of bytes read, which may be less than
1555   * the requested 'datalen' if the socket would block. Returns
1556   * 0 on I/O error or EOF, and disconnects the client socket.
1557   */
1558  static size_t vnc_client_read_plain(VncState *vs)
1559  {
1560      size_t ret;
1561      VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1562                vs->input.buffer, vs->input.capacity, vs->input.offset);
1563      buffer_reserve(&vs->input, 4096);
1564      ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096);
1565      if (!ret)
1566          return 0;
1567      vs->input.offset += ret;
1568      return ret;
1569  }
1570  
1571  static void vnc_jobs_bh(void *opaque)
1572  {
1573      VncState *vs = opaque;
1574  
1575      assert(vs->magic == VNC_MAGIC);
1576      vnc_jobs_consume_buffer(vs);
1577  }
1578  
1579  /*
1580   * First function called whenever there is more data to be read from
1581   * the client socket. Will delegate actual work according to whether
1582   * SASL SSF layers are enabled (thus requiring decryption calls)
1583   * Returns 0 on success, -1 if client disconnected
1584   */
1585  static int vnc_client_read(VncState *vs)
1586  {
1587      size_t sz;
1588  
1589  #ifdef CONFIG_VNC_SASL
1590      if (vs->sasl.conn && vs->sasl.runSSF)
1591          sz = vnc_client_read_sasl(vs);
1592      else
1593  #endif /* CONFIG_VNC_SASL */
1594          sz = vnc_client_read_plain(vs);
1595      if (!sz) {
1596          if (vs->disconnecting) {
1597              vnc_disconnect_finish(vs);
1598              return -1;
1599          }
1600          return 0;
1601      }
1602  
1603      while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
1604          size_t len = vs->read_handler_expect;
1605          int ret;
1606  
1607          ret = vs->read_handler(vs, vs->input.buffer, len);
1608          if (vs->disconnecting) {
1609              vnc_disconnect_finish(vs);
1610              return -1;
1611          }
1612  
1613          if (!ret) {
1614              buffer_advance(&vs->input, len);
1615          } else {
1616              vs->read_handler_expect = ret;
1617          }
1618      }
1619      return 0;
1620  }
1621  
1622  gboolean vnc_client_io(QIOChannel *ioc G_GNUC_UNUSED,
1623                         GIOCondition condition, void *opaque)
1624  {
1625      VncState *vs = opaque;
1626  
1627      assert(vs->magic == VNC_MAGIC);
1628  
1629      if (condition & (G_IO_HUP | G_IO_ERR)) {
1630          vnc_disconnect_start(vs);
1631          return TRUE;
1632      }
1633  
1634      if (condition & G_IO_IN) {
1635          if (vnc_client_read(vs) < 0) {
1636              /* vs is free()ed here */
1637              return TRUE;
1638          }
1639      }
1640      if (condition & G_IO_OUT) {
1641          vnc_client_write(vs);
1642      }
1643  
1644      if (vs->disconnecting) {
1645          if (vs->ioc_tag != 0) {
1646              g_source_remove(vs->ioc_tag);
1647          }
1648          vs->ioc_tag = 0;
1649      }
1650      return TRUE;
1651  }
1652  
1653  
1654  /*
1655   * Scale factor to apply to vs->throttle_output_offset when checking for
1656   * hard limit. Worst case normal usage could be x2, if we have a complete
1657   * incremental update and complete forced update in the output buffer.
1658   * So x3 should be good enough, but we pick x5 to be conservative and thus
1659   * (hopefully) never trigger incorrectly.
1660   */
1661  #define VNC_THROTTLE_OUTPUT_LIMIT_SCALE 5
1662  
1663  void vnc_write(VncState *vs, const void *data, size_t len)
1664  {
1665      assert(vs->magic == VNC_MAGIC);
1666      if (vs->disconnecting) {
1667          return;
1668      }
1669      /* Protection against malicious client/guest to prevent our output
1670       * buffer growing without bound if client stops reading data. This
1671       * should rarely trigger, because we have earlier throttling code
1672       * which stops issuing framebuffer updates and drops audio data
1673       * if the throttle_output_offset value is exceeded. So we only reach
1674       * this higher level if a huge number of pseudo-encodings get
1675       * triggered while data can't be sent on the socket.
1676       *
1677       * NB throttle_output_offset can be zero during early protocol
1678       * handshake, or from the job thread's VncState clone
1679       */
1680      if (vs->throttle_output_offset != 0 &&
1681          (vs->output.offset / VNC_THROTTLE_OUTPUT_LIMIT_SCALE) >
1682          vs->throttle_output_offset) {
1683          trace_vnc_client_output_limit(vs, vs->ioc, vs->output.offset,
1684                                        vs->throttle_output_offset);
1685          vnc_disconnect_start(vs);
1686          return;
1687      }
1688      buffer_reserve(&vs->output, len);
1689  
1690      if (vs->ioc != NULL && buffer_empty(&vs->output)) {
1691          if (vs->ioc_tag) {
1692              g_source_remove(vs->ioc_tag);
1693          }
1694          vs->ioc_tag = qio_channel_add_watch(
1695              vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_OUT,
1696              vnc_client_io, vs, NULL);
1697      }
1698  
1699      buffer_append(&vs->output, data, len);
1700  }
1701  
1702  void vnc_write_s32(VncState *vs, int32_t value)
1703  {
1704      vnc_write_u32(vs, *(uint32_t *)&value);
1705  }
1706  
1707  void vnc_write_u32(VncState *vs, uint32_t value)
1708  {
1709      uint8_t buf[4];
1710  
1711      buf[0] = (value >> 24) & 0xFF;
1712      buf[1] = (value >> 16) & 0xFF;
1713      buf[2] = (value >>  8) & 0xFF;
1714      buf[3] = value & 0xFF;
1715  
1716      vnc_write(vs, buf, 4);
1717  }
1718  
1719  void vnc_write_u16(VncState *vs, uint16_t value)
1720  {
1721      uint8_t buf[2];
1722  
1723      buf[0] = (value >> 8) & 0xFF;
1724      buf[1] = value & 0xFF;
1725  
1726      vnc_write(vs, buf, 2);
1727  }
1728  
1729  void vnc_write_u8(VncState *vs, uint8_t value)
1730  {
1731      vnc_write(vs, (char *)&value, 1);
1732  }
1733  
1734  void vnc_flush(VncState *vs)
1735  {
1736      vnc_lock_output(vs);
1737      if (vs->ioc != NULL && vs->output.offset) {
1738          vnc_client_write_locked(vs);
1739      }
1740      if (vs->disconnecting) {
1741          if (vs->ioc_tag != 0) {
1742              g_source_remove(vs->ioc_tag);
1743          }
1744          vs->ioc_tag = 0;
1745      }
1746      vnc_unlock_output(vs);
1747  }
1748  
1749  static uint8_t read_u8(uint8_t *data, size_t offset)
1750  {
1751      return data[offset];
1752  }
1753  
1754  static uint16_t read_u16(uint8_t *data, size_t offset)
1755  {
1756      return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
1757  }
1758  
1759  static int32_t read_s32(uint8_t *data, size_t offset)
1760  {
1761      return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
1762                       (data[offset + 2] << 8) | data[offset + 3]);
1763  }
1764  
1765  uint32_t read_u32(uint8_t *data, size_t offset)
1766  {
1767      return ((data[offset] << 24) | (data[offset + 1] << 16) |
1768              (data[offset + 2] << 8) | data[offset + 3]);
1769  }
1770  
1771  static void check_pointer_type_change(Notifier *notifier, void *data)
1772  {
1773      VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1774      int absolute = qemu_input_is_absolute();
1775  
1776      if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1777          vnc_lock_output(vs);
1778          vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1779          vnc_write_u8(vs, 0);
1780          vnc_write_u16(vs, 1);
1781          vnc_framebuffer_update(vs, absolute, 0,
1782                                 pixman_image_get_width(vs->vd->server),
1783                                 pixman_image_get_height(vs->vd->server),
1784                                 VNC_ENCODING_POINTER_TYPE_CHANGE);
1785          vnc_unlock_output(vs);
1786          vnc_flush(vs);
1787      }
1788      vs->absolute = absolute;
1789  }
1790  
1791  static void pointer_event(VncState *vs, int button_mask, int x, int y)
1792  {
1793      static uint32_t bmap[INPUT_BUTTON__MAX] = {
1794          [INPUT_BUTTON_LEFT]       = 0x01,
1795          [INPUT_BUTTON_MIDDLE]     = 0x02,
1796          [INPUT_BUTTON_RIGHT]      = 0x04,
1797          [INPUT_BUTTON_WHEEL_UP]   = 0x08,
1798          [INPUT_BUTTON_WHEEL_DOWN] = 0x10,
1799      };
1800      QemuConsole *con = vs->vd->dcl.con;
1801      int width = pixman_image_get_width(vs->vd->server);
1802      int height = pixman_image_get_height(vs->vd->server);
1803  
1804      if (vs->last_bmask != button_mask) {
1805          qemu_input_update_buttons(con, bmap, vs->last_bmask, button_mask);
1806          vs->last_bmask = button_mask;
1807      }
1808  
1809      if (vs->absolute) {
1810          qemu_input_queue_abs(con, INPUT_AXIS_X, x, 0, width);
1811          qemu_input_queue_abs(con, INPUT_AXIS_Y, y, 0, height);
1812      } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
1813          qemu_input_queue_rel(con, INPUT_AXIS_X, x - 0x7FFF);
1814          qemu_input_queue_rel(con, INPUT_AXIS_Y, y - 0x7FFF);
1815      } else {
1816          if (vs->last_x != -1) {
1817              qemu_input_queue_rel(con, INPUT_AXIS_X, x - vs->last_x);
1818              qemu_input_queue_rel(con, INPUT_AXIS_Y, y - vs->last_y);
1819          }
1820          vs->last_x = x;
1821          vs->last_y = y;
1822      }
1823      qemu_input_event_sync();
1824  }
1825  
1826  static void press_key(VncState *vs, QKeyCode qcode)
1827  {
1828      qkbd_state_key_event(vs->vd->kbd, qcode, true);
1829      qkbd_state_key_event(vs->vd->kbd, qcode, false);
1830  }
1831  
1832  static void vnc_led_state_change(VncState *vs)
1833  {
1834      if (!vnc_has_feature(vs, VNC_FEATURE_LED_STATE)) {
1835          return;
1836      }
1837  
1838      vnc_lock_output(vs);
1839      vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1840      vnc_write_u8(vs, 0);
1841      vnc_write_u16(vs, 1);
1842      vnc_framebuffer_update(vs, 0, 0, 1, 1, VNC_ENCODING_LED_STATE);
1843      vnc_write_u8(vs, vs->vd->ledstate);
1844      vnc_unlock_output(vs);
1845      vnc_flush(vs);
1846  }
1847  
1848  static void kbd_leds(void *opaque, int ledstate)
1849  {
1850      VncDisplay *vd = opaque;
1851      VncState *client;
1852  
1853      trace_vnc_key_guest_leds((ledstate & QEMU_CAPS_LOCK_LED),
1854                               (ledstate & QEMU_NUM_LOCK_LED),
1855                               (ledstate & QEMU_SCROLL_LOCK_LED));
1856  
1857      if (ledstate == vd->ledstate) {
1858          return;
1859      }
1860  
1861      vd->ledstate = ledstate;
1862  
1863      QTAILQ_FOREACH(client, &vd->clients, next) {
1864          vnc_led_state_change(client);
1865      }
1866  }
1867  
1868  static void do_key_event(VncState *vs, int down, int keycode, int sym)
1869  {
1870      QKeyCode qcode = qemu_input_key_number_to_qcode(keycode);
1871  
1872      /* QEMU console switch */
1873      switch (qcode) {
1874      case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */
1875          if (vs->vd->dcl.con == NULL && down &&
1876              qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) &&
1877              qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {
1878              /* Reset the modifiers sent to the current console */
1879              qkbd_state_lift_all_keys(vs->vd->kbd);
1880              console_select(qcode - Q_KEY_CODE_1);
1881              return;
1882          }
1883      default:
1884          break;
1885      }
1886  
1887      /* Turn off the lock state sync logic if the client support the led
1888         state extension.
1889      */
1890      if (down && vs->vd->lock_key_sync &&
1891          !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1892          keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
1893          /* If the numlock state needs to change then simulate an additional
1894             keypress before sending this one.  This will happen if the user
1895             toggles numlock away from the VNC window.
1896          */
1897          if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
1898              if (!qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
1899                  trace_vnc_key_sync_numlock(true);
1900                  press_key(vs, Q_KEY_CODE_NUM_LOCK);
1901              }
1902          } else {
1903              if (qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
1904                  trace_vnc_key_sync_numlock(false);
1905                  press_key(vs, Q_KEY_CODE_NUM_LOCK);
1906              }
1907          }
1908      }
1909  
1910      if (down && vs->vd->lock_key_sync &&
1911          !vnc_has_feature(vs, VNC_FEATURE_LED_STATE) &&
1912          ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z'))) {
1913          /* If the capslock state needs to change then simulate an additional
1914             keypress before sending this one.  This will happen if the user
1915             toggles capslock away from the VNC window.
1916          */
1917          int uppercase = !!(sym >= 'A' && sym <= 'Z');
1918          bool shift = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_SHIFT);
1919          bool capslock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CAPSLOCK);
1920          if (capslock) {
1921              if (uppercase == shift) {
1922                  trace_vnc_key_sync_capslock(false);
1923                  press_key(vs, Q_KEY_CODE_CAPS_LOCK);
1924              }
1925          } else {
1926              if (uppercase != shift) {
1927                  trace_vnc_key_sync_capslock(true);
1928                  press_key(vs, Q_KEY_CODE_CAPS_LOCK);
1929              }
1930          }
1931      }
1932  
1933      qkbd_state_key_event(vs->vd->kbd, qcode, down);
1934      if (!qemu_console_is_graphic(NULL)) {
1935          bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK);
1936          bool control = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL);
1937          /* QEMU console emulation */
1938          if (down) {
1939              switch (keycode) {
1940              case 0x2a:                          /* Left Shift */
1941              case 0x36:                          /* Right Shift */
1942              case 0x1d:                          /* Left CTRL */
1943              case 0x9d:                          /* Right CTRL */
1944              case 0x38:                          /* Left ALT */
1945              case 0xb8:                          /* Right ALT */
1946                  break;
1947              case 0xc8:
1948                  qemu_text_console_put_keysym(NULL, QEMU_KEY_UP);
1949                  break;
1950              case 0xd0:
1951                  qemu_text_console_put_keysym(NULL, QEMU_KEY_DOWN);
1952                  break;
1953              case 0xcb:
1954                  qemu_text_console_put_keysym(NULL, QEMU_KEY_LEFT);
1955                  break;
1956              case 0xcd:
1957                  qemu_text_console_put_keysym(NULL, QEMU_KEY_RIGHT);
1958                  break;
1959              case 0xd3:
1960                  qemu_text_console_put_keysym(NULL, QEMU_KEY_DELETE);
1961                  break;
1962              case 0xc7:
1963                  qemu_text_console_put_keysym(NULL, QEMU_KEY_HOME);
1964                  break;
1965              case 0xcf:
1966                  qemu_text_console_put_keysym(NULL, QEMU_KEY_END);
1967                  break;
1968              case 0xc9:
1969                  qemu_text_console_put_keysym(NULL, QEMU_KEY_PAGEUP);
1970                  break;
1971              case 0xd1:
1972                  qemu_text_console_put_keysym(NULL, QEMU_KEY_PAGEDOWN);
1973                  break;
1974  
1975              case 0x47:
1976                  qemu_text_console_put_keysym(NULL, numlock ? '7' : QEMU_KEY_HOME);
1977                  break;
1978              case 0x48:
1979                  qemu_text_console_put_keysym(NULL, numlock ? '8' : QEMU_KEY_UP);
1980                  break;
1981              case 0x49:
1982                  qemu_text_console_put_keysym(NULL, numlock ? '9' : QEMU_KEY_PAGEUP);
1983                  break;
1984              case 0x4b:
1985                  qemu_text_console_put_keysym(NULL, numlock ? '4' : QEMU_KEY_LEFT);
1986                  break;
1987              case 0x4c:
1988                  qemu_text_console_put_keysym(NULL, '5');
1989                  break;
1990              case 0x4d:
1991                  qemu_text_console_put_keysym(NULL, numlock ? '6' : QEMU_KEY_RIGHT);
1992                  break;
1993              case 0x4f:
1994                  qemu_text_console_put_keysym(NULL, numlock ? '1' : QEMU_KEY_END);
1995                  break;
1996              case 0x50:
1997                  qemu_text_console_put_keysym(NULL, numlock ? '2' : QEMU_KEY_DOWN);
1998                  break;
1999              case 0x51:
2000                  qemu_text_console_put_keysym(NULL, numlock ? '3' : QEMU_KEY_PAGEDOWN);
2001                  break;
2002              case 0x52:
2003                  qemu_text_console_put_keysym(NULL, '0');
2004                  break;
2005              case 0x53:
2006                  qemu_text_console_put_keysym(NULL, numlock ? '.' : QEMU_KEY_DELETE);
2007                  break;
2008  
2009              case 0xb5:
2010                  qemu_text_console_put_keysym(NULL, '/');
2011                  break;
2012              case 0x37:
2013                  qemu_text_console_put_keysym(NULL, '*');
2014                  break;
2015              case 0x4a:
2016                  qemu_text_console_put_keysym(NULL, '-');
2017                  break;
2018              case 0x4e:
2019                  qemu_text_console_put_keysym(NULL, '+');
2020                  break;
2021              case 0x9c:
2022                  qemu_text_console_put_keysym(NULL, '\n');
2023                  break;
2024  
2025              default:
2026                  if (control) {
2027                      qemu_text_console_put_keysym(NULL, sym & 0x1f);
2028                  } else {
2029                      qemu_text_console_put_keysym(NULL, sym);
2030                  }
2031                  break;
2032              }
2033          }
2034      }
2035  }
2036  
2037  static const char *code2name(int keycode)
2038  {
2039      return QKeyCode_str(qemu_input_key_number_to_qcode(keycode));
2040  }
2041  
2042  static void key_event(VncState *vs, int down, uint32_t sym)
2043  {
2044      int keycode;
2045      int lsym = sym;
2046  
2047      if (lsym >= 'A' && lsym <= 'Z' && qemu_console_is_graphic(NULL)) {
2048          lsym = lsym - 'A' + 'a';
2049      }
2050  
2051      keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF,
2052                                vs->vd->kbd, down) & SCANCODE_KEYMASK;
2053      trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
2054      do_key_event(vs, down, keycode, sym);
2055  }
2056  
2057  static void ext_key_event(VncState *vs, int down,
2058                            uint32_t sym, uint16_t keycode)
2059  {
2060      /* if the user specifies a keyboard layout, always use it */
2061      if (keyboard_layout) {
2062          key_event(vs, down, sym);
2063      } else {
2064          trace_vnc_key_event_ext(down, sym, keycode, code2name(keycode));
2065          do_key_event(vs, down, keycode, sym);
2066      }
2067  }
2068  
2069  static void framebuffer_update_request(VncState *vs, int incremental,
2070                                         int x, int y, int w, int h)
2071  {
2072      if (incremental) {
2073          if (vs->update != VNC_STATE_UPDATE_FORCE) {
2074              vs->update = VNC_STATE_UPDATE_INCREMENTAL;
2075          }
2076      } else {
2077          vs->update = VNC_STATE_UPDATE_FORCE;
2078          vnc_set_area_dirty(vs->dirty, vs->vd, x, y, w, h);
2079          if (vnc_has_feature(vs, VNC_FEATURE_RESIZE_EXT)) {
2080              vnc_desktop_resize_ext(vs, 0);
2081          }
2082      }
2083  }
2084  
2085  static void send_ext_key_event_ack(VncState *vs)
2086  {
2087      vnc_lock_output(vs);
2088      vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2089      vnc_write_u8(vs, 0);
2090      vnc_write_u16(vs, 1);
2091      vnc_framebuffer_update(vs, 0, 0,
2092                             pixman_image_get_width(vs->vd->server),
2093                             pixman_image_get_height(vs->vd->server),
2094                             VNC_ENCODING_EXT_KEY_EVENT);
2095      vnc_unlock_output(vs);
2096      vnc_flush(vs);
2097  }
2098  
2099  static void send_ext_audio_ack(VncState *vs)
2100  {
2101      vnc_lock_output(vs);
2102      vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2103      vnc_write_u8(vs, 0);
2104      vnc_write_u16(vs, 1);
2105      vnc_framebuffer_update(vs, 0, 0,
2106                             pixman_image_get_width(vs->vd->server),
2107                             pixman_image_get_height(vs->vd->server),
2108                             VNC_ENCODING_AUDIO);
2109      vnc_unlock_output(vs);
2110      vnc_flush(vs);
2111  }
2112  
2113  static void send_xvp_message(VncState *vs, int code)
2114  {
2115      vnc_lock_output(vs);
2116      vnc_write_u8(vs, VNC_MSG_SERVER_XVP);
2117      vnc_write_u8(vs, 0); /* pad */
2118      vnc_write_u8(vs, 1); /* version */
2119      vnc_write_u8(vs, code);
2120      vnc_unlock_output(vs);
2121      vnc_flush(vs);
2122  }
2123  
2124  static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
2125  {
2126      int i;
2127      unsigned int enc = 0;
2128  
2129      vs->features = 0;
2130      vs->vnc_encoding = 0;
2131      vs->tight->compression = 9;
2132      vs->tight->quality = -1; /* Lossless by default */
2133      vs->absolute = -1;
2134  
2135      /*
2136       * Start from the end because the encodings are sent in order of preference.
2137       * This way the preferred encoding (first encoding defined in the array)
2138       * will be set at the end of the loop.
2139       */
2140      for (i = n_encodings - 1; i >= 0; i--) {
2141          enc = encodings[i];
2142          switch (enc) {
2143          case VNC_ENCODING_RAW:
2144              vs->vnc_encoding = enc;
2145              break;
2146          case VNC_ENCODING_HEXTILE:
2147              vs->features |= VNC_FEATURE_HEXTILE_MASK;
2148              vs->vnc_encoding = enc;
2149              break;
2150          case VNC_ENCODING_TIGHT:
2151              vs->features |= VNC_FEATURE_TIGHT_MASK;
2152              vs->vnc_encoding = enc;
2153              break;
2154  #ifdef CONFIG_PNG
2155          case VNC_ENCODING_TIGHT_PNG:
2156              vs->features |= VNC_FEATURE_TIGHT_PNG_MASK;
2157              vs->vnc_encoding = enc;
2158              break;
2159  #endif
2160          case VNC_ENCODING_ZLIB:
2161              /*
2162               * VNC_ENCODING_ZRLE compresses better than VNC_ENCODING_ZLIB.
2163               * So prioritize ZRLE, even if the client hints that it prefers
2164               * ZLIB.
2165               */
2166              if ((vs->features & VNC_FEATURE_ZRLE_MASK) == 0) {
2167                  vs->features |= VNC_FEATURE_ZLIB_MASK;
2168                  vs->vnc_encoding = enc;
2169              }
2170              break;
2171          case VNC_ENCODING_ZRLE:
2172              vs->features |= VNC_FEATURE_ZRLE_MASK;
2173              vs->vnc_encoding = enc;
2174              break;
2175          case VNC_ENCODING_ZYWRLE:
2176              vs->features |= VNC_FEATURE_ZYWRLE_MASK;
2177              vs->vnc_encoding = enc;
2178              break;
2179          case VNC_ENCODING_DESKTOPRESIZE:
2180              vs->features |= VNC_FEATURE_RESIZE_MASK;
2181              break;
2182          case VNC_ENCODING_DESKTOP_RESIZE_EXT:
2183              vs->features |= VNC_FEATURE_RESIZE_EXT_MASK;
2184              break;
2185          case VNC_ENCODING_POINTER_TYPE_CHANGE:
2186              vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK;
2187              break;
2188          case VNC_ENCODING_RICH_CURSOR:
2189              vs->features |= VNC_FEATURE_RICH_CURSOR_MASK;
2190              break;
2191          case VNC_ENCODING_ALPHA_CURSOR:
2192              vs->features |= VNC_FEATURE_ALPHA_CURSOR_MASK;
2193              break;
2194          case VNC_ENCODING_EXT_KEY_EVENT:
2195              send_ext_key_event_ack(vs);
2196              break;
2197          case VNC_ENCODING_AUDIO:
2198              if (vs->vd->audio_state) {
2199                  vs->features |= VNC_FEATURE_AUDIO_MASK;
2200                  send_ext_audio_ack(vs);
2201              }
2202              break;
2203          case VNC_ENCODING_WMVi:
2204              vs->features |= VNC_FEATURE_WMVI_MASK;
2205              break;
2206          case VNC_ENCODING_LED_STATE:
2207              vs->features |= VNC_FEATURE_LED_STATE_MASK;
2208              break;
2209          case VNC_ENCODING_XVP:
2210              if (vs->vd->power_control) {
2211                  vs->features |= VNC_FEATURE_XVP_MASK;
2212                  send_xvp_message(vs, VNC_XVP_CODE_INIT);
2213              }
2214              break;
2215          case VNC_ENCODING_CLIPBOARD_EXT:
2216              vs->features |= VNC_FEATURE_CLIPBOARD_EXT_MASK;
2217              vnc_server_cut_text_caps(vs);
2218              break;
2219          case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:
2220              vs->tight->compression = (enc & 0x0F);
2221              break;
2222          case VNC_ENCODING_QUALITYLEVEL0 ... VNC_ENCODING_QUALITYLEVEL0 + 9:
2223              if (vs->vd->lossy) {
2224                  vs->tight->quality = (enc & 0x0F);
2225              }
2226              break;
2227          default:
2228              VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc);
2229              break;
2230          }
2231      }
2232      vnc_desktop_resize(vs);
2233      check_pointer_type_change(&vs->mouse_mode_notifier, NULL);
2234      vnc_led_state_change(vs);
2235      vnc_cursor_define(vs);
2236  }
2237  
2238  static void set_pixel_conversion(VncState *vs)
2239  {
2240      pixman_format_code_t fmt = qemu_pixman_get_format(&vs->client_pf);
2241  
2242      if (fmt == VNC_SERVER_FB_FORMAT) {
2243          vs->write_pixels = vnc_write_pixels_copy;
2244          vnc_hextile_set_pixel_conversion(vs, 0);
2245      } else {
2246          vs->write_pixels = vnc_write_pixels_generic;
2247          vnc_hextile_set_pixel_conversion(vs, 1);
2248      }
2249  }
2250  
2251  static void send_color_map(VncState *vs)
2252  {
2253      int i;
2254  
2255      vnc_lock_output(vs);
2256      vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES);
2257      vnc_write_u8(vs,  0);    /* padding     */
2258      vnc_write_u16(vs, 0);    /* first color */
2259      vnc_write_u16(vs, 256);  /* # of colors */
2260  
2261      for (i = 0; i < 256; i++) {
2262          PixelFormat *pf = &vs->client_pf;
2263  
2264          vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits)));
2265          vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits)));
2266          vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits)));
2267      }
2268      vnc_unlock_output(vs);
2269  }
2270  
2271  static void set_pixel_format(VncState *vs, int bits_per_pixel,
2272                               int big_endian_flag, int true_color_flag,
2273                               int red_max, int green_max, int blue_max,
2274                               int red_shift, int green_shift, int blue_shift)
2275  {
2276      if (!true_color_flag) {
2277          /* Expose a reasonable default 256 color map */
2278          bits_per_pixel = 8;
2279          red_max = 7;
2280          green_max = 7;
2281          blue_max = 3;
2282          red_shift = 0;
2283          green_shift = 3;
2284          blue_shift = 6;
2285      }
2286  
2287      switch (bits_per_pixel) {
2288      case 8:
2289      case 16:
2290      case 32:
2291          break;
2292      default:
2293          vnc_client_error(vs);
2294          return;
2295      }
2296  
2297      vs->client_pf.rmax = red_max ? red_max : 0xFF;
2298      vs->client_pf.rbits = ctpopl(red_max);
2299      vs->client_pf.rshift = red_shift;
2300      vs->client_pf.rmask = red_max << red_shift;
2301      vs->client_pf.gmax = green_max ? green_max : 0xFF;
2302      vs->client_pf.gbits = ctpopl(green_max);
2303      vs->client_pf.gshift = green_shift;
2304      vs->client_pf.gmask = green_max << green_shift;
2305      vs->client_pf.bmax = blue_max ? blue_max : 0xFF;
2306      vs->client_pf.bbits = ctpopl(blue_max);
2307      vs->client_pf.bshift = blue_shift;
2308      vs->client_pf.bmask = blue_max << blue_shift;
2309      vs->client_pf.bits_per_pixel = bits_per_pixel;
2310      vs->client_pf.bytes_per_pixel = bits_per_pixel / 8;
2311      vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
2312      vs->client_be = big_endian_flag;
2313  
2314      if (!true_color_flag) {
2315          send_color_map(vs);
2316      }
2317  
2318      set_pixel_conversion(vs);
2319  
2320      graphic_hw_invalidate(vs->vd->dcl.con);
2321      graphic_hw_update(vs->vd->dcl.con);
2322  }
2323  
2324  static void pixel_format_message (VncState *vs) {
2325      char pad[3] = { 0, 0, 0 };
2326  
2327      vs->client_pf = qemu_default_pixelformat(32);
2328  
2329      vnc_write_u8(vs, vs->client_pf.bits_per_pixel); /* bits-per-pixel */
2330      vnc_write_u8(vs, vs->client_pf.depth); /* depth */
2331  
2332  #if HOST_BIG_ENDIAN
2333      vnc_write_u8(vs, 1);             /* big-endian-flag */
2334  #else
2335      vnc_write_u8(vs, 0);             /* big-endian-flag */
2336  #endif
2337      vnc_write_u8(vs, 1);             /* true-color-flag */
2338      vnc_write_u16(vs, vs->client_pf.rmax);     /* red-max */
2339      vnc_write_u16(vs, vs->client_pf.gmax);     /* green-max */
2340      vnc_write_u16(vs, vs->client_pf.bmax);     /* blue-max */
2341      vnc_write_u8(vs, vs->client_pf.rshift);    /* red-shift */
2342      vnc_write_u8(vs, vs->client_pf.gshift);    /* green-shift */
2343      vnc_write_u8(vs, vs->client_pf.bshift);    /* blue-shift */
2344      vnc_write(vs, pad, 3);           /* padding */
2345  
2346      vnc_hextile_set_pixel_conversion(vs, 0);
2347      vs->write_pixels = vnc_write_pixels_copy;
2348  }
2349  
2350  static void vnc_colordepth(VncState *vs)
2351  {
2352      if (vnc_has_feature(vs, VNC_FEATURE_WMVI)) {
2353          /* Sending a WMVi message to notify the client*/
2354          vnc_lock_output(vs);
2355          vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
2356          vnc_write_u8(vs, 0);
2357          vnc_write_u16(vs, 1); /* number of rects */
2358          vnc_framebuffer_update(vs, 0, 0,
2359                                 vs->client_width,
2360                                 vs->client_height,
2361                                 VNC_ENCODING_WMVi);
2362          pixel_format_message(vs);
2363          vnc_unlock_output(vs);
2364          vnc_flush(vs);
2365      } else {
2366          set_pixel_conversion(vs);
2367      }
2368  }
2369  
2370  static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
2371  {
2372      int i;
2373      uint16_t limit;
2374      uint32_t freq;
2375      VncDisplay *vd = vs->vd;
2376  
2377      if (data[0] > 3) {
2378          update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
2379      }
2380  
2381      switch (data[0]) {
2382      case VNC_MSG_CLIENT_SET_PIXEL_FORMAT:
2383          if (len == 1)
2384              return 20;
2385  
2386          set_pixel_format(vs, read_u8(data, 4),
2387                           read_u8(data, 6), read_u8(data, 7),
2388                           read_u16(data, 8), read_u16(data, 10),
2389                           read_u16(data, 12), read_u8(data, 14),
2390                           read_u8(data, 15), read_u8(data, 16));
2391          break;
2392      case VNC_MSG_CLIENT_SET_ENCODINGS:
2393          if (len == 1)
2394              return 4;
2395  
2396          if (len == 4) {
2397              limit = read_u16(data, 2);
2398              if (limit > 0)
2399                  return 4 + (limit * 4);
2400          } else
2401              limit = read_u16(data, 2);
2402  
2403          for (i = 0; i < limit; i++) {
2404              int32_t val = read_s32(data, 4 + (i * 4));
2405              memcpy(data + 4 + (i * 4), &val, sizeof(val));
2406          }
2407  
2408          set_encodings(vs, (int32_t *)(data + 4), limit);
2409          break;
2410      case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST:
2411          if (len == 1)
2412              return 10;
2413  
2414          framebuffer_update_request(vs,
2415                                     read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
2416                                     read_u16(data, 6), read_u16(data, 8));
2417          break;
2418      case VNC_MSG_CLIENT_KEY_EVENT:
2419          if (len == 1)
2420              return 8;
2421  
2422          key_event(vs, read_u8(data, 1), read_u32(data, 4));
2423          break;
2424      case VNC_MSG_CLIENT_POINTER_EVENT:
2425          if (len == 1)
2426              return 6;
2427  
2428          pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
2429          break;
2430      case VNC_MSG_CLIENT_CUT_TEXT:
2431          if (len == 1) {
2432              return 8;
2433          }
2434          uint32_t dlen = abs(read_s32(data, 4));
2435          if (len == 8) {
2436              if (dlen > (1 << 20)) {
2437                  error_report("vnc: client_cut_text msg payload has %u bytes"
2438                               " which exceeds our limit of 1MB.", dlen);
2439                  vnc_client_error(vs);
2440                  break;
2441              }
2442              if (dlen > 0) {
2443                  return 8 + dlen;
2444              }
2445          }
2446  
2447          if (read_s32(data, 4) < 0) {
2448              if (dlen < 4) {
2449                  error_report("vnc: malformed payload (header less than 4 bytes)"
2450                               " in extended clipboard pseudo-encoding.");
2451                  vnc_client_error(vs);
2452                  break;
2453              }
2454              vnc_client_cut_text_ext(vs, dlen, read_u32(data, 8), data + 12);
2455              break;
2456          }
2457          vnc_client_cut_text(vs, read_u32(data, 4), data + 8);
2458          break;
2459      case VNC_MSG_CLIENT_XVP:
2460          if (!vnc_has_feature(vs, VNC_FEATURE_XVP)) {
2461              error_report("vnc: xvp client message while disabled");
2462              vnc_client_error(vs);
2463              break;
2464          }
2465          if (len == 1) {
2466              return 4;
2467          }
2468          if (len == 4) {
2469              uint8_t version = read_u8(data, 2);
2470              uint8_t action = read_u8(data, 3);
2471  
2472              if (version != 1) {
2473                  error_report("vnc: xvp client message version %d != 1",
2474                               version);
2475                  vnc_client_error(vs);
2476                  break;
2477              }
2478  
2479              switch (action) {
2480              case VNC_XVP_ACTION_SHUTDOWN:
2481                  qemu_system_powerdown_request();
2482                  break;
2483              case VNC_XVP_ACTION_REBOOT:
2484                  send_xvp_message(vs, VNC_XVP_CODE_FAIL);
2485                  break;
2486              case VNC_XVP_ACTION_RESET:
2487                  qemu_system_reset_request(SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET);
2488                  break;
2489              default:
2490                  send_xvp_message(vs, VNC_XVP_CODE_FAIL);
2491                  break;
2492              }
2493          }
2494          break;
2495      case VNC_MSG_CLIENT_QEMU:
2496          if (len == 1)
2497              return 2;
2498  
2499          switch (read_u8(data, 1)) {
2500          case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
2501              if (len == 2)
2502                  return 12;
2503  
2504              ext_key_event(vs, read_u16(data, 2),
2505                            read_u32(data, 4), read_u32(data, 8));
2506              break;
2507          case VNC_MSG_CLIENT_QEMU_AUDIO:
2508              if (!vnc_has_feature(vs, VNC_FEATURE_AUDIO)) {
2509                  error_report("Audio message %d with audio disabled", read_u8(data, 2));
2510                  vnc_client_error(vs);
2511                  break;
2512              }
2513  
2514              if (len == 2)
2515                  return 4;
2516  
2517              switch (read_u16 (data, 2)) {
2518              case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
2519                  trace_vnc_msg_client_audio_enable(vs, vs->ioc);
2520                  audio_add(vs);
2521                  break;
2522              case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE:
2523                  trace_vnc_msg_client_audio_disable(vs, vs->ioc);
2524                  audio_del(vs);
2525                  break;
2526              case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT:
2527                  if (len == 4)
2528                      return 10;
2529                  switch (read_u8(data, 4)) {
2530                  case 0: vs->as.fmt = AUDIO_FORMAT_U8; break;
2531                  case 1: vs->as.fmt = AUDIO_FORMAT_S8; break;
2532                  case 2: vs->as.fmt = AUDIO_FORMAT_U16; break;
2533                  case 3: vs->as.fmt = AUDIO_FORMAT_S16; break;
2534                  case 4: vs->as.fmt = AUDIO_FORMAT_U32; break;
2535                  case 5: vs->as.fmt = AUDIO_FORMAT_S32; break;
2536                  default:
2537                      VNC_DEBUG("Invalid audio format %d\n", read_u8(data, 4));
2538                      vnc_client_error(vs);
2539                      break;
2540                  }
2541                  vs->as.nchannels = read_u8(data, 5);
2542                  if (vs->as.nchannels != 1 && vs->as.nchannels != 2) {
2543                      VNC_DEBUG("Invalid audio channel count %d\n",
2544                                read_u8(data, 5));
2545                      vnc_client_error(vs);
2546                      break;
2547                  }
2548                  freq = read_u32(data, 6);
2549                  /* No official limit for protocol, but 48khz is a sensible
2550                   * upper bound for trustworthy clients, and this limit
2551                   * protects calculations involving 'vs->as.freq' later.
2552                   */
2553                  if (freq > 48000) {
2554                      VNC_DEBUG("Invalid audio frequency %u > 48000", freq);
2555                      vnc_client_error(vs);
2556                      break;
2557                  }
2558                  vs->as.freq = freq;
2559                  trace_vnc_msg_client_audio_format(
2560                      vs, vs->ioc, vs->as.fmt, vs->as.nchannels, vs->as.freq);
2561                  break;
2562              default:
2563                  VNC_DEBUG("Invalid audio message %d\n", read_u8(data, 2));
2564                  vnc_client_error(vs);
2565                  break;
2566              }
2567              break;
2568  
2569          default:
2570              VNC_DEBUG("Msg: %d\n", read_u16(data, 0));
2571              vnc_client_error(vs);
2572              break;
2573          }
2574          break;
2575      case VNC_MSG_CLIENT_SET_DESKTOP_SIZE:
2576      {
2577          size_t size;
2578          uint8_t screens;
2579          int w, h;
2580  
2581          if (len < 8) {
2582              return 8;
2583          }
2584  
2585          screens = read_u8(data, 6);
2586          size    = 8 + screens * 16;
2587          if (len < size) {
2588              return size;
2589          }
2590          w = read_u16(data, 2);
2591          h = read_u16(data, 4);
2592  
2593          trace_vnc_msg_client_set_desktop_size(vs, vs->ioc, w, h, screens);
2594          if (dpy_ui_info_supported(vs->vd->dcl.con)) {
2595              QemuUIInfo info;
2596              memset(&info, 0, sizeof(info));
2597              info.width = w;
2598              info.height = h;
2599              dpy_set_ui_info(vs->vd->dcl.con, &info, false);
2600              vnc_desktop_resize_ext(vs, 4 /* Request forwarded */);
2601          } else {
2602              vnc_desktop_resize_ext(vs, 3 /* Invalid screen layout */);
2603          }
2604  
2605          break;
2606      }
2607      default:
2608          VNC_DEBUG("Msg: %d\n", data[0]);
2609          vnc_client_error(vs);
2610          break;
2611      }
2612  
2613      vnc_update_throttle_offset(vs);
2614      vnc_read_when(vs, protocol_client_msg, 1);
2615      return 0;
2616  }
2617  
2618  static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
2619  {
2620      char buf[1024];
2621      VncShareMode mode;
2622      int size;
2623  
2624      mode = data[0] ? VNC_SHARE_MODE_SHARED : VNC_SHARE_MODE_EXCLUSIVE;
2625      switch (vs->vd->share_policy) {
2626      case VNC_SHARE_POLICY_IGNORE:
2627          /*
2628           * Ignore the shared flag.  Nothing to do here.
2629           *
2630           * Doesn't conform to the rfb spec but is traditional qemu
2631           * behavior, thus left here as option for compatibility
2632           * reasons.
2633           */
2634          break;
2635      case VNC_SHARE_POLICY_ALLOW_EXCLUSIVE:
2636          /*
2637           * Policy: Allow clients ask for exclusive access.
2638           *
2639           * Implementation: When a client asks for exclusive access,
2640           * disconnect all others. Shared connects are allowed as long
2641           * as no exclusive connection exists.
2642           *
2643           * This is how the rfb spec suggests to handle the shared flag.
2644           */
2645          if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2646              VncState *client;
2647              QTAILQ_FOREACH(client, &vs->vd->clients, next) {
2648                  if (vs == client) {
2649                      continue;
2650                  }
2651                  if (client->share_mode != VNC_SHARE_MODE_EXCLUSIVE &&
2652                      client->share_mode != VNC_SHARE_MODE_SHARED) {
2653                      continue;
2654                  }
2655                  vnc_disconnect_start(client);
2656              }
2657          }
2658          if (mode == VNC_SHARE_MODE_SHARED) {
2659              if (vs->vd->num_exclusive > 0) {
2660                  vnc_disconnect_start(vs);
2661                  return 0;
2662              }
2663          }
2664          break;
2665      case VNC_SHARE_POLICY_FORCE_SHARED:
2666          /*
2667           * Policy: Shared connects only.
2668           * Implementation: Disallow clients asking for exclusive access.
2669           *
2670           * Useful for shared desktop sessions where you don't want
2671           * someone forgetting to say -shared when running the vnc
2672           * client disconnect everybody else.
2673           */
2674          if (mode == VNC_SHARE_MODE_EXCLUSIVE) {
2675              vnc_disconnect_start(vs);
2676              return 0;
2677          }
2678          break;
2679      }
2680      vnc_set_share_mode(vs, mode);
2681  
2682      if (vs->vd->num_shared > vs->vd->connections_limit) {
2683          vnc_disconnect_start(vs);
2684          return 0;
2685      }
2686  
2687      assert(pixman_image_get_width(vs->vd->server) < 65536 &&
2688             pixman_image_get_width(vs->vd->server) >= 0);
2689      assert(pixman_image_get_height(vs->vd->server) < 65536 &&
2690             pixman_image_get_height(vs->vd->server) >= 0);
2691      vs->client_width = pixman_image_get_width(vs->vd->server);
2692      vs->client_height = pixman_image_get_height(vs->vd->server);
2693      vnc_write_u16(vs, vs->client_width);
2694      vnc_write_u16(vs, vs->client_height);
2695  
2696      pixel_format_message(vs);
2697  
2698      if (qemu_name) {
2699          size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
2700          if (size > sizeof(buf)) {
2701              size = sizeof(buf);
2702          }
2703      } else {
2704          size = snprintf(buf, sizeof(buf), "QEMU");
2705      }
2706  
2707      vnc_write_u32(vs, size);
2708      vnc_write(vs, buf, size);
2709      vnc_flush(vs);
2710  
2711      vnc_client_cache_auth(vs);
2712      vnc_qmp_event(vs, QAPI_EVENT_VNC_INITIALIZED);
2713  
2714      vnc_read_when(vs, protocol_client_msg, 1);
2715  
2716      return 0;
2717  }
2718  
2719  void start_client_init(VncState *vs)
2720  {
2721      vnc_read_when(vs, protocol_client_init, 1);
2722  }
2723  
2724  static void authentication_failed(VncState *vs)
2725  {
2726      vnc_write_u32(vs, 1); /* Reject auth */
2727      if (vs->minor >= 8) {
2728          static const char err[] = "Authentication failed";
2729          vnc_write_u32(vs, sizeof(err));
2730          vnc_write(vs, err, sizeof(err));
2731      }
2732      vnc_flush(vs);
2733      vnc_client_error(vs);
2734  }
2735  
2736  static void
2737  vnc_munge_des_rfb_key(unsigned char *key, size_t nkey)
2738  {
2739      size_t i;
2740      for (i = 0; i < nkey; i++) {
2741          uint8_t r = key[i];
2742          r = (r & 0xf0) >> 4 | (r & 0x0f) << 4;
2743          r = (r & 0xcc) >> 2 | (r & 0x33) << 2;
2744          r = (r & 0xaa) >> 1 | (r & 0x55) << 1;
2745          key[i] = r;
2746      }
2747  }
2748  
2749  static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
2750  {
2751      unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
2752      size_t i, pwlen;
2753      unsigned char key[8];
2754      time_t now = time(NULL);
2755      QCryptoCipher *cipher = NULL;
2756      Error *err = NULL;
2757  
2758      if (!vs->vd->password) {
2759          trace_vnc_auth_fail(vs, vs->auth, "password is not set", "");
2760          goto reject;
2761      }
2762      if (vs->vd->expires < now) {
2763          trace_vnc_auth_fail(vs, vs->auth, "password is expired", "");
2764          goto reject;
2765      }
2766  
2767      memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
2768  
2769      /* Calculate the expected challenge response */
2770      pwlen = strlen(vs->vd->password);
2771      for (i=0; i<sizeof(key); i++)
2772          key[i] = i<pwlen ? vs->vd->password[i] : 0;
2773      vnc_munge_des_rfb_key(key, sizeof(key));
2774  
2775      cipher = qcrypto_cipher_new(
2776          QCRYPTO_CIPHER_ALG_DES,
2777          QCRYPTO_CIPHER_MODE_ECB,
2778          key, G_N_ELEMENTS(key),
2779          &err);
2780      if (!cipher) {
2781          trace_vnc_auth_fail(vs, vs->auth, "cannot create cipher",
2782                              error_get_pretty(err));
2783          error_free(err);
2784          goto reject;
2785      }
2786  
2787      if (qcrypto_cipher_encrypt(cipher,
2788                                 vs->challenge,
2789                                 response,
2790                                 VNC_AUTH_CHALLENGE_SIZE,
2791                                 &err) < 0) {
2792          trace_vnc_auth_fail(vs, vs->auth, "cannot encrypt challenge response",
2793                              error_get_pretty(err));
2794          error_free(err);
2795          goto reject;
2796      }
2797  
2798      /* Compare expected vs actual challenge response */
2799      if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
2800          trace_vnc_auth_fail(vs, vs->auth, "mis-matched challenge response", "");
2801          goto reject;
2802      } else {
2803          trace_vnc_auth_pass(vs, vs->auth);
2804          vnc_write_u32(vs, 0); /* Accept auth */
2805          vnc_flush(vs);
2806  
2807          start_client_init(vs);
2808      }
2809  
2810      qcrypto_cipher_free(cipher);
2811      return 0;
2812  
2813  reject:
2814      authentication_failed(vs);
2815      qcrypto_cipher_free(cipher);
2816      return 0;
2817  }
2818  
2819  void start_auth_vnc(VncState *vs)
2820  {
2821      Error *err = NULL;
2822  
2823      if (qcrypto_random_bytes(vs->challenge, sizeof(vs->challenge), &err)) {
2824          trace_vnc_auth_fail(vs, vs->auth, "cannot get random bytes",
2825                              error_get_pretty(err));
2826          error_free(err);
2827          authentication_failed(vs);
2828          return;
2829      }
2830  
2831      /* Send client a 'random' challenge */
2832      vnc_write(vs, vs->challenge, sizeof(vs->challenge));
2833      vnc_flush(vs);
2834  
2835      vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
2836  }
2837  
2838  
2839  static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
2840  {
2841      /* We only advertise 1 auth scheme at a time, so client
2842       * must pick the one we sent. Verify this */
2843      if (data[0] != vs->auth) { /* Reject auth */
2844         trace_vnc_auth_reject(vs, vs->auth, (int)data[0]);
2845         authentication_failed(vs);
2846      } else { /* Accept requested auth */
2847         trace_vnc_auth_start(vs, vs->auth);
2848         switch (vs->auth) {
2849         case VNC_AUTH_NONE:
2850             if (vs->minor >= 8) {
2851                 vnc_write_u32(vs, 0); /* Accept auth completion */
2852                 vnc_flush(vs);
2853             }
2854             trace_vnc_auth_pass(vs, vs->auth);
2855             start_client_init(vs);
2856             break;
2857  
2858         case VNC_AUTH_VNC:
2859             start_auth_vnc(vs);
2860             break;
2861  
2862         case VNC_AUTH_VENCRYPT:
2863             start_auth_vencrypt(vs);
2864             break;
2865  
2866  #ifdef CONFIG_VNC_SASL
2867         case VNC_AUTH_SASL:
2868             start_auth_sasl(vs);
2869             break;
2870  #endif /* CONFIG_VNC_SASL */
2871  
2872         default: /* Should not be possible, but just in case */
2873             trace_vnc_auth_fail(vs, vs->auth, "Unhandled auth method", "");
2874             authentication_failed(vs);
2875         }
2876      }
2877      return 0;
2878  }
2879  
2880  static int protocol_version(VncState *vs, uint8_t *version, size_t len)
2881  {
2882      char local[13];
2883  
2884      memcpy(local, version, 12);
2885      local[12] = 0;
2886  
2887      if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
2888          VNC_DEBUG("Malformed protocol version %s\n", local);
2889          vnc_client_error(vs);
2890          return 0;
2891      }
2892      VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
2893      if (vs->major != 3 ||
2894          (vs->minor != 3 &&
2895           vs->minor != 4 &&
2896           vs->minor != 5 &&
2897           vs->minor != 7 &&
2898           vs->minor != 8)) {
2899          VNC_DEBUG("Unsupported client version\n");
2900          vnc_write_u32(vs, VNC_AUTH_INVALID);
2901          vnc_flush(vs);
2902          vnc_client_error(vs);
2903          return 0;
2904      }
2905      /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2906       * as equivalent to v3.3 by servers
2907       */
2908      if (vs->minor == 4 || vs->minor == 5)
2909          vs->minor = 3;
2910  
2911      if (vs->minor == 3) {
2912          trace_vnc_auth_start(vs, vs->auth);
2913          if (vs->auth == VNC_AUTH_NONE) {
2914              vnc_write_u32(vs, vs->auth);
2915              vnc_flush(vs);
2916              trace_vnc_auth_pass(vs, vs->auth);
2917              start_client_init(vs);
2918         } else if (vs->auth == VNC_AUTH_VNC) {
2919              VNC_DEBUG("Tell client VNC auth\n");
2920              vnc_write_u32(vs, vs->auth);
2921              vnc_flush(vs);
2922              start_auth_vnc(vs);
2923         } else {
2924              trace_vnc_auth_fail(vs, vs->auth,
2925                                  "Unsupported auth method for v3.3", "");
2926              vnc_write_u32(vs, VNC_AUTH_INVALID);
2927              vnc_flush(vs);
2928              vnc_client_error(vs);
2929         }
2930      } else {
2931          vnc_write_u8(vs, 1); /* num auth */
2932          vnc_write_u8(vs, vs->auth);
2933          vnc_read_when(vs, protocol_client_auth, 1);
2934          vnc_flush(vs);
2935      }
2936  
2937      return 0;
2938  }
2939  
2940  static VncRectStat *vnc_stat_rect(VncDisplay *vd, int x, int y)
2941  {
2942      struct VncSurface *vs = &vd->guest;
2943  
2944      return &vs->stats[y / VNC_STAT_RECT][x / VNC_STAT_RECT];
2945  }
2946  
2947  void vnc_sent_lossy_rect(VncState *vs, int x, int y, int w, int h)
2948  {
2949      int i, j;
2950  
2951      w = (x + w) / VNC_STAT_RECT;
2952      h = (y + h) / VNC_STAT_RECT;
2953      x /= VNC_STAT_RECT;
2954      y /= VNC_STAT_RECT;
2955  
2956      for (j = y; j <= h; j++) {
2957          for (i = x; i <= w; i++) {
2958              vs->lossy_rect[j][i] = 1;
2959          }
2960      }
2961  }
2962  
2963  static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y)
2964  {
2965      VncState *vs;
2966      int sty = y / VNC_STAT_RECT;
2967      int stx = x / VNC_STAT_RECT;
2968      int has_dirty = 0;
2969  
2970      y = QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
2971      x = QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
2972  
2973      QTAILQ_FOREACH(vs, &vd->clients, next) {
2974          int j;
2975  
2976          /* kernel send buffers are full -> refresh later */
2977          if (vs->output.offset) {
2978              continue;
2979          }
2980  
2981          if (!vs->lossy_rect[sty][stx]) {
2982              continue;
2983          }
2984  
2985          vs->lossy_rect[sty][stx] = 0;
2986          for (j = 0; j < VNC_STAT_RECT; ++j) {
2987              bitmap_set(vs->dirty[y + j],
2988                         x / VNC_DIRTY_PIXELS_PER_BIT,
2989                         VNC_STAT_RECT / VNC_DIRTY_PIXELS_PER_BIT);
2990          }
2991          has_dirty++;
2992      }
2993  
2994      return has_dirty;
2995  }
2996  
2997  static int vnc_update_stats(VncDisplay *vd,  struct timeval * tv)
2998  {
2999      int width = MIN(pixman_image_get_width(vd->guest.fb),
3000                      pixman_image_get_width(vd->server));
3001      int height = MIN(pixman_image_get_height(vd->guest.fb),
3002                       pixman_image_get_height(vd->server));
3003      int x, y;
3004      struct timeval res;
3005      int has_dirty = 0;
3006  
3007      for (y = 0; y < height; y += VNC_STAT_RECT) {
3008          for (x = 0; x < width; x += VNC_STAT_RECT) {
3009              VncRectStat *rect = vnc_stat_rect(vd, x, y);
3010  
3011              rect->updated = false;
3012          }
3013      }
3014  
3015      qemu_timersub(tv, &VNC_REFRESH_STATS, &res);
3016  
3017      if (timercmp(&vd->guest.last_freq_check, &res, >)) {
3018          return has_dirty;
3019      }
3020      vd->guest.last_freq_check = *tv;
3021  
3022      for (y = 0; y < height; y += VNC_STAT_RECT) {
3023          for (x = 0; x < width; x += VNC_STAT_RECT) {
3024              VncRectStat *rect= vnc_stat_rect(vd, x, y);
3025              int count = ARRAY_SIZE(rect->times);
3026              struct timeval min, max;
3027  
3028              if (!timerisset(&rect->times[count - 1])) {
3029                  continue ;
3030              }
3031  
3032              max = rect->times[(rect->idx + count - 1) % count];
3033              qemu_timersub(tv, &max, &res);
3034  
3035              if (timercmp(&res, &VNC_REFRESH_LOSSY, >)) {
3036                  rect->freq = 0;
3037                  has_dirty += vnc_refresh_lossy_rect(vd, x, y);
3038                  memset(rect->times, 0, sizeof (rect->times));
3039                  continue ;
3040              }
3041  
3042              min = rect->times[rect->idx];
3043              max = rect->times[(rect->idx + count - 1) % count];
3044              qemu_timersub(&max, &min, &res);
3045  
3046              rect->freq = res.tv_sec + res.tv_usec / 1000000.;
3047              rect->freq /= count;
3048              rect->freq = 1. / rect->freq;
3049          }
3050      }
3051      return has_dirty;
3052  }
3053  
3054  double vnc_update_freq(VncState *vs, int x, int y, int w, int h)
3055  {
3056      int i, j;
3057      double total = 0;
3058      int num = 0;
3059  
3060      x =  QEMU_ALIGN_DOWN(x, VNC_STAT_RECT);
3061      y =  QEMU_ALIGN_DOWN(y, VNC_STAT_RECT);
3062  
3063      for (j = y; j <= y + h; j += VNC_STAT_RECT) {
3064          for (i = x; i <= x + w; i += VNC_STAT_RECT) {
3065              total += vnc_stat_rect(vs->vd, i, j)->freq;
3066              num++;
3067          }
3068      }
3069  
3070      if (num) {
3071          return total / num;
3072      } else {
3073          return 0;
3074      }
3075  }
3076  
3077  static void vnc_rect_updated(VncDisplay *vd, int x, int y, struct timeval * tv)
3078  {
3079      VncRectStat *rect;
3080  
3081      rect = vnc_stat_rect(vd, x, y);
3082      if (rect->updated) {
3083          return;
3084      }
3085      rect->times[rect->idx] = *tv;
3086      rect->idx = (rect->idx + 1) % ARRAY_SIZE(rect->times);
3087      rect->updated = true;
3088  }
3089  
3090  static int vnc_refresh_server_surface(VncDisplay *vd)
3091  {
3092      int width = MIN(pixman_image_get_width(vd->guest.fb),
3093                      pixman_image_get_width(vd->server));
3094      int height = MIN(pixman_image_get_height(vd->guest.fb),
3095                       pixman_image_get_height(vd->server));
3096      int cmp_bytes, server_stride, line_bytes, guest_ll, guest_stride, y = 0;
3097      uint8_t *guest_row0 = NULL, *server_row0;
3098      VncState *vs;
3099      int has_dirty = 0;
3100      pixman_image_t *tmpbuf = NULL;
3101      unsigned long offset;
3102      int x;
3103      uint8_t *guest_ptr, *server_ptr;
3104  
3105      struct timeval tv = { 0, 0 };
3106  
3107      if (!vd->non_adaptive) {
3108          gettimeofday(&tv, NULL);
3109          has_dirty = vnc_update_stats(vd, &tv);
3110      }
3111  
3112      offset = find_next_bit((unsigned long *) &vd->guest.dirty,
3113                             height * VNC_DIRTY_BPL(&vd->guest), 0);
3114      if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
3115          /* no dirty bits in guest surface */
3116          return has_dirty;
3117      }
3118  
3119      /*
3120       * Walk through the guest dirty map.
3121       * Check and copy modified bits from guest to server surface.
3122       * Update server dirty map.
3123       */
3124      server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
3125      server_stride = guest_stride = guest_ll =
3126          pixman_image_get_stride(vd->server);
3127      cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
3128                      server_stride);
3129      if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
3130          int w = pixman_image_get_width(vd->server);
3131          tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, w);
3132      } else {
3133          int guest_bpp =
3134              PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
3135          guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
3136          guest_stride = pixman_image_get_stride(vd->guest.fb);
3137          guest_ll = pixman_image_get_width(vd->guest.fb)
3138                     * DIV_ROUND_UP(guest_bpp, 8);
3139      }
3140      line_bytes = MIN(server_stride, guest_ll);
3141  
3142      for (;;) {
3143          y = offset / VNC_DIRTY_BPL(&vd->guest);
3144          x = offset % VNC_DIRTY_BPL(&vd->guest);
3145  
3146          server_ptr = server_row0 + y * server_stride + x * cmp_bytes;
3147  
3148          if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
3149              qemu_pixman_linebuf_fill(tmpbuf, vd->guest.fb, width, 0, y);
3150              guest_ptr = (uint8_t *)pixman_image_get_data(tmpbuf);
3151          } else {
3152              guest_ptr = guest_row0 + y * guest_stride;
3153          }
3154          guest_ptr += x * cmp_bytes;
3155  
3156          for (; x < DIV_ROUND_UP(width, VNC_DIRTY_PIXELS_PER_BIT);
3157               x++, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
3158              int _cmp_bytes = cmp_bytes;
3159              if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
3160                  continue;
3161              }
3162              if ((x + 1) * cmp_bytes > line_bytes) {
3163                  _cmp_bytes = line_bytes - x * cmp_bytes;
3164              }
3165              assert(_cmp_bytes >= 0);
3166              if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
3167                  continue;
3168              }
3169              memcpy(server_ptr, guest_ptr, _cmp_bytes);
3170              if (!vd->non_adaptive) {
3171                  vnc_rect_updated(vd, x * VNC_DIRTY_PIXELS_PER_BIT,
3172                                   y, &tv);
3173              }
3174              QTAILQ_FOREACH(vs, &vd->clients, next) {
3175                  set_bit(x, vs->dirty[y]);
3176              }
3177              has_dirty++;
3178          }
3179  
3180          y++;
3181          offset = find_next_bit((unsigned long *) &vd->guest.dirty,
3182                                 height * VNC_DIRTY_BPL(&vd->guest),
3183                                 y * VNC_DIRTY_BPL(&vd->guest));
3184          if (offset == height * VNC_DIRTY_BPL(&vd->guest)) {
3185              /* no more dirty bits */
3186              break;
3187          }
3188      }
3189      qemu_pixman_image_unref(tmpbuf);
3190      return has_dirty;
3191  }
3192  
3193  static void vnc_refresh(DisplayChangeListener *dcl)
3194  {
3195      VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
3196      VncState *vs, *vn;
3197      int has_dirty, rects = 0;
3198  
3199      if (QTAILQ_EMPTY(&vd->clients)) {
3200          update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_MAX);
3201          return;
3202      }
3203  
3204      graphic_hw_update(vd->dcl.con);
3205  
3206      if (vnc_trylock_display(vd)) {
3207          update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3208          return;
3209      }
3210  
3211      has_dirty = vnc_refresh_server_surface(vd);
3212      vnc_unlock_display(vd);
3213  
3214      QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
3215          rects += vnc_update_client(vs, has_dirty);
3216          /* vs might be free()ed here */
3217      }
3218  
3219      if (has_dirty && rects) {
3220          vd->dcl.update_interval /= 2;
3221          if (vd->dcl.update_interval < VNC_REFRESH_INTERVAL_BASE) {
3222              vd->dcl.update_interval = VNC_REFRESH_INTERVAL_BASE;
3223          }
3224      } else {
3225          vd->dcl.update_interval += VNC_REFRESH_INTERVAL_INC;
3226          if (vd->dcl.update_interval > VNC_REFRESH_INTERVAL_MAX) {
3227              vd->dcl.update_interval = VNC_REFRESH_INTERVAL_MAX;
3228          }
3229      }
3230  }
3231  
3232  static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc,
3233                          bool skipauth, bool websocket)
3234  {
3235      VncState *vs = g_new0(VncState, 1);
3236      bool first_client = QTAILQ_EMPTY(&vd->clients);
3237      int i;
3238  
3239      trace_vnc_client_connect(vs, sioc);
3240      vs->zrle = g_new0(VncZrle, 1);
3241      vs->tight = g_new0(VncTight, 1);
3242      vs->magic = VNC_MAGIC;
3243      vs->sioc = sioc;
3244      object_ref(OBJECT(vs->sioc));
3245      vs->ioc = QIO_CHANNEL(sioc);
3246      object_ref(OBJECT(vs->ioc));
3247      vs->vd = vd;
3248  
3249      buffer_init(&vs->input,          "vnc-input/%p", sioc);
3250      buffer_init(&vs->output,         "vnc-output/%p", sioc);
3251      buffer_init(&vs->jobs_buffer,    "vnc-jobs_buffer/%p", sioc);
3252  
3253      buffer_init(&vs->tight->tight,    "vnc-tight/%p", sioc);
3254      buffer_init(&vs->tight->zlib,     "vnc-tight-zlib/%p", sioc);
3255      buffer_init(&vs->tight->gradient, "vnc-tight-gradient/%p", sioc);
3256  #ifdef CONFIG_VNC_JPEG
3257      buffer_init(&vs->tight->jpeg,     "vnc-tight-jpeg/%p", sioc);
3258  #endif
3259  #ifdef CONFIG_PNG
3260      buffer_init(&vs->tight->png,      "vnc-tight-png/%p", sioc);
3261  #endif
3262      buffer_init(&vs->zlib.zlib,      "vnc-zlib/%p", sioc);
3263      buffer_init(&vs->zrle->zrle,      "vnc-zrle/%p", sioc);
3264      buffer_init(&vs->zrle->fb,        "vnc-zrle-fb/%p", sioc);
3265      buffer_init(&vs->zrle->zlib,      "vnc-zrle-zlib/%p", sioc);
3266  
3267      if (skipauth) {
3268          vs->auth = VNC_AUTH_NONE;
3269          vs->subauth = VNC_AUTH_INVALID;
3270      } else {
3271          if (websocket) {
3272              vs->auth = vd->ws_auth;
3273              vs->subauth = VNC_AUTH_INVALID;
3274          } else {
3275              vs->auth = vd->auth;
3276              vs->subauth = vd->subauth;
3277          }
3278      }
3279      VNC_DEBUG("Client sioc=%p ws=%d auth=%d subauth=%d\n",
3280                sioc, websocket, vs->auth, vs->subauth);
3281  
3282      vs->lossy_rect = g_malloc0(VNC_STAT_ROWS * sizeof (*vs->lossy_rect));
3283      for (i = 0; i < VNC_STAT_ROWS; ++i) {
3284          vs->lossy_rect[i] = g_new0(uint8_t, VNC_STAT_COLS);
3285      }
3286  
3287      VNC_DEBUG("New client on socket %p\n", vs->sioc);
3288      update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3289      qio_channel_set_blocking(vs->ioc, false, NULL);
3290      if (vs->ioc_tag) {
3291          g_source_remove(vs->ioc_tag);
3292      }
3293      if (websocket) {
3294          vs->websocket = 1;
3295          if (vd->tlscreds) {
3296              vs->ioc_tag = qio_channel_add_watch(
3297                  vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3298                  vncws_tls_handshake_io, vs, NULL);
3299          } else {
3300              vs->ioc_tag = qio_channel_add_watch(
3301                  vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3302                  vncws_handshake_io, vs, NULL);
3303          }
3304      } else {
3305          vs->ioc_tag = qio_channel_add_watch(
3306              vs->ioc, G_IO_IN | G_IO_HUP | G_IO_ERR,
3307              vnc_client_io, vs, NULL);
3308      }
3309  
3310      vnc_client_cache_addr(vs);
3311      vnc_qmp_event(vs, QAPI_EVENT_VNC_CONNECTED);
3312      vnc_set_share_mode(vs, VNC_SHARE_MODE_CONNECTING);
3313  
3314      vs->last_x = -1;
3315      vs->last_y = -1;
3316  
3317      vs->as.freq = 44100;
3318      vs->as.nchannels = 2;
3319      vs->as.fmt = AUDIO_FORMAT_S16;
3320      vs->as.endianness = 0;
3321  
3322      qemu_mutex_init(&vs->output_mutex);
3323      vs->bh = qemu_bh_new(vnc_jobs_bh, vs);
3324  
3325      QTAILQ_INSERT_TAIL(&vd->clients, vs, next);
3326      if (first_client) {
3327          vnc_update_server_surface(vd);
3328      }
3329  
3330      graphic_hw_update(vd->dcl.con);
3331  
3332      if (!vs->websocket) {
3333          vnc_start_protocol(vs);
3334      }
3335  
3336      if (vd->num_connecting > vd->connections_limit) {
3337          QTAILQ_FOREACH(vs, &vd->clients, next) {
3338              if (vs->share_mode == VNC_SHARE_MODE_CONNECTING) {
3339                  vnc_disconnect_start(vs);
3340                  return;
3341              }
3342          }
3343      }
3344  }
3345  
3346  void vnc_start_protocol(VncState *vs)
3347  {
3348      vnc_write(vs, "RFB 003.008\n", 12);
3349      vnc_flush(vs);
3350      vnc_read_when(vs, protocol_version, 12);
3351  
3352      vs->mouse_mode_notifier.notify = check_pointer_type_change;
3353      qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
3354  }
3355  
3356  static void vnc_listen_io(QIONetListener *listener,
3357                            QIOChannelSocket *cioc,
3358                            void *opaque)
3359  {
3360      VncDisplay *vd = opaque;
3361      bool isWebsock = listener == vd->wslistener;
3362  
3363      qio_channel_set_name(QIO_CHANNEL(cioc),
3364                           isWebsock ? "vnc-ws-server" : "vnc-server");
3365      qio_channel_set_delay(QIO_CHANNEL(cioc), false);
3366      vnc_connect(vd, cioc, false, isWebsock);
3367  }
3368  
3369  static const DisplayChangeListenerOps dcl_ops = {
3370      .dpy_name             = "vnc",
3371      .dpy_refresh          = vnc_refresh,
3372      .dpy_gfx_update       = vnc_dpy_update,
3373      .dpy_gfx_switch       = vnc_dpy_switch,
3374      .dpy_gfx_check_format = qemu_pixman_check_format,
3375      .dpy_mouse_set        = vnc_mouse_set,
3376      .dpy_cursor_define    = vnc_dpy_cursor_define,
3377  };
3378  
3379  void vnc_display_init(const char *id, Error **errp)
3380  {
3381      VncDisplay *vd;
3382  
3383      if (vnc_display_find(id) != NULL) {
3384          return;
3385      }
3386      vd = g_malloc0(sizeof(*vd));
3387  
3388      vd->id = strdup(id);
3389      QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
3390  
3391      QTAILQ_INIT(&vd->clients);
3392      vd->expires = TIME_MAX;
3393  
3394      if (keyboard_layout) {
3395          trace_vnc_key_map_init(keyboard_layout);
3396          vd->kbd_layout = init_keyboard_layout(name2keysym,
3397                                                keyboard_layout, errp);
3398      } else {
3399          vd->kbd_layout = init_keyboard_layout(name2keysym, "en-us", errp);
3400      }
3401  
3402      if (!vd->kbd_layout) {
3403          return;
3404      }
3405  
3406      vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
3407      vd->connections_limit = 32;
3408  
3409      qemu_mutex_init(&vd->mutex);
3410      vnc_start_worker_thread();
3411  
3412      vd->dcl.ops = &dcl_ops;
3413      register_displaychangelistener(&vd->dcl);
3414      vd->kbd = qkbd_state_init(vd->dcl.con);
3415  }
3416  
3417  
3418  static void vnc_display_close(VncDisplay *vd)
3419  {
3420      if (!vd) {
3421          return;
3422      }
3423      vd->is_unix = false;
3424  
3425      if (vd->listener) {
3426          qio_net_listener_disconnect(vd->listener);
3427          object_unref(OBJECT(vd->listener));
3428      }
3429      vd->listener = NULL;
3430  
3431      if (vd->wslistener) {
3432          qio_net_listener_disconnect(vd->wslistener);
3433          object_unref(OBJECT(vd->wslistener));
3434      }
3435      vd->wslistener = NULL;
3436  
3437      vd->auth = VNC_AUTH_INVALID;
3438      vd->subauth = VNC_AUTH_INVALID;
3439      if (vd->tlscreds) {
3440          object_unref(OBJECT(vd->tlscreds));
3441          vd->tlscreds = NULL;
3442      }
3443      if (vd->tlsauthz) {
3444          object_unparent(OBJECT(vd->tlsauthz));
3445          vd->tlsauthz = NULL;
3446      }
3447      g_free(vd->tlsauthzid);
3448      vd->tlsauthzid = NULL;
3449      if (vd->lock_key_sync) {
3450          qemu_remove_led_event_handler(vd->led);
3451          vd->led = NULL;
3452      }
3453  #ifdef CONFIG_VNC_SASL
3454      if (vd->sasl.authz) {
3455          object_unparent(OBJECT(vd->sasl.authz));
3456          vd->sasl.authz = NULL;
3457      }
3458      g_free(vd->sasl.authzid);
3459      vd->sasl.authzid = NULL;
3460  #endif
3461  }
3462  
3463  int vnc_display_password(const char *id, const char *password)
3464  {
3465      VncDisplay *vd = vnc_display_find(id);
3466  
3467      if (!vd) {
3468          return -EINVAL;
3469      }
3470      if (vd->auth == VNC_AUTH_NONE) {
3471          error_printf_unless_qmp("If you want use passwords please enable "
3472                                  "password auth using '-vnc ${dpy},password'.\n");
3473          return -EINVAL;
3474      }
3475  
3476      g_free(vd->password);
3477      vd->password = g_strdup(password);
3478  
3479      return 0;
3480  }
3481  
3482  int vnc_display_pw_expire(const char *id, time_t expires)
3483  {
3484      VncDisplay *vd = vnc_display_find(id);
3485  
3486      if (!vd) {
3487          return -EINVAL;
3488      }
3489  
3490      vd->expires = expires;
3491      return 0;
3492  }
3493  
3494  static void vnc_display_print_local_addr(VncDisplay *vd)
3495  {
3496      SocketAddress *addr;
3497  
3498      if (!vd->listener || !vd->listener->nsioc) {
3499          return;
3500      }
3501  
3502      addr = qio_channel_socket_get_local_address(vd->listener->sioc[0], NULL);
3503      if (!addr) {
3504          return;
3505      }
3506  
3507      if (addr->type != SOCKET_ADDRESS_TYPE_INET) {
3508          qapi_free_SocketAddress(addr);
3509          return;
3510      }
3511      error_printf_unless_qmp("VNC server running on %s:%s\n",
3512                              addr->u.inet.host,
3513                              addr->u.inet.port);
3514      qapi_free_SocketAddress(addr);
3515  }
3516  
3517  static QemuOptsList qemu_vnc_opts = {
3518      .name = "vnc",
3519      .head = QTAILQ_HEAD_INITIALIZER(qemu_vnc_opts.head),
3520      .implied_opt_name = "vnc",
3521      .desc = {
3522          {
3523              .name = "vnc",
3524              .type = QEMU_OPT_STRING,
3525          },{
3526              .name = "websocket",
3527              .type = QEMU_OPT_STRING,
3528          },{
3529              .name = "tls-creds",
3530              .type = QEMU_OPT_STRING,
3531          },{
3532              .name = "share",
3533              .type = QEMU_OPT_STRING,
3534          },{
3535              .name = "display",
3536              .type = QEMU_OPT_STRING,
3537          },{
3538              .name = "head",
3539              .type = QEMU_OPT_NUMBER,
3540          },{
3541              .name = "connections",
3542              .type = QEMU_OPT_NUMBER,
3543          },{
3544              .name = "to",
3545              .type = QEMU_OPT_NUMBER,
3546          },{
3547              .name = "ipv4",
3548              .type = QEMU_OPT_BOOL,
3549          },{
3550              .name = "ipv6",
3551              .type = QEMU_OPT_BOOL,
3552          },{
3553              .name = "password",
3554              .type = QEMU_OPT_BOOL,
3555          },{
3556              .name = "password-secret",
3557              .type = QEMU_OPT_STRING,
3558          },{
3559              .name = "reverse",
3560              .type = QEMU_OPT_BOOL,
3561          },{
3562              .name = "lock-key-sync",
3563              .type = QEMU_OPT_BOOL,
3564          },{
3565              .name = "key-delay-ms",
3566              .type = QEMU_OPT_NUMBER,
3567          },{
3568              .name = "sasl",
3569              .type = QEMU_OPT_BOOL,
3570          },{
3571              .name = "tls-authz",
3572              .type = QEMU_OPT_STRING,
3573          },{
3574              .name = "sasl-authz",
3575              .type = QEMU_OPT_STRING,
3576          },{
3577              .name = "lossy",
3578              .type = QEMU_OPT_BOOL,
3579          },{
3580              .name = "non-adaptive",
3581              .type = QEMU_OPT_BOOL,
3582          },{
3583              .name = "audiodev",
3584              .type = QEMU_OPT_STRING,
3585          },{
3586              .name = "power-control",
3587              .type = QEMU_OPT_BOOL,
3588          },
3589          { /* end of list */ }
3590      },
3591  };
3592  
3593  
3594  static int
3595  vnc_display_setup_auth(int *auth,
3596                         int *subauth,
3597                         QCryptoTLSCreds *tlscreds,
3598                         bool password,
3599                         bool sasl,
3600                         bool websocket,
3601                         Error **errp)
3602  {
3603      /*
3604       * We have a choice of 3 authentication options
3605       *
3606       *   1. none
3607       *   2. vnc
3608       *   3. sasl
3609       *
3610       * The channel can be run in 2 modes
3611       *
3612       *   1. clear
3613       *   2. tls
3614       *
3615       * And TLS can use 2 types of credentials
3616       *
3617       *   1. anon
3618       *   2. x509
3619       *
3620       * We thus have 9 possible logical combinations
3621       *
3622       *   1. clear + none
3623       *   2. clear + vnc
3624       *   3. clear + sasl
3625       *   4. tls + anon + none
3626       *   5. tls + anon + vnc
3627       *   6. tls + anon + sasl
3628       *   7. tls + x509 + none
3629       *   8. tls + x509 + vnc
3630       *   9. tls + x509 + sasl
3631       *
3632       * These need to be mapped into the VNC auth schemes
3633       * in an appropriate manner. In regular VNC, all the
3634       * TLS options get mapped into VNC_AUTH_VENCRYPT
3635       * sub-auth types.
3636       *
3637       * In websockets, the https:// protocol already provides
3638       * TLS support, so there is no need to make use of the
3639       * VeNCrypt extension. Furthermore, websockets browser
3640       * clients could not use VeNCrypt even if they wanted to,
3641       * as they cannot control when the TLS handshake takes
3642       * place. Thus there is no option but to rely on https://,
3643       * meaning combinations 4->6 and 7->9 will be mapped to
3644       * VNC auth schemes in the same way as combos 1->3.
3645       *
3646       * Regardless of fact that we have a different mapping to
3647       * VNC auth mechs for plain VNC vs websockets VNC, the end
3648       * result has the same security characteristics.
3649       */
3650      if (websocket || !tlscreds) {
3651          if (password) {
3652              VNC_DEBUG("Initializing VNC server with password auth\n");
3653              *auth = VNC_AUTH_VNC;
3654          } else if (sasl) {
3655              VNC_DEBUG("Initializing VNC server with SASL auth\n");
3656              *auth = VNC_AUTH_SASL;
3657          } else {
3658              VNC_DEBUG("Initializing VNC server with no auth\n");
3659              *auth = VNC_AUTH_NONE;
3660          }
3661          *subauth = VNC_AUTH_INVALID;
3662      } else {
3663          bool is_x509 = object_dynamic_cast(OBJECT(tlscreds),
3664                                             TYPE_QCRYPTO_TLS_CREDS_X509) != NULL;
3665          bool is_anon = object_dynamic_cast(OBJECT(tlscreds),
3666                                             TYPE_QCRYPTO_TLS_CREDS_ANON) != NULL;
3667  
3668          if (!is_x509 && !is_anon) {
3669              error_setg(errp,
3670                         "Unsupported TLS cred type %s",
3671                         object_get_typename(OBJECT(tlscreds)));
3672              return -1;
3673          }
3674          *auth = VNC_AUTH_VENCRYPT;
3675          if (password) {
3676              if (is_x509) {
3677                  VNC_DEBUG("Initializing VNC server with x509 password auth\n");
3678                  *subauth = VNC_AUTH_VENCRYPT_X509VNC;
3679              } else {
3680                  VNC_DEBUG("Initializing VNC server with TLS password auth\n");
3681                  *subauth = VNC_AUTH_VENCRYPT_TLSVNC;
3682              }
3683  
3684          } else if (sasl) {
3685              if (is_x509) {
3686                  VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
3687                  *subauth = VNC_AUTH_VENCRYPT_X509SASL;
3688              } else {
3689                  VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
3690                  *subauth = VNC_AUTH_VENCRYPT_TLSSASL;
3691              }
3692          } else {
3693              if (is_x509) {
3694                  VNC_DEBUG("Initializing VNC server with x509 no auth\n");
3695                  *subauth = VNC_AUTH_VENCRYPT_X509NONE;
3696              } else {
3697                  VNC_DEBUG("Initializing VNC server with TLS no auth\n");
3698                  *subauth = VNC_AUTH_VENCRYPT_TLSNONE;
3699              }
3700          }
3701      }
3702      return 0;
3703  }
3704  
3705  
3706  static int vnc_display_get_address(const char *addrstr,
3707                                     bool websocket,
3708                                     bool reverse,
3709                                     int displaynum,
3710                                     int to,
3711                                     bool has_ipv4,
3712                                     bool has_ipv6,
3713                                     bool ipv4,
3714                                     bool ipv6,
3715                                     SocketAddress **retaddr,
3716                                     Error **errp)
3717  {
3718      int ret = -1;
3719      SocketAddress *addr = NULL;
3720  
3721      addr = g_new0(SocketAddress, 1);
3722  
3723      if (strncmp(addrstr, "unix:", 5) == 0) {
3724          addr->type = SOCKET_ADDRESS_TYPE_UNIX;
3725          addr->u.q_unix.path = g_strdup(addrstr + 5);
3726  
3727          if (websocket) {
3728              error_setg(errp, "UNIX sockets not supported with websock");
3729              goto cleanup;
3730          }
3731  
3732          if (to) {
3733              error_setg(errp, "Port range not support with UNIX socket");
3734              goto cleanup;
3735          }
3736          ret = 0;
3737      } else {
3738          const char *port;
3739          size_t hostlen;
3740          uint64_t baseport = 0;
3741          InetSocketAddress *inet;
3742  
3743          port = strrchr(addrstr, ':');
3744          if (!port) {
3745              if (websocket) {
3746                  hostlen = 0;
3747                  port = addrstr;
3748              } else {
3749                  error_setg(errp, "no vnc port specified");
3750                  goto cleanup;
3751              }
3752          } else {
3753              hostlen = port - addrstr;
3754              port++;
3755              if (*port == '\0') {
3756                  error_setg(errp, "vnc port cannot be empty");
3757                  goto cleanup;
3758              }
3759          }
3760  
3761          addr->type = SOCKET_ADDRESS_TYPE_INET;
3762          inet = &addr->u.inet;
3763          if (hostlen && addrstr[0] == '[' && addrstr[hostlen - 1] == ']') {
3764              inet->host = g_strndup(addrstr + 1, hostlen - 2);
3765          } else {
3766              inet->host = g_strndup(addrstr, hostlen);
3767          }
3768          /* plain VNC port is just an offset, for websocket
3769           * port is absolute */
3770          if (websocket) {
3771              if (g_str_equal(addrstr, "") ||
3772                  g_str_equal(addrstr, "on")) {
3773                  if (displaynum == -1) {
3774                      error_setg(errp, "explicit websocket port is required");
3775                      goto cleanup;
3776                  }
3777                  inet->port = g_strdup_printf(
3778                      "%d", displaynum + 5700);
3779                  if (to) {
3780                      inet->has_to = true;
3781                      inet->to = to + 5700;
3782                  }
3783              } else {
3784                  inet->port = g_strdup(port);
3785              }
3786          } else {
3787              int offset = reverse ? 0 : 5900;
3788              if (parse_uint_full(port, 10, &baseport) < 0) {
3789                  error_setg(errp, "can't convert to a number: %s", port);
3790                  goto cleanup;
3791              }
3792              if (baseport > 65535 ||
3793                  baseport + offset > 65535) {
3794                  error_setg(errp, "port %s out of range", port);
3795                  goto cleanup;
3796              }
3797              inet->port = g_strdup_printf(
3798                  "%d", (int)baseport + offset);
3799  
3800              if (to) {
3801                  inet->has_to = true;
3802                  inet->to = to + offset;
3803              }
3804          }
3805  
3806          inet->ipv4 = ipv4;
3807          inet->has_ipv4 = has_ipv4;
3808          inet->ipv6 = ipv6;
3809          inet->has_ipv6 = has_ipv6;
3810  
3811          ret = baseport;
3812      }
3813  
3814      *retaddr = addr;
3815  
3816   cleanup:
3817      if (ret < 0) {
3818          qapi_free_SocketAddress(addr);
3819      }
3820      return ret;
3821  }
3822  
3823  static int vnc_display_get_addresses(QemuOpts *opts,
3824                                       bool reverse,
3825                                       SocketAddressList **saddr_list_ret,
3826                                       SocketAddressList **wsaddr_list_ret,
3827                                       Error **errp)
3828  {
3829      SocketAddress *saddr = NULL;
3830      SocketAddress *wsaddr = NULL;
3831      g_autoptr(SocketAddressList) saddr_list = NULL;
3832      SocketAddressList **saddr_tail = &saddr_list;
3833      SocketAddress *single_saddr = NULL;
3834      g_autoptr(SocketAddressList) wsaddr_list = NULL;
3835      SocketAddressList **wsaddr_tail = &wsaddr_list;
3836      QemuOptsIter addriter;
3837      const char *addr;
3838      int to = qemu_opt_get_number(opts, "to", 0);
3839      bool has_ipv4 = qemu_opt_get(opts, "ipv4");
3840      bool has_ipv6 = qemu_opt_get(opts, "ipv6");
3841      bool ipv4 = qemu_opt_get_bool(opts, "ipv4", false);
3842      bool ipv6 = qemu_opt_get_bool(opts, "ipv6", false);
3843      int displaynum = -1;
3844  
3845      addr = qemu_opt_get(opts, "vnc");
3846      if (addr == NULL || g_str_equal(addr, "none")) {
3847          return 0;
3848      }
3849      if (qemu_opt_get(opts, "websocket") &&
3850          !qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA1)) {
3851          error_setg(errp,
3852                     "SHA1 hash support is required for websockets");
3853          return -1;
3854      }
3855  
3856      qemu_opt_iter_init(&addriter, opts, "vnc");
3857      while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3858          int rv;
3859          rv = vnc_display_get_address(addr, false, reverse, 0, to,
3860                                       has_ipv4, has_ipv6,
3861                                       ipv4, ipv6,
3862                                       &saddr, errp);
3863          if (rv < 0) {
3864              return -1;
3865          }
3866          /* Historical compat - first listen address can be used
3867           * to set the default websocket port
3868           */
3869          if (displaynum == -1) {
3870              displaynum = rv;
3871          }
3872          QAPI_LIST_APPEND(saddr_tail, saddr);
3873      }
3874  
3875      if (saddr_list && !saddr_list->next) {
3876          single_saddr = saddr_list->value;
3877      } else {
3878          /*
3879           * If we had multiple primary displays, we don't do defaults
3880           * for websocket, and require explicit config instead.
3881           */
3882          displaynum = -1;
3883      }
3884  
3885      qemu_opt_iter_init(&addriter, opts, "websocket");
3886      while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3887          if (vnc_display_get_address(addr, true, reverse, displaynum, to,
3888                                      has_ipv4, has_ipv6,
3889                                      ipv4, ipv6,
3890                                      &wsaddr, errp) < 0) {
3891              return -1;
3892          }
3893  
3894          /* Historical compat - if only a single listen address was
3895           * provided, then this is used to set the default listen
3896           * address for websocket too
3897           */
3898          if (single_saddr &&
3899              single_saddr->type == SOCKET_ADDRESS_TYPE_INET &&
3900              wsaddr->type == SOCKET_ADDRESS_TYPE_INET &&
3901              g_str_equal(wsaddr->u.inet.host, "") &&
3902              !g_str_equal(single_saddr->u.inet.host, "")) {
3903              g_free(wsaddr->u.inet.host);
3904              wsaddr->u.inet.host = g_strdup(single_saddr->u.inet.host);
3905          }
3906  
3907          QAPI_LIST_APPEND(wsaddr_tail, wsaddr);
3908      }
3909  
3910      *saddr_list_ret = g_steal_pointer(&saddr_list);
3911      *wsaddr_list_ret = g_steal_pointer(&wsaddr_list);
3912      return 0;
3913  }
3914  
3915  static int vnc_display_connect(VncDisplay *vd,
3916                                 SocketAddressList *saddr_list,
3917                                 SocketAddressList *wsaddr_list,
3918                                 Error **errp)
3919  {
3920      /* connect to viewer */
3921      QIOChannelSocket *sioc = NULL;
3922      if (wsaddr_list) {
3923          error_setg(errp, "Cannot use websockets in reverse mode");
3924          return -1;
3925      }
3926      if (!saddr_list || saddr_list->next) {
3927          error_setg(errp, "Expected a single address in reverse mode");
3928          return -1;
3929      }
3930      /* TODO SOCKET_ADDRESS_TYPE_FD when fd has AF_UNIX */
3931      vd->is_unix = saddr_list->value->type == SOCKET_ADDRESS_TYPE_UNIX;
3932      sioc = qio_channel_socket_new();
3933      qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
3934      if (qio_channel_socket_connect_sync(sioc, saddr_list->value, errp) < 0) {
3935          object_unref(OBJECT(sioc));
3936          return -1;
3937      }
3938      vnc_connect(vd, sioc, false, false);
3939      object_unref(OBJECT(sioc));
3940      return 0;
3941  }
3942  
3943  
3944  static int vnc_display_listen(VncDisplay *vd,
3945                                SocketAddressList *saddr_list,
3946                                SocketAddressList *wsaddr_list,
3947                                Error **errp)
3948  {
3949      SocketAddressList *el;
3950  
3951      if (saddr_list) {
3952          vd->listener = qio_net_listener_new();
3953          qio_net_listener_set_name(vd->listener, "vnc-listen");
3954          for (el = saddr_list; el; el = el->next) {
3955              if (qio_net_listener_open_sync(vd->listener,
3956                                             el->value, 1,
3957                                             errp) < 0)  {
3958                  return -1;
3959              }
3960          }
3961  
3962          qio_net_listener_set_client_func(vd->listener,
3963                                           vnc_listen_io, vd, NULL);
3964      }
3965  
3966      if (wsaddr_list) {
3967          vd->wslistener = qio_net_listener_new();
3968          qio_net_listener_set_name(vd->wslistener, "vnc-ws-listen");
3969          for (el = wsaddr_list; el; el = el->next) {
3970              if (qio_net_listener_open_sync(vd->wslistener,
3971                                             el->value, 1,
3972                                             errp) < 0)  {
3973                  return -1;
3974              }
3975          }
3976  
3977          qio_net_listener_set_client_func(vd->wslistener,
3978                                           vnc_listen_io, vd, NULL);
3979      }
3980  
3981      return 0;
3982  }
3983  
3984  bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
3985  {
3986      VncDisplay *vd = vnc_display_find(NULL);
3987  
3988      if (!vd) {
3989          error_setg(errp, "Can not find vnc display");
3990          return false;
3991      }
3992  
3993      if (arg->has_addresses) {
3994          if (vd->listener) {
3995              qio_net_listener_disconnect(vd->listener);
3996              object_unref(OBJECT(vd->listener));
3997              vd->listener = NULL;
3998          }
3999  
4000          if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) {
4001              return false;
4002          }
4003      }
4004  
4005      return true;
4006  }
4007  
4008  void vnc_display_open(const char *id, Error **errp)
4009  {
4010      VncDisplay *vd = vnc_display_find(id);
4011      QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
4012      g_autoptr(SocketAddressList) saddr_list = NULL;
4013      g_autoptr(SocketAddressList) wsaddr_list = NULL;
4014      const char *share, *device_id;
4015      QemuConsole *con;
4016      bool password = false;
4017      bool reverse = false;
4018      const char *credid;
4019      bool sasl = false;
4020      const char *tlsauthz;
4021      const char *saslauthz;
4022      int lock_key_sync = 1;
4023      int key_delay_ms;
4024      const char *audiodev;
4025      const char *passwordSecret;
4026  
4027      if (!vd) {
4028          error_setg(errp, "VNC display not active");
4029          return;
4030      }
4031      vnc_display_close(vd);
4032  
4033      if (!opts) {
4034          return;
4035      }
4036  
4037      reverse = qemu_opt_get_bool(opts, "reverse", false);
4038      if (vnc_display_get_addresses(opts, reverse, &saddr_list, &wsaddr_list,
4039                                    errp) < 0) {
4040          goto fail;
4041      }
4042  
4043  
4044      passwordSecret = qemu_opt_get(opts, "password-secret");
4045      if (passwordSecret) {
4046          if (qemu_opt_get(opts, "password")) {
4047              error_setg(errp,
4048                         "'password' flag is redundant with 'password-secret'");
4049              goto fail;
4050          }
4051          vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret,
4052                                                       errp);
4053          if (!vd->password) {
4054              goto fail;
4055          }
4056          password = true;
4057      } else {
4058          password = qemu_opt_get_bool(opts, "password", false);
4059      }
4060      if (password) {
4061          if (!qcrypto_cipher_supports(
4062                  QCRYPTO_CIPHER_ALG_DES, QCRYPTO_CIPHER_MODE_ECB)) {
4063              error_setg(errp,
4064                         "Cipher backend does not support DES algorithm");
4065              goto fail;
4066          }
4067      }
4068  
4069      lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
4070      key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 10);
4071      sasl = qemu_opt_get_bool(opts, "sasl", false);
4072  #ifndef CONFIG_VNC_SASL
4073      if (sasl) {
4074          error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
4075          goto fail;
4076      }
4077  #endif /* CONFIG_VNC_SASL */
4078      credid = qemu_opt_get(opts, "tls-creds");
4079      if (credid) {
4080          Object *creds;
4081          creds = object_resolve_path_component(
4082              object_get_objects_root(), credid);
4083          if (!creds) {
4084              error_setg(errp, "No TLS credentials with id '%s'",
4085                         credid);
4086              goto fail;
4087          }
4088          vd->tlscreds = (QCryptoTLSCreds *)
4089              object_dynamic_cast(creds,
4090                                  TYPE_QCRYPTO_TLS_CREDS);
4091          if (!vd->tlscreds) {
4092              error_setg(errp, "Object with id '%s' is not TLS credentials",
4093                         credid);
4094              goto fail;
4095          }
4096          object_ref(OBJECT(vd->tlscreds));
4097  
4098          if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds,
4099                                                QCRYPTO_TLS_CREDS_ENDPOINT_SERVER,
4100                                                errp)) {
4101              goto fail;
4102          }
4103      }
4104      tlsauthz = qemu_opt_get(opts, "tls-authz");
4105      if (tlsauthz && !vd->tlscreds) {
4106          error_setg(errp, "'tls-authz' provided but TLS is not enabled");
4107          goto fail;
4108      }
4109  
4110      saslauthz = qemu_opt_get(opts, "sasl-authz");
4111      if (saslauthz && !sasl) {
4112          error_setg(errp, "'sasl-authz' provided but SASL auth is not enabled");
4113          goto fail;
4114      }
4115  
4116      share = qemu_opt_get(opts, "share");
4117      if (share) {
4118          if (strcmp(share, "ignore") == 0) {
4119              vd->share_policy = VNC_SHARE_POLICY_IGNORE;
4120          } else if (strcmp(share, "allow-exclusive") == 0) {
4121              vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
4122          } else if (strcmp(share, "force-shared") == 0) {
4123              vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
4124          } else {
4125              error_setg(errp, "unknown vnc share= option");
4126              goto fail;
4127          }
4128      } else {
4129          vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
4130      }
4131      vd->connections_limit = qemu_opt_get_number(opts, "connections", 32);
4132  
4133  #ifdef CONFIG_VNC_JPEG
4134      vd->lossy = qemu_opt_get_bool(opts, "lossy", false);
4135  #endif
4136      vd->non_adaptive = qemu_opt_get_bool(opts, "non-adaptive", false);
4137      /* adaptive updates are only used with tight encoding and
4138       * if lossy updates are enabled so we can disable all the
4139       * calculations otherwise */
4140      if (!vd->lossy) {
4141          vd->non_adaptive = true;
4142      }
4143  
4144      vd->power_control = qemu_opt_get_bool(opts, "power-control", false);
4145  
4146      if (tlsauthz) {
4147          vd->tlsauthzid = g_strdup(tlsauthz);
4148      }
4149  #ifdef CONFIG_VNC_SASL
4150      if (sasl) {
4151          if (saslauthz) {
4152              vd->sasl.authzid = g_strdup(saslauthz);
4153          }
4154      }
4155  #endif
4156  
4157      if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
4158                                 vd->tlscreds, password,
4159                                 sasl, false, errp) < 0) {
4160          goto fail;
4161      }
4162      trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
4163  
4164      if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
4165                                 vd->tlscreds, password,
4166                                 sasl, true, errp) < 0) {
4167          goto fail;
4168      }
4169      trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
4170  
4171  #ifdef CONFIG_VNC_SASL
4172      if (sasl && !vnc_sasl_server_init(errp)) {
4173          goto fail;
4174      }
4175  #endif
4176      vd->lock_key_sync = lock_key_sync;
4177      if (lock_key_sync) {
4178          vd->led = qemu_add_led_event_handler(kbd_leds, vd);
4179      }
4180      vd->ledstate = 0;
4181  
4182      audiodev = qemu_opt_get(opts, "audiodev");
4183      if (audiodev) {
4184          vd->audio_state = audio_state_by_name(audiodev, errp);
4185          if (!vd->audio_state) {
4186              goto fail;
4187          }
4188      }
4189  
4190      device_id = qemu_opt_get(opts, "display");
4191      if (device_id) {
4192          int head = qemu_opt_get_number(opts, "head", 0);
4193          Error *err = NULL;
4194  
4195          con = qemu_console_lookup_by_device_name(device_id, head, &err);
4196          if (err) {
4197              error_propagate(errp, err);
4198              goto fail;
4199          }
4200      } else {
4201          con = NULL;
4202      }
4203  
4204      if (con != vd->dcl.con) {
4205          qkbd_state_free(vd->kbd);
4206          unregister_displaychangelistener(&vd->dcl);
4207          vd->dcl.con = con;
4208          register_displaychangelistener(&vd->dcl);
4209          vd->kbd = qkbd_state_init(vd->dcl.con);
4210      }
4211      qkbd_state_set_delay(vd->kbd, key_delay_ms);
4212  
4213      if (saddr_list == NULL) {
4214          return;
4215      }
4216  
4217      if (reverse) {
4218          if (vnc_display_connect(vd, saddr_list, wsaddr_list, errp) < 0) {
4219              goto fail;
4220          }
4221      } else {
4222          if (vnc_display_listen(vd, saddr_list, wsaddr_list, errp) < 0) {
4223              goto fail;
4224          }
4225      }
4226  
4227      if (qemu_opt_get(opts, "to")) {
4228          vnc_display_print_local_addr(vd);
4229      }
4230  
4231      /* Success */
4232      return;
4233  
4234  fail:
4235      vnc_display_close(vd);
4236  }
4237  
4238  void vnc_display_add_client(const char *id, int csock, bool skipauth)
4239  {
4240      VncDisplay *vd = vnc_display_find(id);
4241      QIOChannelSocket *sioc;
4242  
4243      if (!vd) {
4244          return;
4245      }
4246  
4247      sioc = qio_channel_socket_new_fd(csock, NULL);
4248      if (sioc) {
4249          qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server");
4250          vnc_connect(vd, sioc, skipauth, false);
4251          object_unref(OBJECT(sioc));
4252      }
4253  }
4254  
4255  static void vnc_auto_assign_id(QemuOptsList *olist, QemuOpts *opts)
4256  {
4257      int i = 2;
4258      char *id;
4259  
4260      id = g_strdup("default");
4261      while (qemu_opts_find(olist, id)) {
4262          g_free(id);
4263          id = g_strdup_printf("vnc%d", i++);
4264      }
4265      qemu_opts_set_id(opts, id);
4266  }
4267  
4268  void vnc_parse(const char *str)
4269  {
4270      QemuOptsList *olist = qemu_find_opts("vnc");
4271      QemuOpts *opts = qemu_opts_parse_noisily(olist, str, !is_help_option(str));
4272      const char *id;
4273  
4274      if (!opts) {
4275          exit(1);
4276      }
4277  
4278      id = qemu_opts_id(opts);
4279      if (!id) {
4280          /* auto-assign id if not present */
4281          vnc_auto_assign_id(olist, opts);
4282      }
4283  }
4284  
4285  int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
4286  {
4287      Error *local_err = NULL;
4288      char *id = (char *)qemu_opts_id(opts);
4289  
4290      assert(id);
4291      vnc_display_init(id, &local_err);
4292      if (local_err) {
4293          error_propagate(errp, local_err);
4294          return -1;
4295      }
4296      vnc_display_open(id, &local_err);
4297      if (local_err != NULL) {
4298          error_propagate(errp, local_err);
4299          return -1;
4300      }
4301      return 0;
4302  }
4303  
4304  static void vnc_register_config(void)
4305  {
4306      qemu_add_opts(&qemu_vnc_opts);
4307  }
4308  opts_init(vnc_register_config);
4309