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:
parent
d037d6bbbc
commit
d36b2b904e
@ -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' } }
|
||||||
|
82
qemu-char.c
82
qemu-char.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user