qapi: Flatten away ChardevPort

Simplifies the schema and the code.

QMP command

    { "execute" : "chardev-add",
      "arguments" : { "id" : "ser0",
                      "backend" : { "type" : "port",
                                    "data" : { "type": "serial",
                                               "device":"/dev/ttyS0"} } } }

becomes

    { "execute" : "chardev-add",
      "arguments" : { "id" : "ser0",
                      "backend" : { "type" : "serial",
                                    "data" : { "device":"/dev/ttyS0"} } } }

Bonus: nicer error messages.  "unknown chardev port (1)" becomes
"character device backend type 'parallel' not supported".

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-id: 1360767256-610-3-git-send-email-armbru@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Markus Armbruster 2013-02-13 15:54:16 +01:00 committed by Anthony Liguori
parent d037d6bbbc
commit d36b2b904e
2 changed files with 48 additions and 45 deletions

View File

@ -3095,7 +3095,7 @@
'out' : 'str' } } 'out' : 'str' } }
## ##
# @ChardevPort: # @ChardevHostdev:
# #
# Configuration info for device chardevs. # Configuration info for device chardevs.
# #
@ -3105,11 +3105,7 @@
# #
# Since: 1.4 # Since: 1.4
## ##
{ 'enum': 'ChardevPortKind', 'data': [ 'serial', { 'type': 'ChardevHostdev', 'data': { 'device' : 'str' } }
'parallel' ] }
{ 'type': 'ChardevPort', 'data': { 'device' : 'str',
'type' : 'ChardevPortKind'} }
## ##
# @ChardevSocket: # @ChardevSocket:
@ -3142,7 +3138,8 @@
{ 'type': 'ChardevDummy', 'data': { } } { 'type': 'ChardevDummy', 'data': { } }
{ 'union': 'ChardevBackend', 'data': { 'file' : 'ChardevFile', { 'union': 'ChardevBackend', 'data': { 'file' : 'ChardevFile',
'port' : 'ChardevPort', 'serial' : 'ChardevHostdev',
'parallel': 'ChardevHostdev',
'socket' : 'ChardevSocket', 'socket' : 'ChardevSocket',
'pty' : 'ChardevDummy', 'pty' : 'ChardevDummy',
'null' : 'ChardevDummy' } } 'null' : 'ChardevDummy' } }

View File

@ -3269,15 +3269,17 @@ static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp)
return qemu_chr_open_win_file(out); return qemu_chr_open_win_file(out);
} }
static CharDriverState *qmp_chardev_open_port(ChardevPort *port, Error **errp) static CharDriverState *qmp_chardev_open_serial(ChardevHostdev *serial,
Error **errp)
{ {
switch (port->type) { return qemu_chr_open_win_path(serial->device);
case CHARDEV_PORT_KIND_SERIAL: }
return qemu_chr_open_win_path(port->device);
default: static CharDriverState *qmp_chardev_open_parallel(ChardevHostdev *parallel,
error_setg(errp, "unknown chardev port (%d)", port->type); Error **errp)
return NULL; {
} error_setg(errp, "character device backend type 'parallel' not supported");
return NULL;
} }
#else /* WIN32 */ #else /* WIN32 */
@ -3316,38 +3318,39 @@ static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp)
return qemu_chr_open_fd(in, out); return qemu_chr_open_fd(in, out);
} }
static CharDriverState *qmp_chardev_open_port(ChardevPort *port, Error **errp) static CharDriverState *qmp_chardev_open_serial(ChardevHostdev *serial,
Error **errp)
{ {
switch (port->type) {
#ifdef HAVE_CHARDEV_TTY #ifdef HAVE_CHARDEV_TTY
case CHARDEV_PORT_KIND_SERIAL: int fd;
{
int flags, fd; fd = qmp_chardev_open_file_source(serial->device, O_RDWR, errp);
flags = O_RDWR; if (error_is_set(errp)) {
fd = qmp_chardev_open_file_source(port->device, flags, errp);
if (error_is_set(errp)) {
return NULL;
}
socket_set_nonblock(fd);
return qemu_chr_open_tty_fd(fd);
}
#endif
#ifdef HAVE_CHARDEV_PARPORT
case CHARDEV_PORT_KIND_PARALLEL:
{
int flags, fd;
flags = O_RDWR;
fd = qmp_chardev_open_file_source(port->device, flags, errp);
if (error_is_set(errp)) {
return NULL;
}
return qemu_chr_open_pp_fd(fd);
}
#endif
default:
error_setg(errp, "unknown chardev port (%d)", port->type);
return NULL; return NULL;
} }
socket_set_nonblock(fd);
return qemu_chr_open_tty_fd(fd);
#else
error_setg(errp, "character device backend type 'serial' not supported");
return NULL;
#endif
}
static CharDriverState *qmp_chardev_open_parallel(ChardevHostdev *parallel,
Error **errp)
{
#ifdef HAVE_CHARDEV_PARPORT
int fd;
fd = qmp_chardev_open_file_source(parallel->device, O_RDWR, errp);
if (error_is_set(errp)) {
return NULL;
}
return qemu_chr_open_pp_fd(fd);
#else
error_setg(errp, "character device backend type 'parallel' not supported");
return NULL;
#endif
} }
#endif /* WIN32 */ #endif /* WIN32 */
@ -3391,8 +3394,11 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
case CHARDEV_BACKEND_KIND_FILE: case CHARDEV_BACKEND_KIND_FILE:
chr = qmp_chardev_open_file(backend->file, errp); chr = qmp_chardev_open_file(backend->file, errp);
break; break;
case CHARDEV_BACKEND_KIND_PORT: case CHARDEV_BACKEND_KIND_SERIAL:
chr = qmp_chardev_open_port(backend->port, errp); chr = qmp_chardev_open_serial(backend->serial, errp);
break;
case CHARDEV_BACKEND_KIND_PARALLEL:
chr = qmp_chardev_open_parallel(backend->parallel, errp);
break; break;
case CHARDEV_BACKEND_KIND_SOCKET: case CHARDEV_BACKEND_KIND_SOCKET:
chr = qmp_chardev_open_socket(backend->socket, errp); chr = qmp_chardev_open_socket(backend->socket, errp);