vnc.c (bedf13ecab38bcd479e9db6994ebc3b2c5c7a3ae) vnc.c (e5766eb40453b1d22815fc5482802688ff184006)
1/*
2 * QEMU VNC display driver
3 *
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy

--- 3387 unchanged lines hidden (view full) ---

3396 }
3397
3398 return QCRYPTO_TLS_CREDS(creds);
3399}
3400
3401
3402static int vnc_display_get_address(const char *addrstr,
3403 bool websocket,
1/*
2 * QEMU VNC display driver
3 *
4 * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5 * Copyright (C) 2006 Fabrice Bellard
6 * Copyright (C) 2009 Red Hat, Inc
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy

--- 3387 unchanged lines hidden (view full) ---

3396 }
3397
3398 return QCRYPTO_TLS_CREDS(creds);
3399}
3400
3401
3402static int vnc_display_get_address(const char *addrstr,
3403 bool websocket,
3404 bool reverse,
3404 int displaynum,
3405 int to,
3406 bool has_ipv4,
3407 bool has_ipv6,
3408 bool ipv4,
3409 bool ipv6,
3410 SocketAddress **retaddr,
3411 Error **errp)

--- 63 unchanged lines hidden (view full) ---

3475 if (to) {
3476 inet->has_to = true;
3477 inet->to = to + 5700;
3478 }
3479 } else {
3480 inet->port = g_strdup(port);
3481 }
3482 } else {
3405 int displaynum,
3406 int to,
3407 bool has_ipv4,
3408 bool has_ipv6,
3409 bool ipv4,
3410 bool ipv6,
3411 SocketAddress **retaddr,
3412 Error **errp)

--- 63 unchanged lines hidden (view full) ---

3476 if (to) {
3477 inet->has_to = true;
3478 inet->to = to + 5700;
3479 }
3480 } else {
3481 inet->port = g_strdup(port);
3482 }
3483 } else {
3484 int offset = reverse ? 0 : 5900;
3483 if (parse_uint_full(port, &baseport, 10) < 0) {
3484 error_setg(errp, "can't convert to a number: %s", port);
3485 goto cleanup;
3486 }
3487 if (baseport > 65535 ||
3485 if (parse_uint_full(port, &baseport, 10) < 0) {
3486 error_setg(errp, "can't convert to a number: %s", port);
3487 goto cleanup;
3488 }
3489 if (baseport > 65535 ||
3488 baseport + 5900 > 65535) {
3490 baseport + offset > 65535) {
3489 error_setg(errp, "port %s out of range", port);
3490 goto cleanup;
3491 }
3492 inet->port = g_strdup_printf(
3491 error_setg(errp, "port %s out of range", port);
3492 goto cleanup;
3493 }
3494 inet->port = g_strdup_printf(
3493 "%d", (int)baseport + 5900);
3495 "%d", (int)baseport + offset);
3494
3495 if (to) {
3496 inet->has_to = true;
3496
3497 if (to) {
3498 inet->has_to = true;
3497 inet->to = to + 5900;
3499 inet->to = to + offset;
3498 }
3499 }
3500
3501 inet->ipv4 = ipv4;
3502 inet->has_ipv4 = has_ipv4;
3503 inet->ipv6 = ipv6;
3504 inet->has_ipv6 = has_ipv6;
3505

--- 5 unchanged lines hidden (view full) ---

3511 cleanup:
3512 if (ret < 0) {
3513 qapi_free_SocketAddress(addr);
3514 }
3515 return ret;
3516}
3517
3518static int vnc_display_get_addresses(QemuOpts *opts,
3500 }
3501 }
3502
3503 inet->ipv4 = ipv4;
3504 inet->has_ipv4 = has_ipv4;
3505 inet->ipv6 = ipv6;
3506 inet->has_ipv6 = has_ipv6;
3507

--- 5 unchanged lines hidden (view full) ---

3513 cleanup:
3514 if (ret < 0) {
3515 qapi_free_SocketAddress(addr);
3516 }
3517 return ret;
3518}
3519
3520static int vnc_display_get_addresses(QemuOpts *opts,
3521 bool reverse,
3519 SocketAddress ***retsaddr,
3520 size_t *retnsaddr,
3521 SocketAddress ***retwsaddr,
3522 size_t *retnwsaddr,
3523 Error **errp)
3524{
3525 SocketAddress *saddr = NULL;
3526 SocketAddress *wsaddr = NULL;

--- 23 unchanged lines hidden (view full) ---

3550 error_setg(errp,
3551 "SHA1 hash support is required for websockets");
3552 goto cleanup;
3553 }
3554
3555 qemu_opt_iter_init(&addriter, opts, "vnc");
3556 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3557 int rv;
3522 SocketAddress ***retsaddr,
3523 size_t *retnsaddr,
3524 SocketAddress ***retwsaddr,
3525 size_t *retnwsaddr,
3526 Error **errp)
3527{
3528 SocketAddress *saddr = NULL;
3529 SocketAddress *wsaddr = NULL;

--- 23 unchanged lines hidden (view full) ---

3553 error_setg(errp,
3554 "SHA1 hash support is required for websockets");
3555 goto cleanup;
3556 }
3557
3558 qemu_opt_iter_init(&addriter, opts, "vnc");
3559 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3560 int rv;
3558 rv = vnc_display_get_address(addr, false, 0, to,
3561 rv = vnc_display_get_address(addr, false, reverse, 0, to,
3559 has_ipv4, has_ipv6,
3560 ipv4, ipv6,
3561 &saddr, errp);
3562 if (rv < 0) {
3563 goto cleanup;
3564 }
3565 /* Historical compat - first listen address can be used
3566 * to set the default websocket port

--- 8 unchanged lines hidden (view full) ---

3575 /* If we had multiple primary displays, we don't do defaults
3576 * for websocket, and require explicit config instead. */
3577 if (*retnsaddr > 1) {
3578 displaynum = -1;
3579 }
3580
3581 qemu_opt_iter_init(&addriter, opts, "websocket");
3582 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3562 has_ipv4, has_ipv6,
3563 ipv4, ipv6,
3564 &saddr, errp);
3565 if (rv < 0) {
3566 goto cleanup;
3567 }
3568 /* Historical compat - first listen address can be used
3569 * to set the default websocket port

--- 8 unchanged lines hidden (view full) ---

3578 /* If we had multiple primary displays, we don't do defaults
3579 * for websocket, and require explicit config instead. */
3580 if (*retnsaddr > 1) {
3581 displaynum = -1;
3582 }
3583
3584 qemu_opt_iter_init(&addriter, opts, "websocket");
3585 while ((addr = qemu_opt_iter_next(&addriter)) != NULL) {
3583 if (vnc_display_get_address(addr, true, displaynum, to,
3586 if (vnc_display_get_address(addr, true, reverse, displaynum, to,
3584 has_ipv4, has_ipv6,
3585 ipv4, ipv6,
3586 &wsaddr, errp) < 0) {
3587 goto cleanup;
3588 }
3589
3590 /* Historical compat - if only a single listen address was
3591 * provided, then this is used to set the default listen

--- 180 unchanged lines hidden (view full) ---

3772 return;
3773 }
3774 vnc_display_close(vd);
3775
3776 if (!opts) {
3777 return;
3778 }
3779
3587 has_ipv4, has_ipv6,
3588 ipv4, ipv6,
3589 &wsaddr, errp) < 0) {
3590 goto cleanup;
3591 }
3592
3593 /* Historical compat - if only a single listen address was
3594 * provided, then this is used to set the default listen

--- 180 unchanged lines hidden (view full) ---

3775 return;
3776 }
3777 vnc_display_close(vd);
3778
3779 if (!opts) {
3780 return;
3781 }
3782
3780 if (vnc_display_get_addresses(opts, &saddr, &nsaddr,
3783 reverse = qemu_opt_get_bool(opts, "reverse", false);
3784 if (vnc_display_get_addresses(opts, reverse, &saddr, &nsaddr,
3781 &wsaddr, &nwsaddr, errp) < 0) {
3782 goto fail;
3783 }
3784
3785 if (saddr == NULL) {
3786 return;
3787 }
3788

--- 9 unchanged lines hidden (view full) ---

3798 if (!qcrypto_cipher_supports(
3799 QCRYPTO_CIPHER_ALG_DES_RFB, QCRYPTO_CIPHER_MODE_ECB)) {
3800 error_setg(errp,
3801 "Cipher backend does not support DES RFB algorithm");
3802 goto fail;
3803 }
3804 }
3805
3785 &wsaddr, &nwsaddr, errp) < 0) {
3786 goto fail;
3787 }
3788
3789 if (saddr == NULL) {
3790 return;
3791 }
3792

--- 9 unchanged lines hidden (view full) ---

3802 if (!qcrypto_cipher_supports(
3803 QCRYPTO_CIPHER_ALG_DES_RFB, QCRYPTO_CIPHER_MODE_ECB)) {
3804 error_setg(errp,
3805 "Cipher backend does not support DES RFB algorithm");
3806 goto fail;
3807 }
3808 }
3809
3806 reverse = qemu_opt_get_bool(opts, "reverse", false);
3807 lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
3808 key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 1);
3809 sasl = qemu_opt_get_bool(opts, "sasl", false);
3810#ifndef CONFIG_VNC_SASL
3811 if (sasl) {
3812 error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
3813 goto fail;
3814 }

--- 255 unchanged lines hidden ---
3810 lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
3811 key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 1);
3812 sasl = qemu_opt_get_bool(opts, "sasl", false);
3813#ifndef CONFIG_VNC_SASL
3814 if (sasl) {
3815 error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
3816 goto fail;
3817 }

--- 255 unchanged lines hidden ---