{"id":808797,"url":"http://patchwork.ozlabs.org/api/patches/808797/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901153758.8628-22-armbru@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170901153758.8628-22-armbru@redhat.com>","list_archive_url":null,"date":"2017-09-01T15:37:32","name":"[PULL,v2,21/47] qapi-schema: Collect char device stuff in qapi/char.json","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"9b29ff10d06715c1fdaea46f836cec795558963b","submitter":{"id":2645,"url":"http://patchwork.ozlabs.org/api/people/2645/?format=json","name":"Markus Armbruster","email":"armbru@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901153758.8628-22-armbru@redhat.com/mbox/","series":[{"id":1049,"url":"http://patchwork.ozlabs.org/api/series/1049/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1049","date":"2017-09-01T15:37:14","name":"[PULL,v2,01/47] qapi: Fix error handling code on alternate conflict","version":2,"mbox":"http://patchwork.ozlabs.org/series/1049/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/808797/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/808797/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=208.118.235.17; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=armbru@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [208.118.235.17])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkPb15zm4z9t1t\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat,  2 Sep 2017 02:19:41 +1000 (AEST)","from localhost ([::1]:47233 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnofT-0005cJ-Lj\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 12:19:39 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:51779)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <armbru@redhat.com>) id 1dno1W-0006nK-EO\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:28 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <armbru@redhat.com>) id 1dno1P-0001mv-1e\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:22 -0400","from mx1.redhat.com ([209.132.183.28]:56688)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <armbru@redhat.com>) id 1dno1O-0001lr-HU\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:14 -0400","from smtp.corp.redhat.com\n\t(int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 9BF851E31B\n\tfor <qemu-devel@nongnu.org>; Fri,  1 Sep 2017 15:38:13 +0000 (UTC)","from blackfin.pond.sub.org (ovpn-116-75.ams2.redhat.com\n\t[10.36.116.75])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 09D6E7837B;\n\tFri,  1 Sep 2017 15:38:09 +0000 (UTC)","by blackfin.pond.sub.org (Postfix, from userid 1000)\n\tid 8011F1138559; Fri,  1 Sep 2017 17:37:58 +0200 (CEST)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 9BF851E31B","From":"Markus Armbruster <armbru@redhat.com>","To":"qemu-devel@nongnu.org","Date":"Fri,  1 Sep 2017 17:37:32 +0200","Message-Id":"<20170901153758.8628-22-armbru@redhat.com>","In-Reply-To":"<20170901153758.8628-1-armbru@redhat.com>","References":"<20170901153758.8628-1-armbru@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.13","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.30]);\n\tFri, 01 Sep 2017 15:38:13 +0000 (UTC)","Content-Transfer-Encoding":"quoted-printable","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PULL v2 21/47] qapi-schema: Collect char device stuff\n\tin qapi/char.json","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Paolo Bonzini <pbonzini@redhat.com>, =?utf-8?q?Marc-Andr=C3=A9_Lureau?=\n\t<marcandre.lureau@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"Cc: Paolo Bonzini <pbonzini@redhat.com>\nCc: Marc-André Lureau <marcandre.lureau@redhat.com>\nSigned-off-by: Markus Armbruster <armbru@redhat.com>\nMessage-Id: <1503602048-12268-7-git-send-email-armbru@redhat.com>\nReviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\n MAINTAINERS      |   1 +\n Makefile         |   1 +\n qapi-schema.json | 511 +---------------------------------------------------\n qapi/char.json   | 538 +++++++++++++++++++++++++++++++++++++++++++++++++++++++\n qapi/event.json  |  21 ---\n 5 files changed, 541 insertions(+), 531 deletions(-)\n create mode 100644 qapi/char.json","diff":"diff --git a/MAINTAINERS b/MAINTAINERS\nindex 289ea8c575..6a808d33ba 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1253,6 +1253,7 @@ M: Marc-André Lureau <marcandre.lureau@redhat.com>\n S: Maintained\n F: chardev/\n F: include/chardev/\n+F: qapi/char.json\n \n Character Devices (Braille)\n M: Samuel Thibault <samuel.thibault@ens-lyon.org>\ndiff --git a/Makefile b/Makefile\nindex d3ba41afb8..59ef46cc3e 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -410,6 +410,7 @@ $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)\n \n qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \\\n                $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \\\n+               $(SRC_PATH)/qapi/char.json \\\n                $(SRC_PATH)/qapi/crypto.json \\\n                $(SRC_PATH)/qapi/event.json $(SRC_PATH)/qapi/introspect.json \\\n                $(SRC_PATH)/qapi/rocker.json \\\ndiff --git a/qapi-schema.json b/qapi-schema.json\nindex f42d61b664..4f30d21340 100644\n--- a/qapi-schema.json\n+++ b/qapi-schema.json\n@@ -83,6 +83,7 @@\n { 'include': 'qapi/run-state.json' }\n { 'include': 'qapi/crypto.json' }\n { 'include': 'qapi/block.json' }\n+{ 'include': 'qapi/char.json' }\n { 'include': 'qapi/rocker.json' }\n { 'include': 'qapi/event.json' }\n { 'include': 'qapi/trace.json' }\n@@ -274,189 +275,6 @@\n { 'command': 'query-uuid', 'returns': 'UuidInfo' }\n \n ##\n-# @ChardevInfo:\n-#\n-# Information about a character device.\n-#\n-# @label: the label of the character device\n-#\n-# @filename: the filename of the character device\n-#\n-# @frontend-open: shows whether the frontend device attached to this backend\n-#                 (eg. with the chardev=... option) is in open or closed state\n-#                 (since 2.1)\n-#\n-# Notes: @filename is encoded using the QEMU command line character device\n-#        encoding.  See the QEMU man page for details.\n-#\n-# Since: 0.14.0\n-##\n-{ 'struct': 'ChardevInfo', 'data': {'label': 'str',\n-                                  'filename': 'str',\n-                                  'frontend-open': 'bool'} }\n-\n-##\n-# @query-chardev:\n-#\n-# Returns information about current character devices.\n-#\n-# Returns: a list of @ChardevInfo\n-#\n-# Since: 0.14.0\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"query-chardev\" }\n-# <- {\n-#       \"return\": [\n-#          {\n-#             \"label\": \"charchannel0\",\n-#             \"filename\": \"unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server\",\n-#             \"frontend-open\": false\n-#          },\n-#          {\n-#             \"label\": \"charmonitor\",\n-#             \"filename\": \"unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server\",\n-#             \"frontend-open\": true\n-#          },\n-#          {\n-#             \"label\": \"charserial0\",\n-#             \"filename\": \"pty:/dev/pts/2\",\n-#             \"frontend-open\": true\n-#          }\n-#       ]\n-#    }\n-#\n-##\n-{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] }\n-\n-##\n-# @ChardevBackendInfo:\n-#\n-# Information about a character device backend\n-#\n-# @name: The backend name\n-#\n-# Since: 2.0\n-##\n-{ 'struct': 'ChardevBackendInfo', 'data': {'name': 'str'} }\n-\n-##\n-# @query-chardev-backends:\n-#\n-# Returns information about character device backends.\n-#\n-# Returns: a list of @ChardevBackendInfo\n-#\n-# Since: 2.0\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"query-chardev-backends\" }\n-# <- {\n-#       \"return\":[\n-#          {\n-#             \"name\":\"udp\"\n-#          },\n-#          {\n-#             \"name\":\"tcp\"\n-#          },\n-#          {\n-#             \"name\":\"unix\"\n-#          },\n-#          {\n-#             \"name\":\"spiceport\"\n-#          }\n-#       ]\n-#    }\n-#\n-##\n-{ 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] }\n-\n-##\n-# @DataFormat:\n-#\n-# An enumeration of data format.\n-#\n-# @utf8: Data is a UTF-8 string (RFC 3629)\n-#\n-# @base64: Data is Base64 encoded binary (RFC 3548)\n-#\n-# Since: 1.4\n-##\n-{ 'enum': 'DataFormat',\n-  'data': [ 'utf8', 'base64' ] }\n-\n-##\n-# @ringbuf-write:\n-#\n-# Write to a ring buffer character device.\n-#\n-# @device: the ring buffer character device name\n-#\n-# @data: data to write\n-#\n-# @format: data encoding (default 'utf8').\n-#          - base64: data must be base64 encoded text.  Its binary\n-#            decoding gets written.\n-#          - utf8: data's UTF-8 encoding is written\n-#          - data itself is always Unicode regardless of format, like\n-#            any other string.\n-#\n-# Returns: Nothing on success\n-#\n-# Since: 1.4\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"ringbuf-write\",\n-#      \"arguments\": { \"device\": \"foo\",\n-#                     \"data\": \"abcdefgh\",\n-#                     \"format\": \"utf8\" } }\n-# <- { \"return\": {} }\n-#\n-##\n-{ 'command': 'ringbuf-write',\n-  'data': {'device': 'str', 'data': 'str',\n-           '*format': 'DataFormat'} }\n-\n-##\n-# @ringbuf-read:\n-#\n-# Read from a ring buffer character device.\n-#\n-# @device: the ring buffer character device name\n-#\n-# @size: how many bytes to read at most\n-#\n-# @format: data encoding (default 'utf8').\n-#          - base64: the data read is returned in base64 encoding.\n-#          - utf8: the data read is interpreted as UTF-8.\n-#            Bug: can screw up when the buffer contains invalid UTF-8\n-#            sequences, NUL characters, after the ring buffer lost\n-#            data, and when reading stops because the size limit is\n-#            reached.\n-#          - The return value is always Unicode regardless of format,\n-#            like any other string.\n-#\n-# Returns: data read from the device\n-#\n-# Since: 1.4\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"ringbuf-read\",\n-#      \"arguments\": { \"device\": \"foo\",\n-#                     \"size\": 1000,\n-#                     \"format\": \"utf8\" } }\n-# <- { \"return\": \"abcdefgh\" }\n-#\n-##\n-{ 'command': 'ringbuf-read',\n-  'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},\n-  'returns': 'str' }\n-\n-##\n # @EventInfo:\n #\n # Information about a QMP event\n@@ -4713,333 +4531,6 @@\n \n \n ##\n-# @ChardevCommon:\n-#\n-# Configuration shared across all chardev backends\n-#\n-# @logfile: The name of a logfile to save output\n-# @logappend: true to append instead of truncate\n-#             (default to false to truncate)\n-#\n-# Since: 2.6\n-##\n-{ 'struct': 'ChardevCommon', 'data': { '*logfile': 'str',\n-                                       '*logappend': 'bool' } }\n-\n-##\n-# @ChardevFile:\n-#\n-# Configuration info for file chardevs.\n-#\n-# @in:  The name of the input file\n-# @out: The name of the output file\n-# @append: Open the file in append mode (default false to\n-#          truncate) (Since 2.6)\n-#\n-# Since: 1.4\n-##\n-{ 'struct': 'ChardevFile', 'data': { '*in' : 'str',\n-                                   'out' : 'str',\n-                                   '*append': 'bool' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevHostdev:\n-#\n-# Configuration info for device and pipe chardevs.\n-#\n-# @device: The name of the special file for the device,\n-#          i.e. /dev/ttyS0 on Unix or COM1: on Windows\n-#\n-# Since: 1.4\n-##\n-{ 'struct': 'ChardevHostdev', 'data': { 'device' : 'str' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevSocket:\n-#\n-# Configuration info for (stream) socket chardevs.\n-#\n-# @addr: socket address to listen on (server=true)\n-#        or connect to (server=false)\n-# @tls-creds: the ID of the TLS credentials object (since 2.6)\n-# @server: create server socket (default: true)\n-# @wait: wait for incoming connection on server\n-#        sockets (default: false).\n-# @nodelay: set TCP_NODELAY socket option (default: false)\n-# @telnet: enable telnet protocol on server\n-#          sockets (default: false)\n-# @tn3270: enable tn3270 protocol on server\n-#          sockets (default: false) (Since: 2.10)\n-# @reconnect: For a client socket, if a socket is disconnected,\n-#          then attempt a reconnect after the given number of seconds.\n-#          Setting this to zero disables this function. (default: 0)\n-#          (Since: 2.2)\n-#\n-# Since: 1.4\n-##\n-{ 'struct': 'ChardevSocket', 'data': { 'addr'       : 'SocketAddressLegacy',\n-                                     '*tls-creds'  : 'str',\n-                                     '*server'    : 'bool',\n-                                     '*wait'      : 'bool',\n-                                     '*nodelay'   : 'bool',\n-                                     '*telnet'    : 'bool',\n-                                     '*tn3270'    : 'bool',\n-                                     '*reconnect' : 'int' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevUdp:\n-#\n-# Configuration info for datagram socket chardevs.\n-#\n-# @remote: remote address\n-# @local: local address\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevUdp', 'data': { 'remote' : 'SocketAddressLegacy',\n-                                  '*local' : 'SocketAddressLegacy' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevMux:\n-#\n-# Configuration info for mux chardevs.\n-#\n-# @chardev: name of the base chardev.\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevMux', 'data': { 'chardev' : 'str' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevStdio:\n-#\n-# Configuration info for stdio chardevs.\n-#\n-# @signal: Allow signals (such as SIGINT triggered by ^C)\n-#          be delivered to qemu.  Default: true in -nographic mode,\n-#          false otherwise.\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevStdio', 'data': { '*signal' : 'bool' },\n-  'base': 'ChardevCommon' }\n-\n-\n-##\n-# @ChardevSpiceChannel:\n-#\n-# Configuration info for spice vm channel chardevs.\n-#\n-# @type: kind of channel (for example vdagent).\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevSpiceChannel', 'data': { 'type'  : 'str' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevSpicePort:\n-#\n-# Configuration info for spice port chardevs.\n-#\n-# @fqdn: name of the channel (see docs/spice-port-fqdn.txt)\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevSpicePort', 'data': { 'fqdn'  : 'str' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevVC:\n-#\n-# Configuration info for virtual console chardevs.\n-#\n-# @width:  console width,  in pixels\n-# @height: console height, in pixels\n-# @cols:   console width,  in chars\n-# @rows:   console height, in chars\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevVC', 'data': { '*width'  : 'int',\n-                                 '*height' : 'int',\n-                                 '*cols'   : 'int',\n-                                 '*rows'   : 'int' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevRingbuf:\n-#\n-# Configuration info for ring buffer chardevs.\n-#\n-# @size: ring buffer size, must be power of two, default is 65536\n-#\n-# Since: 1.5\n-##\n-{ 'struct': 'ChardevRingbuf', 'data': { '*size'  : 'int' },\n-  'base': 'ChardevCommon' }\n-\n-##\n-# @ChardevBackend:\n-#\n-# Configuration info for the new chardev backend.\n-#\n-# Since: 1.4 (testdev since 2.2, wctablet since 2.9)\n-##\n-{ 'union': 'ChardevBackend', 'data': { 'file'   : 'ChardevFile',\n-                                       'serial' : 'ChardevHostdev',\n-                                       'parallel': 'ChardevHostdev',\n-                                       'pipe'   : 'ChardevHostdev',\n-                                       'socket' : 'ChardevSocket',\n-                                       'udp'    : 'ChardevUdp',\n-                                       'pty'    : 'ChardevCommon',\n-                                       'null'   : 'ChardevCommon',\n-                                       'mux'    : 'ChardevMux',\n-                                       'msmouse': 'ChardevCommon',\n-                                       'wctablet' : 'ChardevCommon',\n-                                       'braille': 'ChardevCommon',\n-                                       'testdev': 'ChardevCommon',\n-                                       'stdio'  : 'ChardevStdio',\n-                                       'console': 'ChardevCommon',\n-                                       'spicevmc' : 'ChardevSpiceChannel',\n-                                       'spiceport' : 'ChardevSpicePort',\n-                                       'vc'     : 'ChardevVC',\n-                                       'ringbuf': 'ChardevRingbuf',\n-                                       # next one is just for compatibility\n-                                       'memory' : 'ChardevRingbuf' } }\n-\n-##\n-# @ChardevReturn:\n-#\n-# Return info about the chardev backend just created.\n-#\n-# @pty: name of the slave pseudoterminal device, present if\n-#       and only if a chardev of type 'pty' was created\n-#\n-# Since: 1.4\n-##\n-{ 'struct' : 'ChardevReturn', 'data': { '*pty' : 'str' } }\n-\n-##\n-# @chardev-add:\n-#\n-# Add a character device backend\n-#\n-# @id: the chardev's ID, must be unique\n-# @backend: backend type and parameters\n-#\n-# Returns: ChardevReturn.\n-#\n-# Since: 1.4\n-#\n-# Example:\n-#\n-# -> { \"execute\" : \"chardev-add\",\n-#      \"arguments\" : { \"id\" : \"foo\",\n-#                      \"backend\" : { \"type\" : \"null\", \"data\" : {} } } }\n-# <- { \"return\": {} }\n-#\n-# -> { \"execute\" : \"chardev-add\",\n-#      \"arguments\" : { \"id\" : \"bar\",\n-#                      \"backend\" : { \"type\" : \"file\",\n-#                                    \"data\" : { \"out\" : \"/tmp/bar.log\" } } } }\n-# <- { \"return\": {} }\n-#\n-# -> { \"execute\" : \"chardev-add\",\n-#      \"arguments\" : { \"id\" : \"baz\",\n-#                      \"backend\" : { \"type\" : \"pty\", \"data\" : {} } } }\n-# <- { \"return\": { \"pty\" : \"/dev/pty/42\" } }\n-#\n-##\n-{ 'command': 'chardev-add', 'data': {'id'      : 'str',\n-                                     'backend' : 'ChardevBackend' },\n-  'returns': 'ChardevReturn' }\n-\n-##\n-# @chardev-change:\n-#\n-# Change a character device backend\n-#\n-# @id: the chardev's ID, must exist\n-# @backend: new backend type and parameters\n-#\n-# Returns: ChardevReturn.\n-#\n-# Since: 2.10\n-#\n-# Example:\n-#\n-# -> { \"execute\" : \"chardev-change\",\n-#      \"arguments\" : { \"id\" : \"baz\",\n-#                      \"backend\" : { \"type\" : \"pty\", \"data\" : {} } } }\n-# <- { \"return\": { \"pty\" : \"/dev/pty/42\" } }\n-#\n-# -> {\"execute\" : \"chardev-change\",\n-#     \"arguments\" : {\n-#         \"id\" : \"charchannel2\",\n-#         \"backend\" : {\n-#             \"type\" : \"socket\",\n-#             \"data\" : {\n-#                 \"addr\" : {\n-#                     \"type\" : \"unix\" ,\n-#                     \"data\" : {\n-#                         \"path\" : \"/tmp/charchannel2.socket\"\n-#                     }\n-#                  },\n-#                  \"server\" : true,\n-#                  \"wait\" : false }}}}\n-# <- {\"return\": {}}\n-#\n-##\n-{ 'command': 'chardev-change', 'data': {'id'      : 'str',\n-                                        'backend' : 'ChardevBackend' },\n-  'returns': 'ChardevReturn' }\n-\n-##\n-# @chardev-remove:\n-#\n-# Remove a character device backend\n-#\n-# @id: the chardev's ID, must exist and not be in use\n-#\n-# Returns: Nothing on success\n-#\n-# Since: 1.4\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"chardev-remove\", \"arguments\": { \"id\" : \"foo\" } }\n-# <- { \"return\": {} }\n-#\n-##\n-{ 'command': 'chardev-remove', 'data': {'id': 'str'} }\n-\n-##\n-# @chardev-send-break:\n-#\n-# Send a break to a character device\n-#\n-# @id: the chardev's ID, must exist\n-#\n-# Returns: Nothing on success\n-#\n-# Since: 2.10\n-#\n-# Example:\n-#\n-# -> { \"execute\": \"chardev-send-break\", \"arguments\": { \"id\" : \"foo\" } }\n-# <- { \"return\": {} }\n-#\n-##\n-{ 'command': 'chardev-send-break', 'data': {'id': 'str'} }\n-\n-\n-##\n # @TpmModel:\n #\n # An enumeration of TPM models\ndiff --git a/qapi/char.json b/qapi/char.json\nnew file mode 100644\nindex 0000000000..ae19dcd1ed\n--- /dev/null\n+++ b/qapi/char.json\n@@ -0,0 +1,538 @@\n+# -*- Mode: Python -*-\n+#\n+\n+##\n+# = Character devices\n+##\n+\n+{ 'include': 'sockets.json' }\n+\n+##\n+# @ChardevInfo:\n+#\n+# Information about a character device.\n+#\n+# @label: the label of the character device\n+#\n+# @filename: the filename of the character device\n+#\n+# @frontend-open: shows whether the frontend device attached to this backend\n+#                 (eg. with the chardev=... option) is in open or closed state\n+#                 (since 2.1)\n+#\n+# Notes: @filename is encoded using the QEMU command line character device\n+#        encoding.  See the QEMU man page for details.\n+#\n+# Since: 0.14.0\n+##\n+{ 'struct': 'ChardevInfo', 'data': {'label': 'str',\n+                                  'filename': 'str',\n+                                  'frontend-open': 'bool'} }\n+\n+##\n+# @query-chardev:\n+#\n+# Returns information about current character devices.\n+#\n+# Returns: a list of @ChardevInfo\n+#\n+# Since: 0.14.0\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"query-chardev\" }\n+# <- {\n+#       \"return\": [\n+#          {\n+#             \"label\": \"charchannel0\",\n+#             \"filename\": \"unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server\",\n+#             \"frontend-open\": false\n+#          },\n+#          {\n+#             \"label\": \"charmonitor\",\n+#             \"filename\": \"unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server\",\n+#             \"frontend-open\": true\n+#          },\n+#          {\n+#             \"label\": \"charserial0\",\n+#             \"filename\": \"pty:/dev/pts/2\",\n+#             \"frontend-open\": true\n+#          }\n+#       ]\n+#    }\n+#\n+##\n+{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] }\n+\n+##\n+# @ChardevBackendInfo:\n+#\n+# Information about a character device backend\n+#\n+# @name: The backend name\n+#\n+# Since: 2.0\n+##\n+{ 'struct': 'ChardevBackendInfo', 'data': {'name': 'str'} }\n+\n+##\n+# @query-chardev-backends:\n+#\n+# Returns information about character device backends.\n+#\n+# Returns: a list of @ChardevBackendInfo\n+#\n+# Since: 2.0\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"query-chardev-backends\" }\n+# <- {\n+#       \"return\":[\n+#          {\n+#             \"name\":\"udp\"\n+#          },\n+#          {\n+#             \"name\":\"tcp\"\n+#          },\n+#          {\n+#             \"name\":\"unix\"\n+#          },\n+#          {\n+#             \"name\":\"spiceport\"\n+#          }\n+#       ]\n+#    }\n+#\n+##\n+{ 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] }\n+\n+##\n+# @DataFormat:\n+#\n+# An enumeration of data format.\n+#\n+# @utf8: Data is a UTF-8 string (RFC 3629)\n+#\n+# @base64: Data is Base64 encoded binary (RFC 3548)\n+#\n+# Since: 1.4\n+##\n+{ 'enum': 'DataFormat',\n+  'data': [ 'utf8', 'base64' ] }\n+\n+##\n+# @ringbuf-write:\n+#\n+# Write to a ring buffer character device.\n+#\n+# @device: the ring buffer character device name\n+#\n+# @data: data to write\n+#\n+# @format: data encoding (default 'utf8').\n+#          - base64: data must be base64 encoded text.  Its binary\n+#            decoding gets written.\n+#          - utf8: data's UTF-8 encoding is written\n+#          - data itself is always Unicode regardless of format, like\n+#            any other string.\n+#\n+# Returns: Nothing on success\n+#\n+# Since: 1.4\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"ringbuf-write\",\n+#      \"arguments\": { \"device\": \"foo\",\n+#                     \"data\": \"abcdefgh\",\n+#                     \"format\": \"utf8\" } }\n+# <- { \"return\": {} }\n+#\n+##\n+{ 'command': 'ringbuf-write',\n+  'data': {'device': 'str', 'data': 'str',\n+           '*format': 'DataFormat'} }\n+\n+##\n+# @ringbuf-read:\n+#\n+# Read from a ring buffer character device.\n+#\n+# @device: the ring buffer character device name\n+#\n+# @size: how many bytes to read at most\n+#\n+# @format: data encoding (default 'utf8').\n+#          - base64: the data read is returned in base64 encoding.\n+#          - utf8: the data read is interpreted as UTF-8.\n+#            Bug: can screw up when the buffer contains invalid UTF-8\n+#            sequences, NUL characters, after the ring buffer lost\n+#            data, and when reading stops because the size limit is\n+#            reached.\n+#          - The return value is always Unicode regardless of format,\n+#            like any other string.\n+#\n+# Returns: data read from the device\n+#\n+# Since: 1.4\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"ringbuf-read\",\n+#      \"arguments\": { \"device\": \"foo\",\n+#                     \"size\": 1000,\n+#                     \"format\": \"utf8\" } }\n+# <- { \"return\": \"abcdefgh\" }\n+#\n+##\n+{ 'command': 'ringbuf-read',\n+  'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},\n+  'returns': 'str' }\n+\n+##\n+# @ChardevCommon:\n+#\n+# Configuration shared across all chardev backends\n+#\n+# @logfile: The name of a logfile to save output\n+# @logappend: true to append instead of truncate\n+#             (default to false to truncate)\n+#\n+# Since: 2.6\n+##\n+{ 'struct': 'ChardevCommon', 'data': { '*logfile': 'str',\n+                                       '*logappend': 'bool' } }\n+\n+##\n+# @ChardevFile:\n+#\n+# Configuration info for file chardevs.\n+#\n+# @in:  The name of the input file\n+# @out: The name of the output file\n+# @append: Open the file in append mode (default false to\n+#          truncate) (Since 2.6)\n+#\n+# Since: 1.4\n+##\n+{ 'struct': 'ChardevFile', 'data': { '*in' : 'str',\n+                                   'out' : 'str',\n+                                   '*append': 'bool' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevHostdev:\n+#\n+# Configuration info for device and pipe chardevs.\n+#\n+# @device: The name of the special file for the device,\n+#          i.e. /dev/ttyS0 on Unix or COM1: on Windows\n+#\n+# Since: 1.4\n+##\n+{ 'struct': 'ChardevHostdev', 'data': { 'device' : 'str' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevSocket:\n+#\n+# Configuration info for (stream) socket chardevs.\n+#\n+# @addr: socket address to listen on (server=true)\n+#        or connect to (server=false)\n+# @tls-creds: the ID of the TLS credentials object (since 2.6)\n+# @server: create server socket (default: true)\n+# @wait: wait for incoming connection on server\n+#        sockets (default: false).\n+# @nodelay: set TCP_NODELAY socket option (default: false)\n+# @telnet: enable telnet protocol on server\n+#          sockets (default: false)\n+# @tn3270: enable tn3270 protocol on server\n+#          sockets (default: false) (Since: 2.10)\n+# @reconnect: For a client socket, if a socket is disconnected,\n+#          then attempt a reconnect after the given number of seconds.\n+#          Setting this to zero disables this function. (default: 0)\n+#          (Since: 2.2)\n+#\n+# Since: 1.4\n+##\n+{ 'struct': 'ChardevSocket', 'data': { 'addr'       : 'SocketAddressLegacy',\n+                                     '*tls-creds'  : 'str',\n+                                     '*server'    : 'bool',\n+                                     '*wait'      : 'bool',\n+                                     '*nodelay'   : 'bool',\n+                                     '*telnet'    : 'bool',\n+                                     '*tn3270'    : 'bool',\n+                                     '*reconnect' : 'int' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevUdp:\n+#\n+# Configuration info for datagram socket chardevs.\n+#\n+# @remote: remote address\n+# @local: local address\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevUdp', 'data': { 'remote' : 'SocketAddressLegacy',\n+                                  '*local' : 'SocketAddressLegacy' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevMux:\n+#\n+# Configuration info for mux chardevs.\n+#\n+# @chardev: name of the base chardev.\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevMux', 'data': { 'chardev' : 'str' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevStdio:\n+#\n+# Configuration info for stdio chardevs.\n+#\n+# @signal: Allow signals (such as SIGINT triggered by ^C)\n+#          be delivered to qemu.  Default: true in -nographic mode,\n+#          false otherwise.\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevStdio', 'data': { '*signal' : 'bool' },\n+  'base': 'ChardevCommon' }\n+\n+\n+##\n+# @ChardevSpiceChannel:\n+#\n+# Configuration info for spice vm channel chardevs.\n+#\n+# @type: kind of channel (for example vdagent).\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevSpiceChannel', 'data': { 'type'  : 'str' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevSpicePort:\n+#\n+# Configuration info for spice port chardevs.\n+#\n+# @fqdn: name of the channel (see docs/spice-port-fqdn.txt)\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevSpicePort', 'data': { 'fqdn'  : 'str' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevVC:\n+#\n+# Configuration info for virtual console chardevs.\n+#\n+# @width:  console width,  in pixels\n+# @height: console height, in pixels\n+# @cols:   console width,  in chars\n+# @rows:   console height, in chars\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevVC', 'data': { '*width'  : 'int',\n+                                 '*height' : 'int',\n+                                 '*cols'   : 'int',\n+                                 '*rows'   : 'int' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevRingbuf:\n+#\n+# Configuration info for ring buffer chardevs.\n+#\n+# @size: ring buffer size, must be power of two, default is 65536\n+#\n+# Since: 1.5\n+##\n+{ 'struct': 'ChardevRingbuf', 'data': { '*size'  : 'int' },\n+  'base': 'ChardevCommon' }\n+\n+##\n+# @ChardevBackend:\n+#\n+# Configuration info for the new chardev backend.\n+#\n+# Since: 1.4 (testdev since 2.2, wctablet since 2.9)\n+##\n+{ 'union': 'ChardevBackend', 'data': { 'file'   : 'ChardevFile',\n+                                       'serial' : 'ChardevHostdev',\n+                                       'parallel': 'ChardevHostdev',\n+                                       'pipe'   : 'ChardevHostdev',\n+                                       'socket' : 'ChardevSocket',\n+                                       'udp'    : 'ChardevUdp',\n+                                       'pty'    : 'ChardevCommon',\n+                                       'null'   : 'ChardevCommon',\n+                                       'mux'    : 'ChardevMux',\n+                                       'msmouse': 'ChardevCommon',\n+                                       'wctablet' : 'ChardevCommon',\n+                                       'braille': 'ChardevCommon',\n+                                       'testdev': 'ChardevCommon',\n+                                       'stdio'  : 'ChardevStdio',\n+                                       'console': 'ChardevCommon',\n+                                       'spicevmc' : 'ChardevSpiceChannel',\n+                                       'spiceport' : 'ChardevSpicePort',\n+                                       'vc'     : 'ChardevVC',\n+                                       'ringbuf': 'ChardevRingbuf',\n+                                       # next one is just for compatibility\n+                                       'memory' : 'ChardevRingbuf' } }\n+\n+##\n+# @ChardevReturn:\n+#\n+# Return info about the chardev backend just created.\n+#\n+# @pty: name of the slave pseudoterminal device, present if\n+#       and only if a chardev of type 'pty' was created\n+#\n+# Since: 1.4\n+##\n+{ 'struct' : 'ChardevReturn', 'data': { '*pty' : 'str' } }\n+\n+##\n+# @chardev-add:\n+#\n+# Add a character device backend\n+#\n+# @id: the chardev's ID, must be unique\n+# @backend: backend type and parameters\n+#\n+# Returns: ChardevReturn.\n+#\n+# Since: 1.4\n+#\n+# Example:\n+#\n+# -> { \"execute\" : \"chardev-add\",\n+#      \"arguments\" : { \"id\" : \"foo\",\n+#                      \"backend\" : { \"type\" : \"null\", \"data\" : {} } } }\n+# <- { \"return\": {} }\n+#\n+# -> { \"execute\" : \"chardev-add\",\n+#      \"arguments\" : { \"id\" : \"bar\",\n+#                      \"backend\" : { \"type\" : \"file\",\n+#                                    \"data\" : { \"out\" : \"/tmp/bar.log\" } } } }\n+# <- { \"return\": {} }\n+#\n+# -> { \"execute\" : \"chardev-add\",\n+#      \"arguments\" : { \"id\" : \"baz\",\n+#                      \"backend\" : { \"type\" : \"pty\", \"data\" : {} } } }\n+# <- { \"return\": { \"pty\" : \"/dev/pty/42\" } }\n+#\n+##\n+{ 'command': 'chardev-add', 'data': {'id'      : 'str',\n+                                     'backend' : 'ChardevBackend' },\n+  'returns': 'ChardevReturn' }\n+\n+##\n+# @chardev-change:\n+#\n+# Change a character device backend\n+#\n+# @id: the chardev's ID, must exist\n+# @backend: new backend type and parameters\n+#\n+# Returns: ChardevReturn.\n+#\n+# Since: 2.10\n+#\n+# Example:\n+#\n+# -> { \"execute\" : \"chardev-change\",\n+#      \"arguments\" : { \"id\" : \"baz\",\n+#                      \"backend\" : { \"type\" : \"pty\", \"data\" : {} } } }\n+# <- { \"return\": { \"pty\" : \"/dev/pty/42\" } }\n+#\n+# -> {\"execute\" : \"chardev-change\",\n+#     \"arguments\" : {\n+#         \"id\" : \"charchannel2\",\n+#         \"backend\" : {\n+#             \"type\" : \"socket\",\n+#             \"data\" : {\n+#                 \"addr\" : {\n+#                     \"type\" : \"unix\" ,\n+#                     \"data\" : {\n+#                         \"path\" : \"/tmp/charchannel2.socket\"\n+#                     }\n+#                  },\n+#                  \"server\" : true,\n+#                  \"wait\" : false }}}}\n+# <- {\"return\": {}}\n+#\n+##\n+{ 'command': 'chardev-change', 'data': {'id'      : 'str',\n+                                        'backend' : 'ChardevBackend' },\n+  'returns': 'ChardevReturn' }\n+\n+##\n+# @chardev-remove:\n+#\n+# Remove a character device backend\n+#\n+# @id: the chardev's ID, must exist and not be in use\n+#\n+# Returns: Nothing on success\n+#\n+# Since: 1.4\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"chardev-remove\", \"arguments\": { \"id\" : \"foo\" } }\n+# <- { \"return\": {} }\n+#\n+##\n+{ 'command': 'chardev-remove', 'data': {'id': 'str'} }\n+\n+##\n+# @chardev-send-break:\n+#\n+# Send a break to a character device\n+#\n+# @id: the chardev's ID, must exist\n+#\n+# Returns: Nothing on success\n+#\n+# Since: 2.10\n+#\n+# Example:\n+#\n+# -> { \"execute\": \"chardev-send-break\", \"arguments\": { \"id\" : \"foo\" } }\n+# <- { \"return\": {} }\n+#\n+##\n+{ 'command': 'chardev-send-break', 'data': {'id': 'str'} }\n+\n+##\n+# @VSERPORT_CHANGE:\n+#\n+# Emitted when the guest opens or closes a virtio-serial port.\n+#\n+# @id: device identifier of the virtio-serial port\n+#\n+# @open: true if the guest has opened the virtio-serial port\n+#\n+# Since: 2.1\n+#\n+# Example:\n+#\n+# <- { \"event\": \"VSERPORT_CHANGE\",\n+#      \"data\": { \"id\": \"channel0\", \"open\": true },\n+#      \"timestamp\": { \"seconds\": 1401385907, \"microseconds\": 422329 } }\n+#\n+##\n+{ 'event': 'VSERPORT_CHANGE',\n+  'data': { 'id': 'str', 'open': 'bool' } }\ndiff --git a/qapi/event.json b/qapi/event.json\nindex 9c6126d278..b9aa6ed7cf 100644\n--- a/qapi/event.json\n+++ b/qapi/event.json\n@@ -397,27 +397,6 @@\n             'sector-num': 'int', 'sectors-count': 'int' } }\n \n ##\n-# @VSERPORT_CHANGE:\n-#\n-# Emitted when the guest opens or closes a virtio-serial port.\n-#\n-# @id: device identifier of the virtio-serial port\n-#\n-# @open: true if the guest has opened the virtio-serial port\n-#\n-# Since: 2.1\n-#\n-# Example:\n-#\n-# <- { \"event\": \"VSERPORT_CHANGE\",\n-#      \"data\": { \"id\": \"channel0\", \"open\": true },\n-#      \"timestamp\": { \"seconds\": 1401385907, \"microseconds\": 422329 } }\n-#\n-##\n-{ 'event': 'VSERPORT_CHANGE',\n-  'data': { 'id': 'str', 'open': 'bool' } }\n-\n-##\n # @MEM_UNPLUG_ERROR:\n #\n # Emitted when memory hot unplug error occurs.\n","prefixes":["PULL","v2","21/47"]}