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