1 # -*- Mode: Python -*- 2 # vim: filetype=python 3 # 4 5 ## 6 # = Character devices 7 ## 8 9 { 'include': 'sockets.json' } 10 11 ## 12 # @ChardevInfo: 13 # 14 # Information about a character device. 15 # 16 # @label: the label of the character device 17 # 18 # @filename: the filename of the character device 19 # 20 # @frontend-open: shows whether the frontend device attached to this 21 # backend (e.g. with the chardev=... option) is in open or closed 22 # state (since 2.1) 23 # 24 # Notes: @filename is encoded using the QEMU command line character 25 # device encoding. See the QEMU man page for details. 26 # 27 # Since: 0.14 28 ## 29 { 'struct': 'ChardevInfo', 30 'data': { 'label': 'str', 31 'filename': 'str', 32 'frontend-open': 'bool' } } 33 34 ## 35 # @query-chardev: 36 # 37 # Returns information about current character devices. 38 # 39 # Returns: a list of @ChardevInfo 40 # 41 # Since: 0.14 42 # 43 # Example: 44 # 45 # -> { "execute": "query-chardev" } 46 # <- { 47 # "return": [ 48 # { 49 # "label": "charchannel0", 50 # "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server=on", 51 # "frontend-open": false 52 # }, 53 # { 54 # "label": "charmonitor", 55 # "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server=on", 56 # "frontend-open": true 57 # }, 58 # { 59 # "label": "charserial0", 60 # "filename": "pty:/dev/pts/2", 61 # "frontend-open": true 62 # } 63 # ] 64 # } 65 ## 66 { 'command': 'query-chardev', 'returns': ['ChardevInfo'], 67 'allow-preconfig': true } 68 69 ## 70 # @ChardevBackendInfo: 71 # 72 # Information about a character device backend 73 # 74 # @name: The backend name 75 # 76 # Since: 2.0 77 ## 78 { 'struct': 'ChardevBackendInfo', 'data': {'name': 'str'} } 79 80 ## 81 # @query-chardev-backends: 82 # 83 # Returns information about character device backends. 84 # 85 # Returns: a list of @ChardevBackendInfo 86 # 87 # Since: 2.0 88 # 89 # Example: 90 # 91 # -> { "execute": "query-chardev-backends" } 92 # <- { 93 # "return":[ 94 # { 95 # "name":"udp" 96 # }, 97 # { 98 # "name":"tcp" 99 # }, 100 # { 101 # "name":"unix" 102 # }, 103 # { 104 # "name":"spiceport" 105 # } 106 # ] 107 # } 108 ## 109 { 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] } 110 111 ## 112 # @DataFormat: 113 # 114 # An enumeration of data format. 115 # 116 # @utf8: Data is a UTF-8 string (RFC 3629) 117 # 118 # @base64: Data is Base64 encoded binary (RFC 3548) 119 # 120 # Since: 1.4 121 ## 122 { 'enum': 'DataFormat', 123 'data': [ 'utf8', 'base64' ] } 124 125 ## 126 # @ringbuf-write: 127 # 128 # Write to a ring buffer character device. 129 # 130 # @device: the ring buffer character device name 131 # 132 # @data: data to write 133 # 134 # @format: data encoding (default 'utf8'). 135 # 136 # - base64: data must be base64 encoded text. Its binary decoding 137 # gets written. 138 # - utf8: data's UTF-8 encoding is written 139 # - data itself is always Unicode regardless of format, like any 140 # other string. 141 # 142 # Returns: Nothing on success 143 # 144 # Since: 1.4 145 # 146 # Example: 147 # 148 # -> { "execute": "ringbuf-write", 149 # "arguments": { "device": "foo", 150 # "data": "abcdefgh", 151 # "format": "utf8" } } 152 # <- { "return": {} } 153 ## 154 { 'command': 'ringbuf-write', 155 'data': { 'device': 'str', 156 'data': 'str', 157 '*format': 'DataFormat'} } 158 159 ## 160 # @ringbuf-read: 161 # 162 # Read from a ring buffer character device. 163 # 164 # @device: the ring buffer character device name 165 # 166 # @size: how many bytes to read at most 167 # 168 # @format: data encoding (default 'utf8'). 169 # 170 # - base64: the data read is returned in base64 encoding. 171 # - utf8: the data read is interpreted as UTF-8. 172 # Bug: can screw up when the buffer contains invalid UTF-8 173 # sequences, NUL characters, after the ring buffer lost data, 174 # and when reading stops because the size limit is reached. 175 # - The return value is always Unicode regardless of format, like 176 # any other string. 177 # 178 # Returns: data read from the device 179 # 180 # Since: 1.4 181 # 182 # Example: 183 # 184 # -> { "execute": "ringbuf-read", 185 # "arguments": { "device": "foo", 186 # "size": 1000, 187 # "format": "utf8" } } 188 # <- { "return": "abcdefgh" } 189 ## 190 { 'command': 'ringbuf-read', 191 'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'}, 192 'returns': 'str' } 193 194 ## 195 # @ChardevCommon: 196 # 197 # Configuration shared across all chardev backends 198 # 199 # @logfile: The name of a logfile to save output 200 # 201 # @logappend: true to append instead of truncate (default to false to 202 # truncate) 203 # 204 # Since: 2.6 205 ## 206 { 'struct': 'ChardevCommon', 207 'data': { '*logfile': 'str', 208 '*logappend': 'bool' } } 209 210 ## 211 # @ChardevFile: 212 # 213 # Configuration info for file chardevs. 214 # 215 # @in: The name of the input file 216 # 217 # @out: The name of the output file 218 # 219 # @append: Open the file in append mode (default false to truncate) 220 # (Since 2.6) 221 # 222 # Since: 1.4 223 ## 224 { 'struct': 'ChardevFile', 225 'data': { '*in': 'str', 226 'out': 'str', 227 '*append': 'bool' }, 228 'base': 'ChardevCommon' } 229 230 ## 231 # @ChardevHostdev: 232 # 233 # Configuration info for device and pipe chardevs. 234 # 235 # @device: The name of the special file for the device, i.e. 236 # /dev/ttyS0 on Unix or COM1: on Windows 237 # 238 # Since: 1.4 239 ## 240 { 'struct': 'ChardevHostdev', 241 'data': { 'device': 'str' }, 242 'base': 'ChardevCommon' } 243 244 ## 245 # @ChardevSocket: 246 # 247 # Configuration info for (stream) socket chardevs. 248 # 249 # @addr: socket address to listen on (server=true) or connect to 250 # (server=false) 251 # 252 # @tls-creds: the ID of the TLS credentials object (since 2.6) 253 # 254 # @tls-authz: the ID of the QAuthZ authorization object against which 255 # the client's x509 distinguished name will be validated. This 256 # object is only resolved at time of use, so can be deleted and 257 # recreated on the fly while the chardev server is active. If 258 # missing, it will default to denying access (since 4.0) 259 # 260 # @server: create server socket (default: true) 261 # 262 # @wait: wait for incoming connection on server sockets (default: 263 # false). Silently ignored with server: false. This use is 264 # deprecated. 265 # 266 # @nodelay: set TCP_NODELAY socket option (default: false) 267 # 268 # @telnet: enable telnet protocol on server sockets (default: false) 269 # 270 # @tn3270: enable tn3270 protocol on server sockets (default: false) 271 # (Since: 2.10) 272 # 273 # @websocket: enable websocket protocol on server sockets 274 # (default: false) (Since: 3.1) 275 # 276 # @reconnect: For a client socket, if a socket is disconnected, then 277 # attempt a reconnect after the given number of seconds. Setting 278 # this to zero disables this function. (default: 0) (Since: 2.2) 279 # 280 # Since: 1.4 281 ## 282 { 'struct': 'ChardevSocket', 283 'data': { 'addr': 'SocketAddressLegacy', 284 '*tls-creds': 'str', 285 '*tls-authz' : 'str', 286 '*server': 'bool', 287 '*wait': 'bool', 288 '*nodelay': 'bool', 289 '*telnet': 'bool', 290 '*tn3270': 'bool', 291 '*websocket': 'bool', 292 '*reconnect': 'int' }, 293 'base': 'ChardevCommon' } 294 295 ## 296 # @ChardevUdp: 297 # 298 # Configuration info for datagram socket chardevs. 299 # 300 # @remote: remote address 301 # 302 # @local: local address 303 # 304 # Since: 1.5 305 ## 306 { 'struct': 'ChardevUdp', 307 'data': { 'remote': 'SocketAddressLegacy', 308 '*local': 'SocketAddressLegacy' }, 309 'base': 'ChardevCommon' } 310 311 ## 312 # @ChardevMux: 313 # 314 # Configuration info for mux chardevs. 315 # 316 # @chardev: name of the base chardev. 317 # 318 # Since: 1.5 319 ## 320 { 'struct': 'ChardevMux', 321 'data': { 'chardev': 'str' }, 322 'base': 'ChardevCommon' } 323 324 ## 325 # @ChardevStdio: 326 # 327 # Configuration info for stdio chardevs. 328 # 329 # @signal: Allow signals (such as SIGINT triggered by ^C) be delivered 330 # to qemu. Default: true. 331 # 332 # Since: 1.5 333 ## 334 { 'struct': 'ChardevStdio', 335 'data': { '*signal': 'bool' }, 336 'base': 'ChardevCommon' } 337 338 ## 339 # @ChardevSpiceChannel: 340 # 341 # Configuration info for spice vm channel chardevs. 342 # 343 # @type: kind of channel (for example vdagent). 344 # 345 # Since: 1.5 346 ## 347 { 'struct': 'ChardevSpiceChannel', 348 'data': { 'type': 'str' }, 349 'base': 'ChardevCommon', 350 'if': 'CONFIG_SPICE' } 351 352 ## 353 # @ChardevSpicePort: 354 # 355 # Configuration info for spice port chardevs. 356 # 357 # @fqdn: name of the channel (see docs/spice-port-fqdn.txt) 358 # 359 # Since: 1.5 360 ## 361 { 'struct': 'ChardevSpicePort', 362 'data': { 'fqdn': 'str' }, 363 'base': 'ChardevCommon', 364 'if': 'CONFIG_SPICE' } 365 366 ## 367 # @ChardevDBus: 368 # 369 # Configuration info for DBus chardevs. 370 # 371 # @name: name of the channel (following docs/spice-port-fqdn.txt) 372 # 373 # Since: 7.0 374 ## 375 { 'struct': 'ChardevDBus', 376 'data': { 'name': 'str' }, 377 'base': 'ChardevCommon', 378 'if': 'CONFIG_DBUS_DISPLAY' } 379 380 ## 381 # @ChardevVC: 382 # 383 # Configuration info for virtual console chardevs. 384 # 385 # @width: console width, in pixels 386 # 387 # @height: console height, in pixels 388 # 389 # @cols: console width, in chars 390 # 391 # @rows: console height, in chars 392 # 393 # Note: the options are only effective when the VNC or SDL graphical 394 # display backend is active. They are ignored with the GTK, 395 # Spice, VNC and D-Bus display backends. 396 # 397 # Since: 1.5 398 ## 399 { 'struct': 'ChardevVC', 400 'data': { '*width': 'int', 401 '*height': 'int', 402 '*cols': 'int', 403 '*rows': 'int' }, 404 'base': 'ChardevCommon' } 405 406 ## 407 # @ChardevRingbuf: 408 # 409 # Configuration info for ring buffer chardevs. 410 # 411 # @size: ring buffer size, must be power of two, default is 65536 412 # 413 # Since: 1.5 414 ## 415 { 'struct': 'ChardevRingbuf', 416 'data': { '*size': 'int' }, 417 'base': 'ChardevCommon' } 418 419 ## 420 # @ChardevQemuVDAgent: 421 # 422 # Configuration info for qemu vdagent implementation. 423 # 424 # @mouse: enable/disable mouse, default is enabled. 425 # 426 # @clipboard: enable/disable clipboard, default is disabled. 427 # 428 # Since: 6.1 429 ## 430 { 'struct': 'ChardevQemuVDAgent', 431 'data': { '*mouse': 'bool', 432 '*clipboard': 'bool' }, 433 'base': 'ChardevCommon', 434 'if': 'CONFIG_SPICE_PROTOCOL' } 435 436 ## 437 # @ChardevBackendKind: 438 # 439 # @pipe: Since 1.5 440 # 441 # @udp: Since 1.5 442 # 443 # @mux: Since 1.5 444 # 445 # @msmouse: Since 1.5 446 # 447 # @wctablet: Since 2.9 448 # 449 # @braille: Since 1.5 450 # 451 # @testdev: Since 2.2 452 # 453 # @stdio: Since 1.5 454 # 455 # @console: Since 1.5 456 # 457 # @spicevmc: Since 1.5 458 # 459 # @spiceport: Since 1.5 460 # 461 # @qemu-vdagent: Since 6.1 462 # 463 # @dbus: Since 7.0 464 # 465 # @vc: v1.5 466 # 467 # @ringbuf: Since 1.6 468 # 469 # @memory: Since 1.5 470 # 471 # Features: 472 # 473 # @deprecated: Member @memory is deprecated. Use @ringbuf instead. 474 # 475 # Since: 1.4 476 ## 477 { 'enum': 'ChardevBackendKind', 478 'data': [ 'file', 479 { 'name': 'serial', 'if': 'HAVE_CHARDEV_SERIAL' }, 480 { 'name': 'parallel', 'if': 'HAVE_CHARDEV_PARALLEL' }, 481 'pipe', 482 'socket', 483 'udp', 484 'pty', 485 'null', 486 'mux', 487 'msmouse', 488 'wctablet', 489 { 'name': 'braille', 'if': 'CONFIG_BRLAPI' }, 490 'testdev', 491 'stdio', 492 { 'name': 'console', 'if': 'CONFIG_WIN32' }, 493 { 'name': 'spicevmc', 'if': 'CONFIG_SPICE' }, 494 { 'name': 'spiceport', 'if': 'CONFIG_SPICE' }, 495 { 'name': 'qemu-vdagent', 'if': 'CONFIG_SPICE_PROTOCOL' }, 496 { 'name': 'dbus', 'if': 'CONFIG_DBUS_DISPLAY' }, 497 'vc', 498 'ringbuf', 499 { 'name': 'memory', 'features': [ 'deprecated' ] } ] } 500 501 ## 502 # @ChardevFileWrapper: 503 # 504 # @data: Configuration info for file chardevs 505 # 506 # Since: 1.4 507 ## 508 { 'struct': 'ChardevFileWrapper', 509 'data': { 'data': 'ChardevFile' } } 510 511 ## 512 # @ChardevHostdevWrapper: 513 # 514 # @data: Configuration info for device and pipe chardevs 515 # 516 # Since: 1.4 517 ## 518 { 'struct': 'ChardevHostdevWrapper', 519 'data': { 'data': 'ChardevHostdev' } } 520 521 ## 522 # @ChardevSocketWrapper: 523 # 524 # @data: Configuration info for (stream) socket chardevs 525 # 526 # Since: 1.4 527 ## 528 { 'struct': 'ChardevSocketWrapper', 529 'data': { 'data': 'ChardevSocket' } } 530 531 ## 532 # @ChardevUdpWrapper: 533 # 534 # @data: Configuration info for datagram socket chardevs 535 # 536 # Since: 1.5 537 ## 538 { 'struct': 'ChardevUdpWrapper', 539 'data': { 'data': 'ChardevUdp' } } 540 541 ## 542 # @ChardevCommonWrapper: 543 # 544 # @data: Configuration shared across all chardev backends 545 # 546 # Since: 2.6 547 ## 548 { 'struct': 'ChardevCommonWrapper', 549 'data': { 'data': 'ChardevCommon' } } 550 551 ## 552 # @ChardevMuxWrapper: 553 # 554 # @data: Configuration info for mux chardevs 555 # 556 # Since: 1.5 557 ## 558 { 'struct': 'ChardevMuxWrapper', 559 'data': { 'data': 'ChardevMux' } } 560 561 ## 562 # @ChardevStdioWrapper: 563 # 564 # @data: Configuration info for stdio chardevs 565 # 566 # Since: 1.5 567 ## 568 { 'struct': 'ChardevStdioWrapper', 569 'data': { 'data': 'ChardevStdio' } } 570 571 ## 572 # @ChardevSpiceChannelWrapper: 573 # 574 # @data: Configuration info for spice vm channel chardevs 575 # 576 # Since: 1.5 577 ## 578 { 'struct': 'ChardevSpiceChannelWrapper', 579 'data': { 'data': 'ChardevSpiceChannel' }, 580 'if': 'CONFIG_SPICE' } 581 582 ## 583 # @ChardevSpicePortWrapper: 584 # 585 # @data: Configuration info for spice port chardevs 586 # 587 # Since: 1.5 588 ## 589 { 'struct': 'ChardevSpicePortWrapper', 590 'data': { 'data': 'ChardevSpicePort' }, 591 'if': 'CONFIG_SPICE' } 592 593 ## 594 # @ChardevQemuVDAgentWrapper: 595 # 596 # @data: Configuration info for qemu vdagent implementation 597 # 598 # Since: 6.1 599 ## 600 { 'struct': 'ChardevQemuVDAgentWrapper', 601 'data': { 'data': 'ChardevQemuVDAgent' }, 602 'if': 'CONFIG_SPICE_PROTOCOL' } 603 604 ## 605 # @ChardevDBusWrapper: 606 # 607 # @data: Configuration info for DBus chardevs 608 # 609 # Since: 7.0 610 ## 611 { 'struct': 'ChardevDBusWrapper', 612 'data': { 'data': 'ChardevDBus' }, 613 'if': 'CONFIG_DBUS_DISPLAY' } 614 615 ## 616 # @ChardevVCWrapper: 617 # 618 # @data: Configuration info for virtual console chardevs 619 # 620 # Since: 1.5 621 ## 622 { 'struct': 'ChardevVCWrapper', 623 'data': { 'data': 'ChardevVC' } } 624 625 ## 626 # @ChardevRingbufWrapper: 627 # 628 # @data: Configuration info for ring buffer chardevs 629 # 630 # Since: 1.5 631 ## 632 { 'struct': 'ChardevRingbufWrapper', 633 'data': { 'data': 'ChardevRingbuf' } } 634 635 ## 636 # @ChardevBackend: 637 # 638 # Configuration info for the new chardev backend. 639 # 640 # @type: backend type 641 # 642 # Since: 1.4 643 ## 644 { 'union': 'ChardevBackend', 645 'base': { 'type': 'ChardevBackendKind' }, 646 'discriminator': 'type', 647 'data': { 'file': 'ChardevFileWrapper', 648 'serial': { 'type': 'ChardevHostdevWrapper', 649 'if': 'HAVE_CHARDEV_SERIAL' }, 650 'parallel': { 'type': 'ChardevHostdevWrapper', 651 'if': 'HAVE_CHARDEV_PARALLEL' }, 652 'pipe': 'ChardevHostdevWrapper', 653 'socket': 'ChardevSocketWrapper', 654 'udp': 'ChardevUdpWrapper', 655 'pty': 'ChardevCommonWrapper', 656 'null': 'ChardevCommonWrapper', 657 'mux': 'ChardevMuxWrapper', 658 'msmouse': 'ChardevCommonWrapper', 659 'wctablet': 'ChardevCommonWrapper', 660 'braille': { 'type': 'ChardevCommonWrapper', 661 'if': 'CONFIG_BRLAPI' }, 662 'testdev': 'ChardevCommonWrapper', 663 'stdio': 'ChardevStdioWrapper', 664 'console': { 'type': 'ChardevCommonWrapper', 665 'if': 'CONFIG_WIN32' }, 666 'spicevmc': { 'type': 'ChardevSpiceChannelWrapper', 667 'if': 'CONFIG_SPICE' }, 668 'spiceport': { 'type': 'ChardevSpicePortWrapper', 669 'if': 'CONFIG_SPICE' }, 670 'qemu-vdagent': { 'type': 'ChardevQemuVDAgentWrapper', 671 'if': 'CONFIG_SPICE_PROTOCOL' }, 672 'dbus': { 'type': 'ChardevDBusWrapper', 673 'if': 'CONFIG_DBUS_DISPLAY' }, 674 'vc': 'ChardevVCWrapper', 675 'ringbuf': 'ChardevRingbufWrapper', 676 'memory': 'ChardevRingbufWrapper' } } 677 678 ## 679 # @ChardevReturn: 680 # 681 # Return info about the chardev backend just created. 682 # 683 # @pty: name of the slave pseudoterminal device, present if and only 684 # if a chardev of type 'pty' was created 685 # 686 # Since: 1.4 687 ## 688 { 'struct' : 'ChardevReturn', 689 'data': { '*pty': 'str' } } 690 691 ## 692 # @chardev-add: 693 # 694 # Add a character device backend 695 # 696 # @id: the chardev's ID, must be unique 697 # 698 # @backend: backend type and parameters 699 # 700 # Returns: ChardevReturn. 701 # 702 # Since: 1.4 703 # 704 # Examples: 705 # 706 # -> { "execute" : "chardev-add", 707 # "arguments" : { "id" : "foo", 708 # "backend" : { "type" : "null", "data" : {} } } } 709 # <- { "return": {} } 710 # 711 # -> { "execute" : "chardev-add", 712 # "arguments" : { "id" : "bar", 713 # "backend" : { "type" : "file", 714 # "data" : { "out" : "/tmp/bar.log" } } } } 715 # <- { "return": {} } 716 # 717 # -> { "execute" : "chardev-add", 718 # "arguments" : { "id" : "baz", 719 # "backend" : { "type" : "pty", "data" : {} } } } 720 # <- { "return": { "pty" : "/dev/pty/42" } } 721 ## 722 { 'command': 'chardev-add', 723 'data': { 'id': 'str', 724 'backend': 'ChardevBackend' }, 725 'returns': 'ChardevReturn' } 726 727 ## 728 # @chardev-change: 729 # 730 # Change a character device backend 731 # 732 # @id: the chardev's ID, must exist 733 # 734 # @backend: new backend type and parameters 735 # 736 # Returns: ChardevReturn. 737 # 738 # Since: 2.10 739 # 740 # Examples: 741 # 742 # -> { "execute" : "chardev-change", 743 # "arguments" : { "id" : "baz", 744 # "backend" : { "type" : "pty", "data" : {} } } } 745 # <- { "return": { "pty" : "/dev/pty/42" } } 746 # 747 # -> {"execute" : "chardev-change", 748 # "arguments" : { 749 # "id" : "charchannel2", 750 # "backend" : { 751 # "type" : "socket", 752 # "data" : { 753 # "addr" : { 754 # "type" : "unix" , 755 # "data" : { 756 # "path" : "/tmp/charchannel2.socket" 757 # } 758 # }, 759 # "server" : true, 760 # "wait" : false }}}} 761 # <- {"return": {}} 762 ## 763 { 'command': 'chardev-change', 764 'data': { 'id': 'str', 765 'backend': 'ChardevBackend' }, 766 'returns': 'ChardevReturn' } 767 768 ## 769 # @chardev-remove: 770 # 771 # Remove a character device backend 772 # 773 # @id: the chardev's ID, must exist and not be in use 774 # 775 # Returns: Nothing on success 776 # 777 # Since: 1.4 778 # 779 # Example: 780 # 781 # -> { "execute": "chardev-remove", "arguments": { "id" : "foo" } } 782 # <- { "return": {} } 783 ## 784 { 'command': 'chardev-remove', 785 'data': { 'id': 'str' } } 786 787 ## 788 # @chardev-send-break: 789 # 790 # Send a break to a character device 791 # 792 # @id: the chardev's ID, must exist 793 # 794 # Returns: Nothing on success 795 # 796 # Since: 2.10 797 # 798 # Example: 799 # 800 # -> { "execute": "chardev-send-break", "arguments": { "id" : "foo" } } 801 # <- { "return": {} } 802 ## 803 { 'command': 'chardev-send-break', 804 'data': { 'id': 'str' } } 805 806 ## 807 # @VSERPORT_CHANGE: 808 # 809 # Emitted when the guest opens or closes a virtio-serial port. 810 # 811 # @id: device identifier of the virtio-serial port 812 # 813 # @open: true if the guest has opened the virtio-serial port 814 # 815 # Note: This event is rate-limited. 816 # 817 # Since: 2.1 818 # 819 # Example: 820 # 821 # <- { "event": "VSERPORT_CHANGE", 822 # "data": { "id": "channel0", "open": true }, 823 # "timestamp": { "seconds": 1401385907, "microseconds": 422329 } } 824 ## 825 { 'event': 'VSERPORT_CHANGE', 826 'data': { 'id': 'str', 827 'open': 'bool' } } 828