]> Git Repo - qemu.git/blob - ui/vnc.c
qdev: Track runtime machine modifications
[qemu.git] / ui / vnc.c
1 /*
2  * QEMU VNC display driver
3  *
4  * Copyright (C) 2006 Anthony Liguori <[email protected]>
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 "vnc.h"
28 #include "vnc-jobs.h"
29 #include "sysemu.h"
30 #include "qemu_socket.h"
31 #include "qemu-timer.h"
32 #include "acl.h"
33 #include "qemu-objects.h"
34
35 #define VNC_REFRESH_INTERVAL_BASE 30
36 #define VNC_REFRESH_INTERVAL_INC  50
37 #define VNC_REFRESH_INTERVAL_MAX  2000
38
39 #include "vnc_keysym.h"
40 #include "d3des.h"
41
42 #define count_bits(c, v) { \
43     for (c = 0; v; v >>= 1) \
44     { \
45         c += v & 1; \
46     } \
47 }
48
49 static VncDisplay *vnc_display; /* needed for info vnc */
50 static DisplayChangeListener *dcl;
51
52 static int vnc_cursor_define(VncState *vs);
53
54 static char *addr_to_string(const char *format,
55                             struct sockaddr_storage *sa,
56                             socklen_t salen) {
57     char *addr;
58     char host[NI_MAXHOST];
59     char serv[NI_MAXSERV];
60     int err;
61     size_t addrlen;
62
63     if ((err = getnameinfo((struct sockaddr *)sa, salen,
64                            host, sizeof(host),
65                            serv, sizeof(serv),
66                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
67         VNC_DEBUG("Cannot resolve address %d: %s\n",
68                   err, gai_strerror(err));
69         return NULL;
70     }
71
72     /* Enough for the existing format + the 2 vars we're
73      * substituting in. */
74     addrlen = strlen(format) + strlen(host) + strlen(serv);
75     addr = qemu_malloc(addrlen + 1);
76     snprintf(addr, addrlen, format, host, serv);
77     addr[addrlen] = '\0';
78
79     return addr;
80 }
81
82
83 char *vnc_socket_local_addr(const char *format, int fd) {
84     struct sockaddr_storage sa;
85     socklen_t salen;
86
87     salen = sizeof(sa);
88     if (getsockname(fd, (struct sockaddr*)&sa, &salen) < 0)
89         return NULL;
90
91     return addr_to_string(format, &sa, salen);
92 }
93
94 char *vnc_socket_remote_addr(const char *format, int fd) {
95     struct sockaddr_storage sa;
96     socklen_t salen;
97
98     salen = sizeof(sa);
99     if (getpeername(fd, (struct sockaddr*)&sa, &salen) < 0)
100         return NULL;
101
102     return addr_to_string(format, &sa, salen);
103 }
104
105 static int put_addr_qdict(QDict *qdict, struct sockaddr_storage *sa,
106                           socklen_t salen)
107 {
108     char host[NI_MAXHOST];
109     char serv[NI_MAXSERV];
110     int err;
111
112     if ((err = getnameinfo((struct sockaddr *)sa, salen,
113                            host, sizeof(host),
114                            serv, sizeof(serv),
115                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
116         VNC_DEBUG("Cannot resolve address %d: %s\n",
117                   err, gai_strerror(err));
118         return -1;
119     }
120
121     qdict_put(qdict, "host", qstring_from_str(host));
122     qdict_put(qdict, "service", qstring_from_str(serv));
123     qdict_put(qdict, "family",qstring_from_str(inet_strfamily(sa->ss_family)));
124
125     return 0;
126 }
127
128 static int vnc_server_addr_put(QDict *qdict, int fd)
129 {
130     struct sockaddr_storage sa;
131     socklen_t salen;
132
133     salen = sizeof(sa);
134     if (getsockname(fd, (struct sockaddr*)&sa, &salen) < 0) {
135         return -1;
136     }
137
138     return put_addr_qdict(qdict, &sa, salen);
139 }
140
141 static int vnc_qdict_remote_addr(QDict *qdict, int fd)
142 {
143     struct sockaddr_storage sa;
144     socklen_t salen;
145
146     salen = sizeof(sa);
147     if (getpeername(fd, (struct sockaddr*)&sa, &salen) < 0) {
148         return -1;
149     }
150
151     return put_addr_qdict(qdict, &sa, salen);
152 }
153
154 static const char *vnc_auth_name(VncDisplay *vd) {
155     switch (vd->auth) {
156     case VNC_AUTH_INVALID:
157         return "invalid";
158     case VNC_AUTH_NONE:
159         return "none";
160     case VNC_AUTH_VNC:
161         return "vnc";
162     case VNC_AUTH_RA2:
163         return "ra2";
164     case VNC_AUTH_RA2NE:
165         return "ra2ne";
166     case VNC_AUTH_TIGHT:
167         return "tight";
168     case VNC_AUTH_ULTRA:
169         return "ultra";
170     case VNC_AUTH_TLS:
171         return "tls";
172     case VNC_AUTH_VENCRYPT:
173 #ifdef CONFIG_VNC_TLS
174         switch (vd->subauth) {
175         case VNC_AUTH_VENCRYPT_PLAIN:
176             return "vencrypt+plain";
177         case VNC_AUTH_VENCRYPT_TLSNONE:
178             return "vencrypt+tls+none";
179         case VNC_AUTH_VENCRYPT_TLSVNC:
180             return "vencrypt+tls+vnc";
181         case VNC_AUTH_VENCRYPT_TLSPLAIN:
182             return "vencrypt+tls+plain";
183         case VNC_AUTH_VENCRYPT_X509NONE:
184             return "vencrypt+x509+none";
185         case VNC_AUTH_VENCRYPT_X509VNC:
186             return "vencrypt+x509+vnc";
187         case VNC_AUTH_VENCRYPT_X509PLAIN:
188             return "vencrypt+x509+plain";
189         case VNC_AUTH_VENCRYPT_TLSSASL:
190             return "vencrypt+tls+sasl";
191         case VNC_AUTH_VENCRYPT_X509SASL:
192             return "vencrypt+x509+sasl";
193         default:
194             return "vencrypt";
195         }
196 #else
197         return "vencrypt";
198 #endif
199     case VNC_AUTH_SASL:
200         return "sasl";
201     }
202     return "unknown";
203 }
204
205 static int vnc_server_info_put(QDict *qdict)
206 {
207     if (vnc_server_addr_put(qdict, vnc_display->lsock) < 0) {
208         return -1;
209     }
210
211     qdict_put(qdict, "auth", qstring_from_str(vnc_auth_name(vnc_display)));
212     return 0;
213 }
214
215 static void vnc_client_cache_auth(VncState *client)
216 {
217 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
218     QDict *qdict;
219 #endif
220
221     if (!client->info) {
222         return;
223     }
224
225 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
226     qdict = qobject_to_qdict(client->info);
227 #endif
228
229 #ifdef CONFIG_VNC_TLS
230     if (client->tls.session &&
231         client->tls.dname) {
232         qdict_put(qdict, "x509_dname", qstring_from_str(client->tls.dname));
233     }
234 #endif
235 #ifdef CONFIG_VNC_SASL
236     if (client->sasl.conn &&
237         client->sasl.username) {
238         qdict_put(qdict, "sasl_username",
239                   qstring_from_str(client->sasl.username));
240     }
241 #endif
242 }
243
244 static void vnc_client_cache_addr(VncState *client)
245 {
246     QDict *qdict;
247
248     qdict = qdict_new();
249     if (vnc_qdict_remote_addr(qdict, client->csock) < 0) {
250         QDECREF(qdict);
251         /* XXX: how to report the error? */
252         return;
253     }
254
255     client->info = QOBJECT(qdict);
256 }
257
258 static void vnc_qmp_event(VncState *vs, MonitorEvent event)
259 {
260     QDict *server;
261     QObject *data;
262
263     if (!vs->info) {
264         return;
265     }
266
267     server = qdict_new();
268     if (vnc_server_info_put(server) < 0) {
269         QDECREF(server);
270         return;
271     }
272
273     data = qobject_from_jsonf("{ 'client': %p, 'server': %p }",
274                               vs->info, QOBJECT(server));
275
276     monitor_protocol_event(event, data);
277
278     qobject_incref(vs->info);
279     qobject_decref(data);
280 }
281
282 static void info_vnc_iter(QObject *obj, void *opaque)
283 {
284     QDict *client;
285     Monitor *mon = opaque;
286
287     client = qobject_to_qdict(obj);
288     monitor_printf(mon, "Client:\n");
289     monitor_printf(mon, "     address: %s:%s\n",
290                    qdict_get_str(client, "host"),
291                    qdict_get_str(client, "service"));
292
293 #ifdef CONFIG_VNC_TLS
294     monitor_printf(mon, "  x509_dname: %s\n",
295         qdict_haskey(client, "x509_dname") ?
296         qdict_get_str(client, "x509_dname") : "none");
297 #endif
298 #ifdef CONFIG_VNC_SASL
299     monitor_printf(mon, "    username: %s\n",
300         qdict_haskey(client, "sasl_username") ?
301         qdict_get_str(client, "sasl_username") : "none");
302 #endif
303 }
304
305 void do_info_vnc_print(Monitor *mon, const QObject *data)
306 {
307     QDict *server;
308     QList *clients;
309
310     server = qobject_to_qdict(data);
311     if (qdict_get_bool(server, "enabled") == 0) {
312         monitor_printf(mon, "Server: disabled\n");
313         return;
314     }
315
316     monitor_printf(mon, "Server:\n");
317     monitor_printf(mon, "     address: %s:%s\n",
318                    qdict_get_str(server, "host"),
319                    qdict_get_str(server, "service"));
320     monitor_printf(mon, "        auth: %s\n", qdict_get_str(server, "auth"));
321
322     clients = qdict_get_qlist(server, "clients");
323     if (qlist_empty(clients)) {
324         monitor_printf(mon, "Client: none\n");
325     } else {
326         qlist_iter(clients, info_vnc_iter, mon);
327     }
328 }
329
330 void do_info_vnc(Monitor *mon, QObject **ret_data)
331 {
332     if (vnc_display == NULL || vnc_display->display == NULL) {
333         *ret_data = qobject_from_jsonf("{ 'enabled': false }");
334     } else {
335         QList *clist;
336         VncState *client;
337
338         clist = qlist_new();
339         QTAILQ_FOREACH(client, &vnc_display->clients, next) {
340             if (client->info) {
341                 /* incref so that it's not freed by upper layers */
342                 qobject_incref(client->info);
343                 qlist_append_obj(clist, client->info);
344             }
345         }
346
347         *ret_data = qobject_from_jsonf("{ 'enabled': true, 'clients': %p }",
348                                        QOBJECT(clist));
349         assert(*ret_data != NULL);
350
351         if (vnc_server_info_put(qobject_to_qdict(*ret_data)) < 0) {
352             qobject_decref(*ret_data);
353             *ret_data = NULL;
354         }
355     }
356 }
357
358 /* TODO
359    1) Get the queue working for IO.
360    2) there is some weirdness when using the -S option (the screen is grey
361       and not totally invalidated
362    3) resolutions > 1024
363 */
364
365 static int vnc_update_client(VncState *vs, int has_dirty);
366 static int vnc_update_client_sync(VncState *vs, int has_dirty);
367 static void vnc_disconnect_start(VncState *vs);
368 static void vnc_disconnect_finish(VncState *vs);
369 static void vnc_init_timer(VncDisplay *vd);
370 static void vnc_remove_timer(VncDisplay *vd);
371
372 static void vnc_colordepth(VncState *vs);
373 static void framebuffer_update_request(VncState *vs, int incremental,
374                                        int x_position, int y_position,
375                                        int w, int h);
376 static void vnc_refresh(void *opaque);
377 static int vnc_refresh_server_surface(VncDisplay *vd);
378
379 static inline void vnc_set_bit(uint32_t *d, int k)
380 {
381     d[k >> 5] |= 1 << (k & 0x1f);
382 }
383
384 static inline void vnc_clear_bit(uint32_t *d, int k)
385 {
386     d[k >> 5] &= ~(1 << (k & 0x1f));
387 }
388
389 static inline void vnc_set_bits(uint32_t *d, int n, int nb_words)
390 {
391     int j;
392
393     j = 0;
394     while (n >= 32) {
395         d[j++] = -1;
396         n -= 32;
397     }
398     if (n > 0)
399         d[j++] = (1 << n) - 1;
400     while (j < nb_words)
401         d[j++] = 0;
402 }
403
404 static inline int vnc_get_bit(const uint32_t *d, int k)
405 {
406     return (d[k >> 5] >> (k & 0x1f)) & 1;
407 }
408
409 static inline int vnc_and_bits(const uint32_t *d1, const uint32_t *d2,
410                                int nb_words)
411 {
412     int i;
413     for(i = 0; i < nb_words; i++) {
414         if ((d1[i] & d2[i]) != 0)
415             return 1;
416     }
417     return 0;
418 }
419
420 static void vnc_dpy_update(DisplayState *ds, int x, int y, int w, int h)
421 {
422     int i;
423     VncDisplay *vd = ds->opaque;
424     struct VncSurface *s = &vd->guest;
425
426     h += y;
427
428     /* round x down to ensure the loop only spans one 16-pixel block per,
429        iteration.  otherwise, if (x % 16) != 0, the last iteration may span
430        two 16-pixel blocks but we only mark the first as dirty
431     */
432     w += (x % 16);
433     x -= (x % 16);
434
435     x = MIN(x, s->ds->width);
436     y = MIN(y, s->ds->height);
437     w = MIN(x + w, s->ds->width) - x;
438     h = MIN(h, s->ds->height);
439
440     for (; y < h; y++)
441         for (i = 0; i < w; i += 16)
442             vnc_set_bit(s->dirty[y], (x + i) / 16);
443 }
444
445 void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
446                             int32_t encoding)
447 {
448     vnc_write_u16(vs, x);
449     vnc_write_u16(vs, y);
450     vnc_write_u16(vs, w);
451     vnc_write_u16(vs, h);
452
453     vnc_write_s32(vs, encoding);
454 }
455
456 void buffer_reserve(Buffer *buffer, size_t len)
457 {
458     if ((buffer->capacity - buffer->offset) < len) {
459         buffer->capacity += (len + 1024);
460         buffer->buffer = qemu_realloc(buffer->buffer, buffer->capacity);
461         if (buffer->buffer == NULL) {
462             fprintf(stderr, "vnc: out of memory\n");
463             exit(1);
464         }
465     }
466 }
467
468 int buffer_empty(Buffer *buffer)
469 {
470     return buffer->offset == 0;
471 }
472
473 uint8_t *buffer_end(Buffer *buffer)
474 {
475     return buffer->buffer + buffer->offset;
476 }
477
478 void buffer_reset(Buffer *buffer)
479 {
480         buffer->offset = 0;
481 }
482
483 void buffer_free(Buffer *buffer)
484 {
485     qemu_free(buffer->buffer);
486     buffer->offset = 0;
487     buffer->capacity = 0;
488     buffer->buffer = NULL;
489 }
490
491 void buffer_append(Buffer *buffer, const void *data, size_t len)
492 {
493     memcpy(buffer->buffer + buffer->offset, data, len);
494     buffer->offset += len;
495 }
496
497 static void vnc_desktop_resize(VncState *vs)
498 {
499     DisplayState *ds = vs->ds;
500
501     if (vs->csock == -1 || !vnc_has_feature(vs, VNC_FEATURE_RESIZE)) {
502         return;
503     }
504     if (vs->client_width == ds_get_width(ds) &&
505         vs->client_height == ds_get_height(ds)) {
506         return;
507     }
508     vs->client_width = ds_get_width(ds);
509     vs->client_height = ds_get_height(ds);
510     vnc_lock_output(vs);
511     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
512     vnc_write_u8(vs, 0);
513     vnc_write_u16(vs, 1); /* number of rects */
514     vnc_framebuffer_update(vs, 0, 0, vs->client_width, vs->client_height,
515                            VNC_ENCODING_DESKTOPRESIZE);
516     vnc_unlock_output(vs);
517     vnc_flush(vs);
518 }
519
520 #ifdef CONFIG_VNC_THREAD
521 static void vnc_abort_display_jobs(VncDisplay *vd)
522 {
523     VncState *vs;
524
525     QTAILQ_FOREACH(vs, &vd->clients, next) {
526         vnc_lock_output(vs);
527         vs->abort = true;
528         vnc_unlock_output(vs);
529     }
530     QTAILQ_FOREACH(vs, &vd->clients, next) {
531         vnc_jobs_join(vs);
532     }
533     QTAILQ_FOREACH(vs, &vd->clients, next) {
534         vnc_lock_output(vs);
535         vs->abort = false;
536         vnc_unlock_output(vs);
537     }
538 }
539 #else
540 static void vnc_abort_display_jobs(VncDisplay *vd)
541 {
542 }
543 #endif
544
545 static void vnc_dpy_resize(DisplayState *ds)
546 {
547     VncDisplay *vd = ds->opaque;
548     VncState *vs;
549
550     vnc_abort_display_jobs(vd);
551
552     /* server surface */
553     if (!vd->server)
554         vd->server = qemu_mallocz(sizeof(*vd->server));
555     if (vd->server->data)
556         qemu_free(vd->server->data);
557     *(vd->server) = *(ds->surface);
558     vd->server->data = qemu_mallocz(vd->server->linesize *
559                                     vd->server->height);
560
561     /* guest surface */
562     if (!vd->guest.ds)
563         vd->guest.ds = qemu_mallocz(sizeof(*vd->guest.ds));
564     if (ds_get_bytes_per_pixel(ds) != vd->guest.ds->pf.bytes_per_pixel)
565         console_color_init(ds);
566     *(vd->guest.ds) = *(ds->surface);
567     memset(vd->guest.dirty, 0xFF, sizeof(vd->guest.dirty));
568
569     QTAILQ_FOREACH(vs, &vd->clients, next) {
570         vnc_colordepth(vs);
571         vnc_desktop_resize(vs);
572         if (vs->vd->cursor) {
573             vnc_cursor_define(vs);
574         }
575         memset(vs->dirty, 0xFF, sizeof(vs->dirty));
576     }
577 }
578
579 /* fastest code */
580 static void vnc_write_pixels_copy(VncState *vs, struct PixelFormat *pf,
581                                   void *pixels, int size)
582 {
583     vnc_write(vs, pixels, size);
584 }
585
586 /* slowest but generic code. */
587 void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
588 {
589     uint8_t r, g, b;
590     VncDisplay *vd = vs->vd;
591
592     r = ((((v & vd->server->pf.rmask) >> vd->server->pf.rshift) << vs->clientds.pf.rbits) >>
593         vd->server->pf.rbits);
594     g = ((((v & vd->server->pf.gmask) >> vd->server->pf.gshift) << vs->clientds.pf.gbits) >>
595         vd->server->pf.gbits);
596     b = ((((v & vd->server->pf.bmask) >> vd->server->pf.bshift) << vs->clientds.pf.bbits) >>
597         vd->server->pf.bbits);
598     v = (r << vs->clientds.pf.rshift) |
599         (g << vs->clientds.pf.gshift) |
600         (b << vs->clientds.pf.bshift);
601     switch(vs->clientds.pf.bytes_per_pixel) {
602     case 1:
603         buf[0] = v;
604         break;
605     case 2:
606         if (vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) {
607             buf[0] = v >> 8;
608             buf[1] = v;
609         } else {
610             buf[1] = v >> 8;
611             buf[0] = v;
612         }
613         break;
614     default:
615     case 4:
616         if (vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) {
617             buf[0] = v >> 24;
618             buf[1] = v >> 16;
619             buf[2] = v >> 8;
620             buf[3] = v;
621         } else {
622             buf[3] = v >> 24;
623             buf[2] = v >> 16;
624             buf[1] = v >> 8;
625             buf[0] = v;
626         }
627         break;
628     }
629 }
630
631 static void vnc_write_pixels_generic(VncState *vs, struct PixelFormat *pf,
632                                      void *pixels1, int size)
633 {
634     uint8_t buf[4];
635
636     if (pf->bytes_per_pixel == 4) {
637         uint32_t *pixels = pixels1;
638         int n, i;
639         n = size >> 2;
640         for(i = 0; i < n; i++) {
641             vnc_convert_pixel(vs, buf, pixels[i]);
642             vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
643         }
644     } else if (pf->bytes_per_pixel == 2) {
645         uint16_t *pixels = pixels1;
646         int n, i;
647         n = size >> 1;
648         for(i = 0; i < n; i++) {
649             vnc_convert_pixel(vs, buf, pixels[i]);
650             vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
651         }
652     } else if (pf->bytes_per_pixel == 1) {
653         uint8_t *pixels = pixels1;
654         int n, i;
655         n = size;
656         for(i = 0; i < n; i++) {
657             vnc_convert_pixel(vs, buf, pixels[i]);
658             vnc_write(vs, buf, vs->clientds.pf.bytes_per_pixel);
659         }
660     } else {
661         fprintf(stderr, "vnc_write_pixels_generic: VncState color depth not supported\n");
662     }
663 }
664
665 int vnc_raw_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
666 {
667     int i;
668     uint8_t *row;
669     VncDisplay *vd = vs->vd;
670
671     row = vd->server->data + y * ds_get_linesize(vs->ds) + x * ds_get_bytes_per_pixel(vs->ds);
672     for (i = 0; i < h; i++) {
673         vs->write_pixels(vs, &vd->server->pf, row, w * ds_get_bytes_per_pixel(vs->ds));
674         row += ds_get_linesize(vs->ds);
675     }
676     return 1;
677 }
678
679 int vnc_send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
680 {
681     int n = 0;
682
683     switch(vs->vnc_encoding) {
684         case VNC_ENCODING_ZLIB:
685             n = vnc_zlib_send_framebuffer_update(vs, x, y, w, h);
686             break;
687         case VNC_ENCODING_HEXTILE:
688             vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE);
689             n = vnc_hextile_send_framebuffer_update(vs, x, y, w, h);
690             break;
691         case VNC_ENCODING_TIGHT:
692             n = vnc_tight_send_framebuffer_update(vs, x, y, w, h);
693             break;
694         case VNC_ENCODING_TIGHT_PNG:
695             n = vnc_tight_png_send_framebuffer_update(vs, x, y, w, h);
696             break;
697         default:
698             vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW);
699             n = vnc_raw_send_framebuffer_update(vs, x, y, w, h);
700             break;
701     }
702     return n;
703 }
704
705 static void vnc_copy(VncState *vs, int src_x, int src_y, int dst_x, int dst_y, int w, int h)
706 {
707     /* send bitblit op to the vnc client */
708     vnc_lock_output(vs);
709     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
710     vnc_write_u8(vs, 0);
711     vnc_write_u16(vs, 1); /* number of rects */
712     vnc_framebuffer_update(vs, dst_x, dst_y, w, h, VNC_ENCODING_COPYRECT);
713     vnc_write_u16(vs, src_x);
714     vnc_write_u16(vs, src_y);
715     vnc_unlock_output(vs);
716     vnc_flush(vs);
717 }
718
719 static void vnc_dpy_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h)
720 {
721     VncDisplay *vd = ds->opaque;
722     VncState *vs, *vn;
723     uint8_t *src_row;
724     uint8_t *dst_row;
725     int i,x,y,pitch,depth,inc,w_lim,s;
726     int cmp_bytes;
727
728     vnc_refresh_server_surface(vd);
729     QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
730         if (vnc_has_feature(vs, VNC_FEATURE_COPYRECT)) {
731             vs->force_update = 1;
732             vnc_update_client_sync(vs, 1);
733             /* vs might be free()ed here */
734         }
735     }
736
737     /* do bitblit op on the local surface too */
738     pitch = ds_get_linesize(vd->ds);
739     depth = ds_get_bytes_per_pixel(vd->ds);
740     src_row = vd->server->data + pitch * src_y + depth * src_x;
741     dst_row = vd->server->data + pitch * dst_y + depth * dst_x;
742     y = dst_y;
743     inc = 1;
744     if (dst_y > src_y) {
745         /* copy backwards */
746         src_row += pitch * (h-1);
747         dst_row += pitch * (h-1);
748         pitch = -pitch;
749         y = dst_y + h - 1;
750         inc = -1;
751     }
752     w_lim = w - (16 - (dst_x % 16));
753     if (w_lim < 0)
754         w_lim = w;
755     else
756         w_lim = w - (w_lim % 16);
757     for (i = 0; i < h; i++) {
758         for (x = 0; x <= w_lim;
759                 x += s, src_row += cmp_bytes, dst_row += cmp_bytes) {
760             if (x == w_lim) {
761                 if ((s = w - w_lim) == 0)
762                     break;
763             } else if (!x) {
764                 s = (16 - (dst_x % 16));
765                 s = MIN(s, w_lim);
766             } else {
767                 s = 16;
768             }
769             cmp_bytes = s * depth;
770             if (memcmp(src_row, dst_row, cmp_bytes) == 0)
771                 continue;
772             memmove(dst_row, src_row, cmp_bytes);
773             QTAILQ_FOREACH(vs, &vd->clients, next) {
774                 if (!vnc_has_feature(vs, VNC_FEATURE_COPYRECT)) {
775                     vnc_set_bit(vs->dirty[y], ((x + dst_x) / 16));
776                 }
777             }
778         }
779         src_row += pitch - w * depth;
780         dst_row += pitch - w * depth;
781         y += inc;
782     }
783
784     QTAILQ_FOREACH(vs, &vd->clients, next) {
785         if (vnc_has_feature(vs, VNC_FEATURE_COPYRECT)) {
786             vnc_copy(vs, src_x, src_y, dst_x, dst_y, w, h);
787         }
788     }
789 }
790
791 static void vnc_mouse_set(int x, int y, int visible)
792 {
793     /* can we ask the client(s) to move the pointer ??? */
794 }
795
796 static int vnc_cursor_define(VncState *vs)
797 {
798     QEMUCursor *c = vs->vd->cursor;
799     PixelFormat pf = qemu_default_pixelformat(32);
800     int isize;
801
802     if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) {
803         vnc_lock_output(vs);
804         vnc_write_u8(vs,  VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
805         vnc_write_u8(vs,  0);  /*  padding     */
806         vnc_write_u16(vs, 1);  /*  # of rects  */
807         vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height,
808                                VNC_ENCODING_RICH_CURSOR);
809         isize = c->width * c->height * vs->clientds.pf.bytes_per_pixel;
810         vnc_write_pixels_generic(vs, &pf, c->data, isize);
811         vnc_write(vs, vs->vd->cursor_mask, vs->vd->cursor_msize);
812         vnc_unlock_output(vs);
813         return 0;
814     }
815     return -1;
816 }
817
818 static void vnc_dpy_cursor_define(QEMUCursor *c)
819 {
820     VncDisplay *vd = vnc_display;
821     VncState *vs;
822
823     cursor_put(vd->cursor);
824     qemu_free(vd->cursor_mask);
825
826     vd->cursor = c;
827     cursor_get(vd->cursor);
828     vd->cursor_msize = cursor_get_mono_bpl(c) * c->height;
829     vd->cursor_mask = qemu_mallocz(vd->cursor_msize);
830     cursor_get_mono_mask(c, 0, vd->cursor_mask);
831
832     QTAILQ_FOREACH(vs, &vd->clients, next) {
833         vnc_cursor_define(vs);
834     }
835 }
836
837 static int find_and_clear_dirty_height(struct VncState *vs,
838                                        int y, int last_x, int x)
839 {
840     int h;
841     VncDisplay *vd = vs->vd;
842
843     for (h = 1; h < (vd->server->height - y); h++) {
844         int tmp_x;
845         if (!vnc_get_bit(vs->dirty[y + h], last_x))
846             break;
847         for (tmp_x = last_x; tmp_x < x; tmp_x++)
848             vnc_clear_bit(vs->dirty[y + h], tmp_x);
849     }
850
851     return h;
852 }
853
854 #ifdef CONFIG_VNC_THREAD
855 static int vnc_update_client_sync(VncState *vs, int has_dirty)
856 {
857     int ret = vnc_update_client(vs, has_dirty);
858     vnc_jobs_join(vs);
859     return ret;
860 }
861 #else
862 static int vnc_update_client_sync(VncState *vs, int has_dirty)
863 {
864     return vnc_update_client(vs, has_dirty);
865 }
866 #endif
867
868 static int vnc_update_client(VncState *vs, int has_dirty)
869 {
870     if (vs->need_update && vs->csock != -1) {
871         VncDisplay *vd = vs->vd;
872         VncJob *job;
873         int y;
874         int width, height;
875         int n = 0;
876
877
878         if (vs->output.offset && !vs->audio_cap && !vs->force_update)
879             /* kernel send buffers are full -> drop frames to throttle */
880             return 0;
881
882         if (!has_dirty && !vs->audio_cap && !vs->force_update)
883             return 0;
884
885         /*
886          * Send screen updates to the vnc client using the server
887          * surface and server dirty map.  guest surface updates
888          * happening in parallel don't disturb us, the next pass will
889          * send them to the client.
890          */
891         job = vnc_job_new(vs);
892
893         width = MIN(vd->server->width, vs->client_width);
894         height = MIN(vd->server->height, vs->client_height);
895
896         for (y = 0; y < height; y++) {
897             int x;
898             int last_x = -1;
899             for (x = 0; x < width / 16; x++) {
900                 if (vnc_get_bit(vs->dirty[y], x)) {
901                     if (last_x == -1) {
902                         last_x = x;
903                     }
904                     vnc_clear_bit(vs->dirty[y], x);
905                 } else {
906                     if (last_x != -1) {
907                         int h = find_and_clear_dirty_height(vs, y, last_x, x);
908
909                         n += vnc_job_add_rect(job, last_x * 16, y,
910                                               (x - last_x) * 16, h);
911                     }
912                     last_x = -1;
913                 }
914             }
915             if (last_x != -1) {
916                 int h = find_and_clear_dirty_height(vs, y, last_x, x);
917                 n += vnc_job_add_rect(job, last_x * 16, y,
918                                       (x - last_x) * 16, h);
919             }
920         }
921
922         vnc_job_push(job);
923         vs->force_update = 0;
924         return n;
925     }
926
927     if (vs->csock == -1)
928         vnc_disconnect_finish(vs);
929
930     return 0;
931 }
932
933 /* audio */
934 static void audio_capture_notify(void *opaque, audcnotification_e cmd)
935 {
936     VncState *vs = opaque;
937
938     switch (cmd) {
939     case AUD_CNOTIFY_DISABLE:
940         vnc_lock_output(vs);
941         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
942         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
943         vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_END);
944         vnc_unlock_output(vs);
945         vnc_flush(vs);
946         break;
947
948     case AUD_CNOTIFY_ENABLE:
949         vnc_lock_output(vs);
950         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
951         vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
952         vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_BEGIN);
953         vnc_unlock_output(vs);
954         vnc_flush(vs);
955         break;
956     }
957 }
958
959 static void audio_capture_destroy(void *opaque)
960 {
961 }
962
963 static void audio_capture(void *opaque, void *buf, int size)
964 {
965     VncState *vs = opaque;
966
967     vnc_lock_output(vs);
968     vnc_write_u8(vs, VNC_MSG_SERVER_QEMU);
969     vnc_write_u8(vs, VNC_MSG_SERVER_QEMU_AUDIO);
970     vnc_write_u16(vs, VNC_MSG_SERVER_QEMU_AUDIO_DATA);
971     vnc_write_u32(vs, size);
972     vnc_write(vs, buf, size);
973     vnc_unlock_output(vs);
974     vnc_flush(vs);
975 }
976
977 static void audio_add(VncState *vs)
978 {
979     struct audio_capture_ops ops;
980
981     if (vs->audio_cap) {
982         monitor_printf(default_mon, "audio already running\n");
983         return;
984     }
985
986     ops.notify = audio_capture_notify;
987     ops.destroy = audio_capture_destroy;
988     ops.capture = audio_capture;
989
990     vs->audio_cap = AUD_add_capture(&vs->as, &ops, vs);
991     if (!vs->audio_cap) {
992         monitor_printf(default_mon, "Failed to add audio capture\n");
993     }
994 }
995
996 static void audio_del(VncState *vs)
997 {
998     if (vs->audio_cap) {
999         AUD_del_capture(vs->audio_cap, vs);
1000         vs->audio_cap = NULL;
1001     }
1002 }
1003
1004 static void vnc_disconnect_start(VncState *vs)
1005 {
1006     if (vs->csock == -1)
1007         return;
1008     qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
1009     closesocket(vs->csock);
1010     vs->csock = -1;
1011 }
1012
1013 static void vnc_disconnect_finish(VncState *vs)
1014 {
1015     vnc_jobs_join(vs); /* Wait encoding jobs */
1016
1017     vnc_lock_output(vs);
1018     vnc_qmp_event(vs, QEVENT_VNC_DISCONNECTED);
1019
1020     buffer_free(&vs->input);
1021     buffer_free(&vs->output);
1022
1023     qobject_decref(vs->info);
1024
1025     vnc_zlib_clear(vs);
1026     vnc_tight_clear(vs);
1027
1028 #ifdef CONFIG_VNC_TLS
1029     vnc_tls_client_cleanup(vs);
1030 #endif /* CONFIG_VNC_TLS */
1031 #ifdef CONFIG_VNC_SASL
1032     vnc_sasl_client_cleanup(vs);
1033 #endif /* CONFIG_VNC_SASL */
1034     audio_del(vs);
1035
1036     QTAILQ_REMOVE(&vs->vd->clients, vs, next);
1037
1038     if (QTAILQ_EMPTY(&vs->vd->clients)) {
1039         dcl->idle = 1;
1040     }
1041
1042     qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
1043     vnc_remove_timer(vs->vd);
1044     if (vs->vd->lock_key_sync)
1045         qemu_remove_led_event_handler(vs->led);
1046     vnc_unlock_output(vs);
1047
1048 #ifdef CONFIG_VNC_THREAD
1049     qemu_mutex_destroy(&vs->output_mutex);
1050 #endif
1051     qemu_free(vs);
1052 }
1053
1054 int vnc_client_io_error(VncState *vs, int ret, int last_errno)
1055 {
1056     if (ret == 0 || ret == -1) {
1057         if (ret == -1) {
1058             switch (last_errno) {
1059                 case EINTR:
1060                 case EAGAIN:
1061 #ifdef _WIN32
1062                 case WSAEWOULDBLOCK:
1063 #endif
1064                     return 0;
1065                 default:
1066                     break;
1067             }
1068         }
1069
1070         VNC_DEBUG("Closing down client sock: ret %d, errno %d\n",
1071                   ret, ret < 0 ? last_errno : 0);
1072         vnc_disconnect_start(vs);
1073
1074         return 0;
1075     }
1076     return ret;
1077 }
1078
1079
1080 void vnc_client_error(VncState *vs)
1081 {
1082     VNC_DEBUG("Closing down client sock: protocol error\n");
1083     vnc_disconnect_start(vs);
1084 }
1085
1086
1087 /*
1088  * Called to write a chunk of data to the client socket. The data may
1089  * be the raw data, or may have already been encoded by SASL.
1090  * The data will be written either straight onto the socket, or
1091  * written via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1092  *
1093  * NB, it is theoretically possible to have 2 layers of encryption,
1094  * both SASL, and this TLS layer. It is highly unlikely in practice
1095  * though, since SASL encryption will typically be a no-op if TLS
1096  * is active
1097  *
1098  * Returns the number of bytes written, which may be less than
1099  * the requested 'datalen' if the socket would block. Returns
1100  * -1 on error, and disconnects the client socket.
1101  */
1102 long vnc_client_write_buf(VncState *vs, const uint8_t *data, size_t datalen)
1103 {
1104     long ret;
1105 #ifdef CONFIG_VNC_TLS
1106     if (vs->tls.session) {
1107         ret = gnutls_write(vs->tls.session, data, datalen);
1108         if (ret < 0) {
1109             if (ret == GNUTLS_E_AGAIN)
1110                 errno = EAGAIN;
1111             else
1112                 errno = EIO;
1113             ret = -1;
1114         }
1115     } else
1116 #endif /* CONFIG_VNC_TLS */
1117         ret = send(vs->csock, (const void *)data, datalen, 0);
1118     VNC_DEBUG("Wrote wire %p %zd -> %ld\n", data, datalen, ret);
1119     return vnc_client_io_error(vs, ret, socket_error());
1120 }
1121
1122
1123 /*
1124  * Called to write buffered data to the client socket, when not
1125  * using any SASL SSF encryption layers. Will write as much data
1126  * as possible without blocking. If all buffered data is written,
1127  * will switch the FD poll() handler back to read monitoring.
1128  *
1129  * Returns the number of bytes written, which may be less than
1130  * the buffered output data if the socket would block. Returns
1131  * -1 on error, and disconnects the client socket.
1132  */
1133 static long vnc_client_write_plain(VncState *vs)
1134 {
1135     long ret;
1136
1137 #ifdef CONFIG_VNC_SASL
1138     VNC_DEBUG("Write Plain: Pending output %p size %zd offset %zd. Wait SSF %d\n",
1139               vs->output.buffer, vs->output.capacity, vs->output.offset,
1140               vs->sasl.waitWriteSSF);
1141
1142     if (vs->sasl.conn &&
1143         vs->sasl.runSSF &&
1144         vs->sasl.waitWriteSSF) {
1145         ret = vnc_client_write_buf(vs, vs->output.buffer, vs->sasl.waitWriteSSF);
1146         if (ret)
1147             vs->sasl.waitWriteSSF -= ret;
1148     } else
1149 #endif /* CONFIG_VNC_SASL */
1150         ret = vnc_client_write_buf(vs, vs->output.buffer, vs->output.offset);
1151     if (!ret)
1152         return 0;
1153
1154     memmove(vs->output.buffer, vs->output.buffer + ret, (vs->output.offset - ret));
1155     vs->output.offset -= ret;
1156
1157     if (vs->output.offset == 0) {
1158         qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
1159     }
1160
1161     return ret;
1162 }
1163
1164
1165 /*
1166  * First function called whenever there is data to be written to
1167  * the client socket. Will delegate actual work according to whether
1168  * SASL SSF layers are enabled (thus requiring encryption calls)
1169  */
1170 static void vnc_client_write_locked(void *opaque)
1171 {
1172     VncState *vs = opaque;
1173
1174 #ifdef CONFIG_VNC_SASL
1175     if (vs->sasl.conn &&
1176         vs->sasl.runSSF &&
1177         !vs->sasl.waitWriteSSF) {
1178         vnc_client_write_sasl(vs);
1179     } else
1180 #endif /* CONFIG_VNC_SASL */
1181         vnc_client_write_plain(vs);
1182 }
1183
1184 void vnc_client_write(void *opaque)
1185 {
1186     VncState *vs = opaque;
1187
1188     vnc_lock_output(vs);
1189     if (vs->output.offset) {
1190         vnc_client_write_locked(opaque);
1191     } else if (vs->csock != -1) {
1192         qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
1193     }
1194     vnc_unlock_output(vs);
1195 }
1196
1197 void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
1198 {
1199     vs->read_handler = func;
1200     vs->read_handler_expect = expecting;
1201 }
1202
1203
1204 /*
1205  * Called to read a chunk of data from the client socket. The data may
1206  * be the raw data, or may need to be further decoded by SASL.
1207  * The data will be read either straight from to the socket, or
1208  * read via the GNUTLS wrappers, if TLS/SSL encryption is enabled
1209  *
1210  * NB, it is theoretically possible to have 2 layers of encryption,
1211  * both SASL, and this TLS layer. It is highly unlikely in practice
1212  * though, since SASL encryption will typically be a no-op if TLS
1213  * is active
1214  *
1215  * Returns the number of bytes read, which may be less than
1216  * the requested 'datalen' if the socket would block. Returns
1217  * -1 on error, and disconnects the client socket.
1218  */
1219 long vnc_client_read_buf(VncState *vs, uint8_t *data, size_t datalen)
1220 {
1221     long ret;
1222 #ifdef CONFIG_VNC_TLS
1223     if (vs->tls.session) {
1224         ret = gnutls_read(vs->tls.session, data, datalen);
1225         if (ret < 0) {
1226             if (ret == GNUTLS_E_AGAIN)
1227                 errno = EAGAIN;
1228             else
1229                 errno = EIO;
1230             ret = -1;
1231         }
1232     } else
1233 #endif /* CONFIG_VNC_TLS */
1234         ret = recv(vs->csock, (void *)data, datalen, 0);
1235     VNC_DEBUG("Read wire %p %zd -> %ld\n", data, datalen, ret);
1236     return vnc_client_io_error(vs, ret, socket_error());
1237 }
1238
1239
1240 /*
1241  * Called to read data from the client socket to the input buffer,
1242  * when not using any SASL SSF encryption layers. Will read as much
1243  * data as possible without blocking.
1244  *
1245  * Returns the number of bytes read. Returns -1 on error, and
1246  * disconnects the client socket.
1247  */
1248 static long vnc_client_read_plain(VncState *vs)
1249 {
1250     int ret;
1251     VNC_DEBUG("Read plain %p size %zd offset %zd\n",
1252               vs->input.buffer, vs->input.capacity, vs->input.offset);
1253     buffer_reserve(&vs->input, 4096);
1254     ret = vnc_client_read_buf(vs, buffer_end(&vs->input), 4096);
1255     if (!ret)
1256         return 0;
1257     vs->input.offset += ret;
1258     return ret;
1259 }
1260
1261
1262 /*
1263  * First function called whenever there is more data to be read from
1264  * the client socket. Will delegate actual work according to whether
1265  * SASL SSF layers are enabled (thus requiring decryption calls)
1266  */
1267 void vnc_client_read(void *opaque)
1268 {
1269     VncState *vs = opaque;
1270     long ret;
1271
1272 #ifdef CONFIG_VNC_SASL
1273     if (vs->sasl.conn && vs->sasl.runSSF)
1274         ret = vnc_client_read_sasl(vs);
1275     else
1276 #endif /* CONFIG_VNC_SASL */
1277         ret = vnc_client_read_plain(vs);
1278     if (!ret) {
1279         if (vs->csock == -1)
1280             vnc_disconnect_finish(vs);
1281         return;
1282     }
1283
1284     while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
1285         size_t len = vs->read_handler_expect;
1286         int ret;
1287
1288         ret = vs->read_handler(vs, vs->input.buffer, len);
1289         if (vs->csock == -1) {
1290             vnc_disconnect_finish(vs);
1291             return;
1292         }
1293
1294         if (!ret) {
1295             memmove(vs->input.buffer, vs->input.buffer + len, (vs->input.offset - len));
1296             vs->input.offset -= len;
1297         } else {
1298             vs->read_handler_expect = ret;
1299         }
1300     }
1301 }
1302
1303 void vnc_write(VncState *vs, const void *data, size_t len)
1304 {
1305     buffer_reserve(&vs->output, len);
1306
1307     if (vs->csock != -1 && buffer_empty(&vs->output)) {
1308         qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, vnc_client_write, vs);
1309     }
1310
1311     buffer_append(&vs->output, data, len);
1312 }
1313
1314 void vnc_write_s32(VncState *vs, int32_t value)
1315 {
1316     vnc_write_u32(vs, *(uint32_t *)&value);
1317 }
1318
1319 void vnc_write_u32(VncState *vs, uint32_t value)
1320 {
1321     uint8_t buf[4];
1322
1323     buf[0] = (value >> 24) & 0xFF;
1324     buf[1] = (value >> 16) & 0xFF;
1325     buf[2] = (value >>  8) & 0xFF;
1326     buf[3] = value & 0xFF;
1327
1328     vnc_write(vs, buf, 4);
1329 }
1330
1331 void vnc_write_u16(VncState *vs, uint16_t value)
1332 {
1333     uint8_t buf[2];
1334
1335     buf[0] = (value >> 8) & 0xFF;
1336     buf[1] = value & 0xFF;
1337
1338     vnc_write(vs, buf, 2);
1339 }
1340
1341 void vnc_write_u8(VncState *vs, uint8_t value)
1342 {
1343     vnc_write(vs, (char *)&value, 1);
1344 }
1345
1346 void vnc_flush(VncState *vs)
1347 {
1348     vnc_lock_output(vs);
1349     if (vs->csock != -1 && vs->output.offset) {
1350         vnc_client_write_locked(vs);
1351     }
1352     vnc_unlock_output(vs);
1353 }
1354
1355 uint8_t read_u8(uint8_t *data, size_t offset)
1356 {
1357     return data[offset];
1358 }
1359
1360 uint16_t read_u16(uint8_t *data, size_t offset)
1361 {
1362     return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
1363 }
1364
1365 int32_t read_s32(uint8_t *data, size_t offset)
1366 {
1367     return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
1368                      (data[offset + 2] << 8) | data[offset + 3]);
1369 }
1370
1371 uint32_t read_u32(uint8_t *data, size_t offset)
1372 {
1373     return ((data[offset] << 24) | (data[offset + 1] << 16) |
1374             (data[offset + 2] << 8) | data[offset + 3]);
1375 }
1376
1377 static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
1378 {
1379 }
1380
1381 static void check_pointer_type_change(Notifier *notifier)
1382 {
1383     VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
1384     int absolute = kbd_mouse_is_absolute();
1385
1386     if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
1387         vnc_lock_output(vs);
1388         vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1389         vnc_write_u8(vs, 0);
1390         vnc_write_u16(vs, 1);
1391         vnc_framebuffer_update(vs, absolute, 0,
1392                                ds_get_width(vs->ds), ds_get_height(vs->ds),
1393                                VNC_ENCODING_POINTER_TYPE_CHANGE);
1394         vnc_unlock_output(vs);
1395         vnc_flush(vs);
1396     }
1397     vs->absolute = absolute;
1398 }
1399
1400 static void pointer_event(VncState *vs, int button_mask, int x, int y)
1401 {
1402     int buttons = 0;
1403     int dz = 0;
1404
1405     if (button_mask & 0x01)
1406         buttons |= MOUSE_EVENT_LBUTTON;
1407     if (button_mask & 0x02)
1408         buttons |= MOUSE_EVENT_MBUTTON;
1409     if (button_mask & 0x04)
1410         buttons |= MOUSE_EVENT_RBUTTON;
1411     if (button_mask & 0x08)
1412         dz = -1;
1413     if (button_mask & 0x10)
1414         dz = 1;
1415
1416     if (vs->absolute) {
1417         kbd_mouse_event(ds_get_width(vs->ds) > 1 ?
1418                           x * 0x7FFF / (ds_get_width(vs->ds) - 1) : 0x4000,
1419                         ds_get_height(vs->ds) > 1 ?
1420                           y * 0x7FFF / (ds_get_height(vs->ds) - 1) : 0x4000,
1421                         dz, buttons);
1422     } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) {
1423         x -= 0x7FFF;
1424         y -= 0x7FFF;
1425
1426         kbd_mouse_event(x, y, dz, buttons);
1427     } else {
1428         if (vs->last_x != -1)
1429             kbd_mouse_event(x - vs->last_x,
1430                             y - vs->last_y,
1431                             dz, buttons);
1432         vs->last_x = x;
1433         vs->last_y = y;
1434     }
1435 }
1436
1437 static void reset_keys(VncState *vs)
1438 {
1439     int i;
1440     for(i = 0; i < 256; i++) {
1441         if (vs->modifiers_state[i]) {
1442             if (i & SCANCODE_GREY)
1443                 kbd_put_keycode(SCANCODE_EMUL0);
1444             kbd_put_keycode(i | SCANCODE_UP);
1445             vs->modifiers_state[i] = 0;
1446         }
1447     }
1448 }
1449
1450 static void press_key(VncState *vs, int keysym)
1451 {
1452     int keycode = keysym2scancode(vs->vd->kbd_layout, keysym) & SCANCODE_KEYMASK;
1453     if (keycode & SCANCODE_GREY)
1454         kbd_put_keycode(SCANCODE_EMUL0);
1455     kbd_put_keycode(keycode & SCANCODE_KEYCODEMASK);
1456     if (keycode & SCANCODE_GREY)
1457         kbd_put_keycode(SCANCODE_EMUL0);
1458     kbd_put_keycode(keycode | SCANCODE_UP);
1459 }
1460
1461 static void kbd_leds(void *opaque, int ledstate)
1462 {
1463     VncState *vs = opaque;
1464     int caps, num;
1465
1466     caps = ledstate & QEMU_CAPS_LOCK_LED ? 1 : 0;
1467     num  = ledstate & QEMU_NUM_LOCK_LED  ? 1 : 0;
1468
1469     if (vs->modifiers_state[0x3a] != caps) {
1470         vs->modifiers_state[0x3a] = caps;
1471     }
1472     if (vs->modifiers_state[0x45] != num) {
1473         vs->modifiers_state[0x45] = num;
1474     }
1475 }
1476
1477 static void do_key_event(VncState *vs, int down, int keycode, int sym)
1478 {
1479     /* QEMU console switch */
1480     switch(keycode) {
1481     case 0x2a:                          /* Left Shift */
1482     case 0x36:                          /* Right Shift */
1483     case 0x1d:                          /* Left CTRL */
1484     case 0x9d:                          /* Right CTRL */
1485     case 0x38:                          /* Left ALT */
1486     case 0xb8:                          /* Right ALT */
1487         if (down)
1488             vs->modifiers_state[keycode] = 1;
1489         else
1490             vs->modifiers_state[keycode] = 0;
1491         break;
1492     case 0x02 ... 0x0a: /* '1' to '9' keys */
1493         if (down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) {
1494             /* Reset the modifiers sent to the current console */
1495             reset_keys(vs);
1496             console_select(keycode - 0x02);
1497             return;
1498         }
1499         break;
1500     case 0x3a:                        /* CapsLock */
1501     case 0x45:                        /* NumLock */
1502         if (down)
1503             vs->modifiers_state[keycode] ^= 1;
1504         break;
1505     }
1506
1507     if (vs->vd->lock_key_sync &&
1508         keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
1509         /* If the numlock state needs to change then simulate an additional
1510            keypress before sending this one.  This will happen if the user
1511            toggles numlock away from the VNC window.
1512         */
1513         if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
1514             if (!vs->modifiers_state[0x45]) {
1515                 vs->modifiers_state[0x45] = 1;
1516                 press_key(vs, 0xff7f);
1517             }
1518         } else {
1519             if (vs->modifiers_state[0x45]) {
1520                 vs->modifiers_state[0x45] = 0;
1521                 press_key(vs, 0xff7f);
1522             }
1523         }
1524     }
1525
1526     if (vs->vd->lock_key_sync &&
1527         ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z'))) {
1528         /* If the capslock state needs to change then simulate an additional
1529            keypress before sending this one.  This will happen if the user
1530            toggles capslock away from the VNC window.
1531         */
1532         int uppercase = !!(sym >= 'A' && sym <= 'Z');
1533         int shift = !!(vs->modifiers_state[0x2a] | vs->modifiers_state[0x36]);
1534         int capslock = !!(vs->modifiers_state[0x3a]);
1535         if (capslock) {
1536             if (uppercase == shift) {
1537                 vs->modifiers_state[0x3a] = 0;
1538                 press_key(vs, 0xffe5);
1539             }
1540         } else {
1541             if (uppercase != shift) {
1542                 vs->modifiers_state[0x3a] = 1;
1543                 press_key(vs, 0xffe5);
1544             }
1545         }
1546     }
1547
1548     if (is_graphic_console()) {
1549         if (keycode & SCANCODE_GREY)
1550             kbd_put_keycode(SCANCODE_EMUL0);
1551         if (down)
1552             kbd_put_keycode(keycode & SCANCODE_KEYCODEMASK);
1553         else
1554             kbd_put_keycode(keycode | SCANCODE_UP);
1555     } else {
1556         /* QEMU console emulation */
1557         if (down) {
1558             int numlock = vs->modifiers_state[0x45];
1559             switch (keycode) {
1560             case 0x2a:                          /* Left Shift */
1561             case 0x36:                          /* Right Shift */
1562             case 0x1d:                          /* Left CTRL */
1563             case 0x9d:                          /* Right CTRL */
1564             case 0x38:                          /* Left ALT */
1565             case 0xb8:                          /* Right ALT */
1566                 break;
1567             case 0xc8:
1568                 kbd_put_keysym(QEMU_KEY_UP);
1569                 break;
1570             case 0xd0:
1571                 kbd_put_keysym(QEMU_KEY_DOWN);
1572                 break;
1573             case 0xcb:
1574                 kbd_put_keysym(QEMU_KEY_LEFT);
1575                 break;
1576             case 0xcd:
1577                 kbd_put_keysym(QEMU_KEY_RIGHT);
1578                 break;
1579             case 0xd3:
1580                 kbd_put_keysym(QEMU_KEY_DELETE);
1581                 break;
1582             case 0xc7:
1583                 kbd_put_keysym(QEMU_KEY_HOME);
1584                 break;
1585             case 0xcf:
1586                 kbd_put_keysym(QEMU_KEY_END);
1587                 break;
1588             case 0xc9:
1589                 kbd_put_keysym(QEMU_KEY_PAGEUP);
1590                 break;
1591             case 0xd1:
1592                 kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1593                 break;
1594
1595             case 0x47:
1596                 kbd_put_keysym(numlock ? '7' : QEMU_KEY_HOME);
1597                 break;
1598             case 0x48:
1599                 kbd_put_keysym(numlock ? '8' : QEMU_KEY_UP);
1600                 break;
1601             case 0x49:
1602                 kbd_put_keysym(numlock ? '9' : QEMU_KEY_PAGEUP);
1603                 break;
1604             case 0x4b:
1605                 kbd_put_keysym(numlock ? '4' : QEMU_KEY_LEFT);
1606                 break;
1607             case 0x4c:
1608                 kbd_put_keysym('5');
1609                 break;
1610             case 0x4d:
1611                 kbd_put_keysym(numlock ? '6' : QEMU_KEY_RIGHT);
1612                 break;
1613             case 0x4f:
1614                 kbd_put_keysym(numlock ? '1' : QEMU_KEY_END);
1615                 break;
1616             case 0x50:
1617                 kbd_put_keysym(numlock ? '2' : QEMU_KEY_DOWN);
1618                 break;
1619             case 0x51:
1620                 kbd_put_keysym(numlock ? '3' : QEMU_KEY_PAGEDOWN);
1621                 break;
1622             case 0x52:
1623                 kbd_put_keysym('0');
1624                 break;
1625             case 0x53:
1626                 kbd_put_keysym(numlock ? '.' : QEMU_KEY_DELETE);
1627                 break;
1628
1629             case 0xb5:
1630                 kbd_put_keysym('/');
1631                 break;
1632             case 0x37:
1633                 kbd_put_keysym('*');
1634                 break;
1635             case 0x4a:
1636                 kbd_put_keysym('-');
1637                 break;
1638             case 0x4e:
1639                 kbd_put_keysym('+');
1640                 break;
1641             case 0x9c:
1642                 kbd_put_keysym('\n');
1643                 break;
1644
1645             default:
1646                 kbd_put_keysym(sym);
1647                 break;
1648             }
1649         }
1650     }
1651 }
1652
1653 static void key_event(VncState *vs, int down, uint32_t sym)
1654 {
1655     int keycode;
1656     int lsym = sym;
1657
1658     if (lsym >= 'A' && lsym <= 'Z' && is_graphic_console()) {
1659         lsym = lsym - 'A' + 'a';
1660     }
1661
1662     keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF) & SCANCODE_KEYMASK;
1663     do_key_event(vs, down, keycode, sym);
1664 }
1665
1666 static void ext_key_event(VncState *vs, int down,
1667                           uint32_t sym, uint16_t keycode)
1668 {
1669     /* if the user specifies a keyboard layout, always use it */
1670     if (keyboard_layout)
1671         key_event(vs, down, sym);
1672     else
1673         do_key_event(vs, down, keycode, sym);
1674 }
1675
1676 static void framebuffer_update_request(VncState *vs, int incremental,
1677                                        int x_position, int y_position,
1678                                        int w, int h)
1679 {
1680     if (y_position > ds_get_height(vs->ds))
1681         y_position = ds_get_height(vs->ds);
1682     if (y_position + h >= ds_get_height(vs->ds))
1683         h = ds_get_height(vs->ds) - y_position;
1684
1685     int i;
1686     vs->need_update = 1;
1687     if (!incremental) {
1688         vs->force_update = 1;
1689         for (i = 0; i < h; i++) {
1690             vnc_set_bits(vs->dirty[y_position + i],
1691                          (ds_get_width(vs->ds) / 16), VNC_DIRTY_WORDS);
1692         }
1693     }
1694 }
1695
1696 static void send_ext_key_event_ack(VncState *vs)
1697 {
1698     vnc_lock_output(vs);
1699     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1700     vnc_write_u8(vs, 0);
1701     vnc_write_u16(vs, 1);
1702     vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds),
1703                            VNC_ENCODING_EXT_KEY_EVENT);
1704     vnc_unlock_output(vs);
1705     vnc_flush(vs);
1706 }
1707
1708 static void send_ext_audio_ack(VncState *vs)
1709 {
1710     vnc_lock_output(vs);
1711     vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1712     vnc_write_u8(vs, 0);
1713     vnc_write_u16(vs, 1);
1714     vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds),
1715                            VNC_ENCODING_AUDIO);
1716     vnc_unlock_output(vs);
1717     vnc_flush(vs);
1718 }
1719
1720 static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
1721 {
1722     int i;
1723     unsigned int enc = 0;
1724
1725     vs->features = 0;
1726     vs->vnc_encoding = 0;
1727     vs->tight.compression = 9;
1728     vs->tight.quality = -1; /* Lossless by default */
1729     vs->absolute = -1;
1730
1731     /*
1732      * Start from the end because the encodings are sent in order of preference.
1733      * This way the prefered encoding (first encoding defined in the array)
1734      * will be set at the end of the loop.
1735      */
1736     for (i = n_encodings - 1; i >= 0; i--) {
1737         enc = encodings[i];
1738         switch (enc) {
1739         case VNC_ENCODING_RAW:
1740             vs->vnc_encoding = enc;
1741             break;
1742         case VNC_ENCODING_COPYRECT:
1743             vs->features |= VNC_FEATURE_COPYRECT_MASK;
1744             break;
1745         case VNC_ENCODING_HEXTILE:
1746             vs->features |= VNC_FEATURE_HEXTILE_MASK;
1747             vs->vnc_encoding = enc;
1748             break;
1749         case VNC_ENCODING_TIGHT:
1750             vs->features |= VNC_FEATURE_TIGHT_MASK;
1751             vs->vnc_encoding = enc;
1752             break;
1753         case VNC_ENCODING_TIGHT_PNG:
1754             vs->features |= VNC_FEATURE_TIGHT_PNG_MASK;
1755             vs->vnc_encoding = enc;
1756             break;
1757         case VNC_ENCODING_ZLIB:
1758             vs->features |= VNC_FEATURE_ZLIB_MASK;
1759             vs->vnc_encoding = enc;
1760             break;
1761         case VNC_ENCODING_DESKTOPRESIZE:
1762             vs->features |= VNC_FEATURE_RESIZE_MASK;
1763             break;
1764         case VNC_ENCODING_POINTER_TYPE_CHANGE:
1765             vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK;
1766             break;
1767         case VNC_ENCODING_RICH_CURSOR:
1768             vs->features |= VNC_FEATURE_RICH_CURSOR_MASK;
1769             break;
1770         case VNC_ENCODING_EXT_KEY_EVENT:
1771             send_ext_key_event_ack(vs);
1772             break;
1773         case VNC_ENCODING_AUDIO:
1774             send_ext_audio_ack(vs);
1775             break;
1776         case VNC_ENCODING_WMVi:
1777             vs->features |= VNC_FEATURE_WMVI_MASK;
1778             break;
1779         case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:
1780             vs->tight.compression = (enc & 0x0F);
1781             break;
1782         case VNC_ENCODING_QUALITYLEVEL0 ... VNC_ENCODING_QUALITYLEVEL0 + 9:
1783             vs->tight.quality = (enc & 0x0F);
1784             break;
1785         default:
1786             VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc);
1787             break;
1788         }
1789     }
1790     vnc_desktop_resize(vs);
1791     check_pointer_type_change(&vs->mouse_mode_notifier);
1792 }
1793
1794 static void set_pixel_conversion(VncState *vs)
1795 {
1796     if ((vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG) ==
1797         (vs->ds->surface->flags & QEMU_BIG_ENDIAN_FLAG) && 
1798         !memcmp(&(vs->clientds.pf), &(vs->ds->surface->pf), sizeof(PixelFormat))) {
1799         vs->write_pixels = vnc_write_pixels_copy;
1800         vnc_hextile_set_pixel_conversion(vs, 0);
1801     } else {
1802         vs->write_pixels = vnc_write_pixels_generic;
1803         vnc_hextile_set_pixel_conversion(vs, 1);
1804     }
1805 }
1806
1807 static void set_pixel_format(VncState *vs,
1808                              int bits_per_pixel, int depth,
1809                              int big_endian_flag, int true_color_flag,
1810                              int red_max, int green_max, int blue_max,
1811                              int red_shift, int green_shift, int blue_shift)
1812 {
1813     if (!true_color_flag) {
1814         vnc_client_error(vs);
1815         return;
1816     }
1817
1818     vs->clientds = *(vs->vd->guest.ds);
1819     vs->clientds.pf.rmax = red_max;
1820     count_bits(vs->clientds.pf.rbits, red_max);
1821     vs->clientds.pf.rshift = red_shift;
1822     vs->clientds.pf.rmask = red_max << red_shift;
1823     vs->clientds.pf.gmax = green_max;
1824     count_bits(vs->clientds.pf.gbits, green_max);
1825     vs->clientds.pf.gshift = green_shift;
1826     vs->clientds.pf.gmask = green_max << green_shift;
1827     vs->clientds.pf.bmax = blue_max;
1828     count_bits(vs->clientds.pf.bbits, blue_max);
1829     vs->clientds.pf.bshift = blue_shift;
1830     vs->clientds.pf.bmask = blue_max << blue_shift;
1831     vs->clientds.pf.bits_per_pixel = bits_per_pixel;
1832     vs->clientds.pf.bytes_per_pixel = bits_per_pixel / 8;
1833     vs->clientds.pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
1834     vs->clientds.flags = big_endian_flag ? QEMU_BIG_ENDIAN_FLAG : 0x00;
1835
1836     set_pixel_conversion(vs);
1837
1838     vga_hw_invalidate();
1839     vga_hw_update();
1840 }
1841
1842 static void pixel_format_message (VncState *vs) {
1843     char pad[3] = { 0, 0, 0 };
1844
1845     vnc_write_u8(vs, vs->ds->surface->pf.bits_per_pixel); /* bits-per-pixel */
1846     vnc_write_u8(vs, vs->ds->surface->pf.depth); /* depth */
1847
1848 #ifdef HOST_WORDS_BIGENDIAN
1849     vnc_write_u8(vs, 1);             /* big-endian-flag */
1850 #else
1851     vnc_write_u8(vs, 0);             /* big-endian-flag */
1852 #endif
1853     vnc_write_u8(vs, 1);             /* true-color-flag */
1854     vnc_write_u16(vs, vs->ds->surface->pf.rmax);     /* red-max */
1855     vnc_write_u16(vs, vs->ds->surface->pf.gmax);     /* green-max */
1856     vnc_write_u16(vs, vs->ds->surface->pf.bmax);     /* blue-max */
1857     vnc_write_u8(vs, vs->ds->surface->pf.rshift);    /* red-shift */
1858     vnc_write_u8(vs, vs->ds->surface->pf.gshift);    /* green-shift */
1859     vnc_write_u8(vs, vs->ds->surface->pf.bshift);    /* blue-shift */
1860
1861     vnc_hextile_set_pixel_conversion(vs, 0);
1862
1863     vs->clientds = *(vs->ds->surface);
1864     vs->clientds.flags &= ~QEMU_ALLOCATED_FLAG;
1865     vs->write_pixels = vnc_write_pixels_copy;
1866
1867     vnc_write(vs, pad, 3);           /* padding */
1868 }
1869
1870 static void vnc_dpy_setdata(DisplayState *ds)
1871 {
1872     /* We don't have to do anything */
1873 }
1874
1875 static void vnc_colordepth(VncState *vs)
1876 {
1877     if (vnc_has_feature(vs, VNC_FEATURE_WMVI)) {
1878         /* Sending a WMVi message to notify the client*/
1879         vnc_lock_output(vs);
1880         vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE);
1881         vnc_write_u8(vs, 0);
1882         vnc_write_u16(vs, 1); /* number of rects */
1883         vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), 
1884                                ds_get_height(vs->ds), VNC_ENCODING_WMVi);
1885         pixel_format_message(vs);
1886         vnc_unlock_output(vs);
1887         vnc_flush(vs);
1888     } else {
1889         set_pixel_conversion(vs);
1890     }
1891 }
1892
1893 static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
1894 {
1895     int i;
1896     uint16_t limit;
1897     VncDisplay *vd = vs->vd;
1898
1899     if (data[0] > 3) {
1900         vd->timer_interval = VNC_REFRESH_INTERVAL_BASE;
1901         if (!qemu_timer_expired(vd->timer, qemu_get_clock(rt_clock) + vd->timer_interval))
1902             qemu_mod_timer(vd->timer, qemu_get_clock(rt_clock) + vd->timer_interval);
1903     }
1904
1905     switch (data[0]) {
1906     case VNC_MSG_CLIENT_SET_PIXEL_FORMAT:
1907         if (len == 1)
1908             return 20;
1909
1910         set_pixel_format(vs, read_u8(data, 4), read_u8(data, 5),
1911                          read_u8(data, 6), read_u8(data, 7),
1912                          read_u16(data, 8), read_u16(data, 10),
1913                          read_u16(data, 12), read_u8(data, 14),
1914                          read_u8(data, 15), read_u8(data, 16));
1915         break;
1916     case VNC_MSG_CLIENT_SET_ENCODINGS:
1917         if (len == 1)
1918             return 4;
1919
1920         if (len == 4) {
1921             limit = read_u16(data, 2);
1922             if (limit > 0)
1923                 return 4 + (limit * 4);
1924         } else
1925             limit = read_u16(data, 2);
1926
1927         for (i = 0; i < limit; i++) {
1928             int32_t val = read_s32(data, 4 + (i * 4));
1929             memcpy(data + 4 + (i * 4), &val, sizeof(val));
1930         }
1931
1932         set_encodings(vs, (int32_t *)(data + 4), limit);
1933         break;
1934     case VNC_MSG_CLIENT_FRAMEBUFFER_UPDATE_REQUEST:
1935         if (len == 1)
1936             return 10;
1937
1938         framebuffer_update_request(vs,
1939                                    read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
1940                                    read_u16(data, 6), read_u16(data, 8));
1941         break;
1942     case VNC_MSG_CLIENT_KEY_EVENT:
1943         if (len == 1)
1944             return 8;
1945
1946         key_event(vs, read_u8(data, 1), read_u32(data, 4));
1947         break;
1948     case VNC_MSG_CLIENT_POINTER_EVENT:
1949         if (len == 1)
1950             return 6;
1951
1952         pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
1953         break;
1954     case VNC_MSG_CLIENT_CUT_TEXT:
1955         if (len == 1)
1956             return 8;
1957
1958         if (len == 8) {
1959             uint32_t dlen = read_u32(data, 4);
1960             if (dlen > 0)
1961                 return 8 + dlen;
1962         }
1963
1964         client_cut_text(vs, read_u32(data, 4), data + 8);
1965         break;
1966     case VNC_MSG_CLIENT_QEMU:
1967         if (len == 1)
1968             return 2;
1969
1970         switch (read_u8(data, 1)) {
1971         case VNC_MSG_CLIENT_QEMU_EXT_KEY_EVENT:
1972             if (len == 2)
1973                 return 12;
1974
1975             ext_key_event(vs, read_u16(data, 2),
1976                           read_u32(data, 4), read_u32(data, 8));
1977             break;
1978         case VNC_MSG_CLIENT_QEMU_AUDIO:
1979             if (len == 2)
1980                 return 4;
1981
1982             switch (read_u16 (data, 2)) {
1983             case VNC_MSG_CLIENT_QEMU_AUDIO_ENABLE:
1984                 audio_add(vs);
1985                 break;
1986             case VNC_MSG_CLIENT_QEMU_AUDIO_DISABLE:
1987                 audio_del(vs);
1988                 break;
1989             case VNC_MSG_CLIENT_QEMU_AUDIO_SET_FORMAT:
1990                 if (len == 4)
1991                     return 10;
1992                 switch (read_u8(data, 4)) {
1993                 case 0: vs->as.fmt = AUD_FMT_U8; break;
1994                 case 1: vs->as.fmt = AUD_FMT_S8; break;
1995                 case 2: vs->as.fmt = AUD_FMT_U16; break;
1996                 case 3: vs->as.fmt = AUD_FMT_S16; break;
1997                 case 4: vs->as.fmt = AUD_FMT_U32; break;
1998                 case 5: vs->as.fmt = AUD_FMT_S32; break;
1999                 default:
2000                     printf("Invalid audio format %d\n", read_u8(data, 4));
2001                     vnc_client_error(vs);
2002                     break;
2003                 }
2004                 vs->as.nchannels = read_u8(data, 5);
2005                 if (vs->as.nchannels != 1 && vs->as.nchannels != 2) {
2006                     printf("Invalid audio channel coount %d\n",
2007                            read_u8(data, 5));
2008                     vnc_client_error(vs);
2009                     break;
2010                 }
2011                 vs->as.freq = read_u32(data, 6);
2012                 break;
2013             default:
2014                 printf ("Invalid audio message %d\n", read_u8(data, 4));
2015                 vnc_client_error(vs);
2016                 break;
2017             }
2018             break;
2019
2020         default:
2021             printf("Msg: %d\n", read_u16(data, 0));
2022             vnc_client_error(vs);
2023             break;
2024         }
2025         break;
2026     default:
2027         printf("Msg: %d\n", data[0]);
2028         vnc_client_error(vs);
2029         break;
2030     }
2031
2032     vnc_read_when(vs, protocol_client_msg, 1);
2033     return 0;
2034 }
2035
2036 static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
2037 {
2038     char buf[1024];
2039     int size;
2040
2041     vs->client_width = ds_get_width(vs->ds);
2042     vs->client_height = ds_get_height(vs->ds);
2043     vnc_write_u16(vs, vs->client_width);
2044     vnc_write_u16(vs, vs->client_height);
2045
2046     pixel_format_message(vs);
2047
2048     if (qemu_name)
2049         size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
2050     else
2051         size = snprintf(buf, sizeof(buf), "QEMU");
2052
2053     vnc_write_u32(vs, size);
2054     vnc_write(vs, buf, size);
2055     vnc_flush(vs);
2056
2057     vnc_client_cache_auth(vs);
2058     vnc_qmp_event(vs, QEVENT_VNC_INITIALIZED);
2059
2060     vnc_read_when(vs, protocol_client_msg, 1);
2061
2062     return 0;
2063 }
2064
2065 void start_client_init(VncState *vs)
2066 {
2067     vnc_read_when(vs, protocol_client_init, 1);
2068 }
2069
2070 static void make_challenge(VncState *vs)
2071 {
2072     int i;
2073
2074     srand(time(NULL)+getpid()+getpid()*987654+rand());
2075
2076     for (i = 0 ; i < sizeof(vs->challenge) ; i++)
2077         vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
2078 }
2079
2080 static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
2081 {
2082     unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
2083     int i, j, pwlen;
2084     unsigned char key[8];
2085
2086     if (!vs->vd->password || !vs->vd->password[0]) {
2087         VNC_DEBUG("No password configured on server");
2088         vnc_write_u32(vs, 1); /* Reject auth */
2089         if (vs->minor >= 8) {
2090             static const char err[] = "Authentication failed";
2091             vnc_write_u32(vs, sizeof(err));
2092             vnc_write(vs, err, sizeof(err));
2093         }
2094         vnc_flush(vs);
2095         vnc_client_error(vs);
2096         return 0;
2097     }
2098
2099     memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
2100
2101     /* Calculate the expected challenge response */
2102     pwlen = strlen(vs->vd->password);
2103     for (i=0; i<sizeof(key); i++)
2104         key[i] = i<pwlen ? vs->vd->password[i] : 0;
2105     deskey(key, EN0);
2106     for (j = 0; j < VNC_AUTH_CHALLENGE_SIZE; j += 8)
2107         des(response+j, response+j);
2108
2109     /* Compare expected vs actual challenge response */
2110     if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
2111         VNC_DEBUG("Client challenge reponse did not match\n");
2112         vnc_write_u32(vs, 1); /* Reject auth */
2113         if (vs->minor >= 8) {
2114             static const char err[] = "Authentication failed";
2115             vnc_write_u32(vs, sizeof(err));
2116             vnc_write(vs, err, sizeof(err));
2117         }
2118         vnc_flush(vs);
2119         vnc_client_error(vs);
2120     } else {
2121         VNC_DEBUG("Accepting VNC challenge response\n");
2122         vnc_write_u32(vs, 0); /* Accept auth */
2123         vnc_flush(vs);
2124
2125         start_client_init(vs);
2126     }
2127     return 0;
2128 }
2129
2130 void start_auth_vnc(VncState *vs)
2131 {
2132     make_challenge(vs);
2133     /* Send client a 'random' challenge */
2134     vnc_write(vs, vs->challenge, sizeof(vs->challenge));
2135     vnc_flush(vs);
2136
2137     vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
2138 }
2139
2140
2141 static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
2142 {
2143     /* We only advertise 1 auth scheme at a time, so client
2144      * must pick the one we sent. Verify this */
2145     if (data[0] != vs->vd->auth) { /* Reject auth */
2146        VNC_DEBUG("Reject auth %d because it didn't match advertized\n", (int)data[0]);
2147        vnc_write_u32(vs, 1);
2148        if (vs->minor >= 8) {
2149            static const char err[] = "Authentication failed";
2150            vnc_write_u32(vs, sizeof(err));
2151            vnc_write(vs, err, sizeof(err));
2152        }
2153        vnc_client_error(vs);
2154     } else { /* Accept requested auth */
2155        VNC_DEBUG("Client requested auth %d\n", (int)data[0]);
2156        switch (vs->vd->auth) {
2157        case VNC_AUTH_NONE:
2158            VNC_DEBUG("Accept auth none\n");
2159            if (vs->minor >= 8) {
2160                vnc_write_u32(vs, 0); /* Accept auth completion */
2161                vnc_flush(vs);
2162            }
2163            start_client_init(vs);
2164            break;
2165
2166        case VNC_AUTH_VNC:
2167            VNC_DEBUG("Start VNC auth\n");
2168            start_auth_vnc(vs);
2169            break;
2170
2171 #ifdef CONFIG_VNC_TLS
2172        case VNC_AUTH_VENCRYPT:
2173            VNC_DEBUG("Accept VeNCrypt auth\n");;
2174            start_auth_vencrypt(vs);
2175            break;
2176 #endif /* CONFIG_VNC_TLS */
2177
2178 #ifdef CONFIG_VNC_SASL
2179        case VNC_AUTH_SASL:
2180            VNC_DEBUG("Accept SASL auth\n");
2181            start_auth_sasl(vs);
2182            break;
2183 #endif /* CONFIG_VNC_SASL */
2184
2185        default: /* Should not be possible, but just in case */
2186            VNC_DEBUG("Reject auth %d server code bug\n", vs->vd->auth);
2187            vnc_write_u8(vs, 1);
2188            if (vs->minor >= 8) {
2189                static const char err[] = "Authentication failed";
2190                vnc_write_u32(vs, sizeof(err));
2191                vnc_write(vs, err, sizeof(err));
2192            }
2193            vnc_client_error(vs);
2194        }
2195     }
2196     return 0;
2197 }
2198
2199 static int protocol_version(VncState *vs, uint8_t *version, size_t len)
2200 {
2201     char local[13];
2202
2203     memcpy(local, version, 12);
2204     local[12] = 0;
2205
2206     if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
2207         VNC_DEBUG("Malformed protocol version %s\n", local);
2208         vnc_client_error(vs);
2209         return 0;
2210     }
2211     VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
2212     if (vs->major != 3 ||
2213         (vs->minor != 3 &&
2214          vs->minor != 4 &&
2215          vs->minor != 5 &&
2216          vs->minor != 7 &&
2217          vs->minor != 8)) {
2218         VNC_DEBUG("Unsupported client version\n");
2219         vnc_write_u32(vs, VNC_AUTH_INVALID);
2220         vnc_flush(vs);
2221         vnc_client_error(vs);
2222         return 0;
2223     }
2224     /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
2225      * as equivalent to v3.3 by servers
2226      */
2227     if (vs->minor == 4 || vs->minor == 5)
2228         vs->minor = 3;
2229
2230     if (vs->minor == 3) {
2231         if (vs->vd->auth == VNC_AUTH_NONE) {
2232             VNC_DEBUG("Tell client auth none\n");
2233             vnc_write_u32(vs, vs->vd->auth);
2234             vnc_flush(vs);
2235             start_client_init(vs);
2236        } else if (vs->vd->auth == VNC_AUTH_VNC) {
2237             VNC_DEBUG("Tell client VNC auth\n");
2238             vnc_write_u32(vs, vs->vd->auth);
2239             vnc_flush(vs);
2240             start_auth_vnc(vs);
2241        } else {
2242             VNC_DEBUG("Unsupported auth %d for protocol 3.3\n", vs->vd->auth);
2243             vnc_write_u32(vs, VNC_AUTH_INVALID);
2244             vnc_flush(vs);
2245             vnc_client_error(vs);
2246        }
2247     } else {
2248         VNC_DEBUG("Telling client we support auth %d\n", vs->vd->auth);
2249         vnc_write_u8(vs, 1); /* num auth */
2250         vnc_write_u8(vs, vs->vd->auth);
2251         vnc_read_when(vs, protocol_client_auth, 1);
2252         vnc_flush(vs);
2253     }
2254
2255     return 0;
2256 }
2257
2258 static int vnc_refresh_server_surface(VncDisplay *vd)
2259 {
2260     int y;
2261     uint8_t *guest_row;
2262     uint8_t *server_row;
2263     int cmp_bytes;
2264     uint32_t width_mask[VNC_DIRTY_WORDS];
2265     VncState *vs;
2266     int has_dirty = 0;
2267
2268     /*
2269      * Walk through the guest dirty map.
2270      * Check and copy modified bits from guest to server surface.
2271      * Update server dirty map.
2272      */
2273     vnc_set_bits(width_mask, (ds_get_width(vd->ds) / 16), VNC_DIRTY_WORDS);
2274     cmp_bytes = 16 * ds_get_bytes_per_pixel(vd->ds);
2275     guest_row  = vd->guest.ds->data;
2276     server_row = vd->server->data;
2277     for (y = 0; y < vd->guest.ds->height; y++) {
2278         if (vnc_and_bits(vd->guest.dirty[y], width_mask, VNC_DIRTY_WORDS)) {
2279             int x;
2280             uint8_t *guest_ptr;
2281             uint8_t *server_ptr;
2282
2283             guest_ptr  = guest_row;
2284             server_ptr = server_row;
2285
2286             for (x = 0; x < vd->guest.ds->width;
2287                     x += 16, guest_ptr += cmp_bytes, server_ptr += cmp_bytes) {
2288                 if (!vnc_get_bit(vd->guest.dirty[y], (x / 16)))
2289                     continue;
2290                 vnc_clear_bit(vd->guest.dirty[y], (x / 16));
2291                 if (memcmp(server_ptr, guest_ptr, cmp_bytes) == 0)
2292                     continue;
2293                 memcpy(server_ptr, guest_ptr, cmp_bytes);
2294                 QTAILQ_FOREACH(vs, &vd->clients, next) {
2295                     vnc_set_bit(vs->dirty[y], (x / 16));
2296                 }
2297                 has_dirty++;
2298             }
2299         }
2300         guest_row  += ds_get_linesize(vd->ds);
2301         server_row += ds_get_linesize(vd->ds);
2302     }
2303     return has_dirty;
2304 }
2305
2306 static void vnc_refresh(void *opaque)
2307 {
2308     VncDisplay *vd = opaque;
2309     VncState *vs, *vn;
2310     int has_dirty, rects = 0;
2311
2312     vga_hw_update();
2313
2314     if (vnc_trylock_display(vd)) {
2315         vd->timer_interval = VNC_REFRESH_INTERVAL_BASE;
2316         qemu_mod_timer(vd->timer, qemu_get_clock(rt_clock) +
2317                        vd->timer_interval);
2318         return;
2319     }
2320
2321     has_dirty = vnc_refresh_server_surface(vd);
2322     vnc_unlock_display(vd);
2323
2324     QTAILQ_FOREACH_SAFE(vs, &vd->clients, next, vn) {
2325         rects += vnc_update_client(vs, has_dirty);
2326         /* vs might be free()ed here */
2327     }
2328
2329     /* vd->timer could be NULL now if the last client disconnected,
2330      * in this case don't update the timer */
2331     if (vd->timer == NULL)
2332         return;
2333
2334     if (has_dirty && rects) {
2335         vd->timer_interval /= 2;
2336         if (vd->timer_interval < VNC_REFRESH_INTERVAL_BASE)
2337             vd->timer_interval = VNC_REFRESH_INTERVAL_BASE;
2338     } else {
2339         vd->timer_interval += VNC_REFRESH_INTERVAL_INC;
2340         if (vd->timer_interval > VNC_REFRESH_INTERVAL_MAX)
2341             vd->timer_interval = VNC_REFRESH_INTERVAL_MAX;
2342     }
2343     qemu_mod_timer(vd->timer, qemu_get_clock(rt_clock) + vd->timer_interval);
2344 }
2345
2346 static void vnc_init_timer(VncDisplay *vd)
2347 {
2348     vd->timer_interval = VNC_REFRESH_INTERVAL_BASE;
2349     if (vd->timer == NULL && !QTAILQ_EMPTY(&vd->clients)) {
2350         vd->timer = qemu_new_timer(rt_clock, vnc_refresh, vd);
2351         vnc_refresh(vd);
2352     }
2353 }
2354
2355 static void vnc_remove_timer(VncDisplay *vd)
2356 {
2357     if (vd->timer != NULL && QTAILQ_EMPTY(&vd->clients)) {
2358         qemu_del_timer(vd->timer);
2359         qemu_free_timer(vd->timer);
2360         vd->timer = NULL;
2361     }
2362 }
2363
2364 static void vnc_connect(VncDisplay *vd, int csock)
2365 {
2366     VncState *vs = qemu_mallocz(sizeof(VncState));
2367     vs->csock = csock;
2368
2369     VNC_DEBUG("New client on socket %d\n", csock);
2370     dcl->idle = 0;
2371     socket_set_nonblock(vs->csock);
2372     qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
2373
2374     vnc_client_cache_addr(vs);
2375     vnc_qmp_event(vs, QEVENT_VNC_CONNECTED);
2376
2377     vs->vd = vd;
2378     vs->ds = vd->ds;
2379     vs->last_x = -1;
2380     vs->last_y = -1;
2381
2382     vs->as.freq = 44100;
2383     vs->as.nchannels = 2;
2384     vs->as.fmt = AUD_FMT_S16;
2385     vs->as.endianness = 0;
2386
2387 #ifdef CONFIG_VNC_THREAD
2388     qemu_mutex_init(&vs->output_mutex);
2389 #endif
2390
2391     QTAILQ_INSERT_HEAD(&vd->clients, vs, next);
2392
2393     vga_hw_update();
2394
2395     vnc_write(vs, "RFB 003.008\n", 12);
2396     vnc_flush(vs);
2397     vnc_read_when(vs, protocol_version, 12);
2398     reset_keys(vs);
2399     if (vs->vd->lock_key_sync)
2400         vs->led = qemu_add_led_event_handler(kbd_leds, vs);
2401
2402     vs->mouse_mode_notifier.notify = check_pointer_type_change;
2403     qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
2404
2405     vnc_init_timer(vd);
2406
2407     /* vs might be free()ed here */
2408 }
2409
2410 static void vnc_listen_read(void *opaque)
2411 {
2412     VncDisplay *vs = opaque;
2413     struct sockaddr_in addr;
2414     socklen_t addrlen = sizeof(addr);
2415
2416     /* Catch-up */
2417     vga_hw_update();
2418
2419     int csock = qemu_accept(vs->lsock, (struct sockaddr *)&addr, &addrlen);
2420     if (csock != -1) {
2421         vnc_connect(vs, csock);
2422     }
2423 }
2424
2425 void vnc_display_init(DisplayState *ds)
2426 {
2427     VncDisplay *vs = qemu_mallocz(sizeof(*vs));
2428
2429     dcl = qemu_mallocz(sizeof(DisplayChangeListener));
2430
2431     ds->opaque = vs;
2432     dcl->idle = 1;
2433     vnc_display = vs;
2434
2435     vs->lsock = -1;
2436
2437     vs->ds = ds;
2438     QTAILQ_INIT(&vs->clients);
2439
2440     if (keyboard_layout)
2441         vs->kbd_layout = init_keyboard_layout(name2keysym, keyboard_layout);
2442     else
2443         vs->kbd_layout = init_keyboard_layout(name2keysym, "en-us");
2444
2445     if (!vs->kbd_layout)
2446         exit(1);
2447
2448 #ifdef CONFIG_VNC_THREAD
2449     qemu_mutex_init(&vs->mutex);
2450     vnc_start_worker_thread();
2451 #endif
2452
2453     dcl->dpy_copy = vnc_dpy_copy;
2454     dcl->dpy_update = vnc_dpy_update;
2455     dcl->dpy_resize = vnc_dpy_resize;
2456     dcl->dpy_setdata = vnc_dpy_setdata;
2457     register_displaychangelistener(ds, dcl);
2458     ds->mouse_set = vnc_mouse_set;
2459     ds->cursor_define = vnc_dpy_cursor_define;
2460 }
2461
2462
2463 void vnc_display_close(DisplayState *ds)
2464 {
2465     VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
2466
2467     if (!vs)
2468         return;
2469     if (vs->display) {
2470         qemu_free(vs->display);
2471         vs->display = NULL;
2472     }
2473     if (vs->lsock != -1) {
2474         qemu_set_fd_handler2(vs->lsock, NULL, NULL, NULL, NULL);
2475         close(vs->lsock);
2476         vs->lsock = -1;
2477     }
2478     vs->auth = VNC_AUTH_INVALID;
2479 #ifdef CONFIG_VNC_TLS
2480     vs->subauth = VNC_AUTH_INVALID;
2481     vs->tls.x509verify = 0;
2482 #endif
2483 }
2484
2485 int vnc_display_password(DisplayState *ds, const char *password)
2486 {
2487     VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
2488
2489     if (!vs) {
2490         return -1;
2491     }
2492
2493     if (vs->password) {
2494         qemu_free(vs->password);
2495         vs->password = NULL;
2496     }
2497     if (password && password[0]) {
2498         if (!(vs->password = qemu_strdup(password)))
2499             return -1;
2500         if (vs->auth == VNC_AUTH_NONE) {
2501             vs->auth = VNC_AUTH_VNC;
2502         }
2503     } else {
2504         vs->auth = VNC_AUTH_NONE;
2505     }
2506
2507     return 0;
2508 }
2509
2510 char *vnc_display_local_addr(DisplayState *ds)
2511 {
2512     VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
2513     
2514     return vnc_socket_local_addr("%s:%s", vs->lsock);
2515 }
2516
2517 int vnc_display_open(DisplayState *ds, const char *display)
2518 {
2519     VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
2520     const char *options;
2521     int password = 0;
2522     int reverse = 0;
2523 #ifdef CONFIG_VNC_TLS
2524     int tls = 0, x509 = 0;
2525 #endif
2526 #ifdef CONFIG_VNC_SASL
2527     int sasl = 0;
2528     int saslErr;
2529 #endif
2530 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
2531     int acl = 0;
2532 #endif
2533     int lock_key_sync = 1;
2534
2535     if (!vnc_display)
2536         return -1;
2537     vnc_display_close(ds);
2538     if (strcmp(display, "none") == 0)
2539         return 0;
2540
2541     if (!(vs->display = strdup(display)))
2542         return -1;
2543
2544     options = display;
2545     while ((options = strchr(options, ','))) {
2546         options++;
2547         if (strncmp(options, "password", 8) == 0) {
2548             password = 1; /* Require password auth */
2549         } else if (strncmp(options, "reverse", 7) == 0) {
2550             reverse = 1;
2551         } else if (strncmp(options, "no-lock-key-sync", 9) == 0) {
2552             lock_key_sync = 0;
2553 #ifdef CONFIG_VNC_SASL
2554         } else if (strncmp(options, "sasl", 4) == 0) {
2555             sasl = 1; /* Require SASL auth */
2556 #endif
2557 #ifdef CONFIG_VNC_TLS
2558         } else if (strncmp(options, "tls", 3) == 0) {
2559             tls = 1; /* Require TLS */
2560         } else if (strncmp(options, "x509", 4) == 0) {
2561             char *start, *end;
2562             x509 = 1; /* Require x509 certificates */
2563             if (strncmp(options, "x509verify", 10) == 0)
2564                 vs->tls.x509verify = 1; /* ...and verify client certs */
2565
2566             /* Now check for 'x509=/some/path' postfix
2567              * and use that to setup x509 certificate/key paths */
2568             start = strchr(options, '=');
2569             end = strchr(options, ',');
2570             if (start && (!end || (start < end))) {
2571                 int len = end ? end-(start+1) : strlen(start+1);
2572                 char *path = qemu_strndup(start + 1, len);
2573
2574                 VNC_DEBUG("Trying certificate path '%s'\n", path);
2575                 if (vnc_tls_set_x509_creds_dir(vs, path) < 0) {
2576                     fprintf(stderr, "Failed to find x509 certificates/keys in %s\n", path);
2577                     qemu_free(path);
2578                     qemu_free(vs->display);
2579                     vs->display = NULL;
2580                     return -1;
2581                 }
2582                 qemu_free(path);
2583             } else {
2584                 fprintf(stderr, "No certificate path provided\n");
2585                 qemu_free(vs->display);
2586                 vs->display = NULL;
2587                 return -1;
2588             }
2589 #endif
2590 #if defined(CONFIG_VNC_TLS) || defined(CONFIG_VNC_SASL)
2591         } else if (strncmp(options, "acl", 3) == 0) {
2592             acl = 1;
2593 #endif
2594         } else if (strncmp(options, "lossy", 5) == 0) {
2595             vs->lossy = true;
2596         }
2597     }
2598
2599 #ifdef CONFIG_VNC_TLS
2600     if (acl && x509 && vs->tls.x509verify) {
2601         if (!(vs->tls.acl = qemu_acl_init("vnc.x509dname"))) {
2602             fprintf(stderr, "Failed to create x509 dname ACL\n");
2603             exit(1);
2604         }
2605     }
2606 #endif
2607 #ifdef CONFIG_VNC_SASL
2608     if (acl && sasl) {
2609         if (!(vs->sasl.acl = qemu_acl_init("vnc.username"))) {
2610             fprintf(stderr, "Failed to create username ACL\n");
2611             exit(1);
2612         }
2613     }
2614 #endif
2615
2616     /*
2617      * Combinations we support here:
2618      *
2619      *  - no-auth                (clear text, no auth)
2620      *  - password               (clear text, weak auth)
2621      *  - sasl                   (encrypt, good auth *IF* using Kerberos via GSSAPI)
2622      *  - tls                    (encrypt, weak anonymous creds, no auth)
2623      *  - tls + password         (encrypt, weak anonymous creds, weak auth)
2624      *  - tls + sasl             (encrypt, weak anonymous creds, good auth)
2625      *  - tls + x509             (encrypt, good x509 creds, no auth)
2626      *  - tls + x509 + password  (encrypt, good x509 creds, weak auth)
2627      *  - tls + x509 + sasl      (encrypt, good x509 creds, good auth)
2628      *
2629      * NB1. TLS is a stackable auth scheme.
2630      * NB2. the x509 schemes have option to validate a client cert dname
2631      */
2632     if (password) {
2633 #ifdef CONFIG_VNC_TLS
2634         if (tls) {
2635             vs->auth = VNC_AUTH_VENCRYPT;
2636             if (x509) {
2637                 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
2638                 vs->subauth = VNC_AUTH_VENCRYPT_X509VNC;
2639             } else {
2640                 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
2641                 vs->subauth = VNC_AUTH_VENCRYPT_TLSVNC;
2642             }
2643         } else {
2644 #endif /* CONFIG_VNC_TLS */
2645             VNC_DEBUG("Initializing VNC server with password auth\n");
2646             vs->auth = VNC_AUTH_VNC;
2647 #ifdef CONFIG_VNC_TLS
2648             vs->subauth = VNC_AUTH_INVALID;
2649         }
2650 #endif /* CONFIG_VNC_TLS */
2651 #ifdef CONFIG_VNC_SASL
2652     } else if (sasl) {
2653 #ifdef CONFIG_VNC_TLS
2654         if (tls) {
2655             vs->auth = VNC_AUTH_VENCRYPT;
2656             if (x509) {
2657                 VNC_DEBUG("Initializing VNC server with x509 SASL auth\n");
2658                 vs->subauth = VNC_AUTH_VENCRYPT_X509SASL;
2659             } else {
2660                 VNC_DEBUG("Initializing VNC server with TLS SASL auth\n");
2661                 vs->subauth = VNC_AUTH_VENCRYPT_TLSSASL;
2662             }
2663         } else {
2664 #endif /* CONFIG_VNC_TLS */
2665             VNC_DEBUG("Initializing VNC server with SASL auth\n");
2666             vs->auth = VNC_AUTH_SASL;
2667 #ifdef CONFIG_VNC_TLS
2668             vs->subauth = VNC_AUTH_INVALID;
2669         }
2670 #endif /* CONFIG_VNC_TLS */
2671 #endif /* CONFIG_VNC_SASL */
2672     } else {
2673 #ifdef CONFIG_VNC_TLS
2674         if (tls) {
2675             vs->auth = VNC_AUTH_VENCRYPT;
2676             if (x509) {
2677                 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
2678                 vs->subauth = VNC_AUTH_VENCRYPT_X509NONE;
2679             } else {
2680                 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
2681                 vs->subauth = VNC_AUTH_VENCRYPT_TLSNONE;
2682             }
2683         } else {
2684 #endif
2685             VNC_DEBUG("Initializing VNC server with no auth\n");
2686             vs->auth = VNC_AUTH_NONE;
2687 #ifdef CONFIG_VNC_TLS
2688             vs->subauth = VNC_AUTH_INVALID;
2689         }
2690 #endif
2691     }
2692
2693 #ifdef CONFIG_VNC_SASL
2694     if ((saslErr = sasl_server_init(NULL, "qemu")) != SASL_OK) {
2695         fprintf(stderr, "Failed to initialize SASL auth %s",
2696                 sasl_errstring(saslErr, NULL, NULL));
2697         free(vs->display);
2698         vs->display = NULL;
2699         return -1;
2700     }
2701 #endif
2702     vs->lock_key_sync = lock_key_sync;
2703
2704     if (reverse) {
2705         /* connect to viewer */
2706         if (strncmp(display, "unix:", 5) == 0)
2707             vs->lsock = unix_connect(display+5);
2708         else
2709             vs->lsock = inet_connect(display, SOCK_STREAM);
2710         if (-1 == vs->lsock) {
2711             free(vs->display);
2712             vs->display = NULL;
2713             return -1;
2714         } else {
2715             int csock = vs->lsock;
2716             vs->lsock = -1;
2717             vnc_connect(vs, csock);
2718         }
2719         return 0;
2720
2721     } else {
2722         /* listen for connects */
2723         char *dpy;
2724         dpy = qemu_malloc(256);
2725         if (strncmp(display, "unix:", 5) == 0) {
2726             pstrcpy(dpy, 256, "unix:");
2727             vs->lsock = unix_listen(display+5, dpy+5, 256-5);
2728         } else {
2729             vs->lsock = inet_listen(display, dpy, 256, SOCK_STREAM, 5900);
2730         }
2731         if (-1 == vs->lsock) {
2732             free(dpy);
2733             return -1;
2734         } else {
2735             free(vs->display);
2736             vs->display = dpy;
2737         }
2738     }
2739     return qemu_set_fd_handler2(vs->lsock, NULL, vnc_listen_read, NULL, vs);
2740 }
This page took 0.16715 seconds and 4 git commands to generate.