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