提交 cd153e2a 编写于 作者: G Gerd Hoffmann

chardev: add spice support to qapi

This patch adds 'spicevmc' and 'spiceport' support to qapi and also
switches over the spice chardev initialization to the new qapi code
path.
上级 548cbb36
...@@ -44,10 +44,13 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port, ...@@ -44,10 +44,13 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
void do_info_spice_print(Monitor *mon, const QObject *data); void do_info_spice_print(Monitor *mon, const QObject *data);
void do_info_spice(Monitor *mon, QObject **ret_data); void do_info_spice(Monitor *mon, QObject **ret_data);
CharDriverState *qemu_chr_open_spice(QemuOpts *opts); CharDriverState *qemu_chr_open_spice_vmc(const char *type);
#if SPICE_SERVER_VERSION >= 0x000c02 #if SPICE_SERVER_VERSION >= 0x000c02
CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts); CharDriverState *qemu_chr_open_spice_port(const char *name);
void qemu_spice_register_ports(void); void qemu_spice_register_ports(void);
#else
static inline CharDriverState *qemu_chr_open_spice_port(const char *name)
{ return NULL; }
#endif #endif
#else /* CONFIG_SPICE */ #else /* CONFIG_SPICE */
......
...@@ -3208,6 +3208,28 @@ ...@@ -3208,6 +3208,28 @@
## ##
{ 'type': 'ChardevStdio', 'data': { '*signal' : 'bool' } } { 'type': 'ChardevStdio', 'data': { '*signal' : 'bool' } }
##
# @ChardevSpiceChannel:
#
# Configuration info for spice vm channel chardevs.
#
# @type: kind of channel (for example vdagent).
#
# Since: 1.5
##
{ 'type': 'ChardevSpiceChannel', 'data': { 'type' : 'str' } }
##
# @ChardevSpicePort:
#
# Configuration info for spice port chardevs.
#
# @fqdn: name of the channel (see docs/spice-port-fqdn.txt)
#
# Since: 1.5
##
{ 'type': 'ChardevSpicePort', 'data': { 'fqdn' : 'str' } }
## ##
# @ChardevBackend: # @ChardevBackend:
# #
...@@ -3228,7 +3250,9 @@ ...@@ -3228,7 +3250,9 @@
'msmouse': 'ChardevDummy', 'msmouse': 'ChardevDummy',
'braille': 'ChardevDummy', 'braille': 'ChardevDummy',
'stdio' : 'ChardevStdio', 'stdio' : 'ChardevStdio',
'console': 'ChardevDummy' } } 'console': 'ChardevDummy',
'spicevmc' : 'ChardevSpiceChannel',
'spiceport' : 'ChardevSpicePort' } }
## ##
# @ChardevReturn: # @ChardevReturn:
......
...@@ -3728,6 +3728,14 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, ...@@ -3728,6 +3728,14 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
case CHARDEV_BACKEND_KIND_CONSOLE: case CHARDEV_BACKEND_KIND_CONSOLE:
chr = qemu_chr_open_win_con(); chr = qemu_chr_open_win_con();
break; break;
#endif
#ifdef CONFIG_SPICE
case CHARDEV_BACKEND_KIND_SPICEVMC:
chr = qemu_chr_open_spice_vmc(backend->spicevmc->type);
break;
case CHARDEV_BACKEND_KIND_SPICEPORT:
chr = qemu_chr_open_spice_port(backend->spiceport->fqdn);
break;
#endif #endif
default: default:
error_setg(errp, "unknown chardev backend (%d)", backend->kind); error_setg(errp, "unknown chardev backend (%d)", backend->kind);
......
...@@ -217,16 +217,14 @@ static void print_allowed_subtypes(void) ...@@ -217,16 +217,14 @@ static void print_allowed_subtypes(void)
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
static CharDriverState *chr_open(QemuOpts *opts, const char *subtype) static CharDriverState *chr_open(const char *subtype)
{ {
CharDriverState *chr; CharDriverState *chr;
SpiceCharDriver *s; SpiceCharDriver *s;
uint32_t debug = qemu_opt_get_number(opts, "debug", 0);
chr = g_malloc0(sizeof(CharDriverState)); chr = g_malloc0(sizeof(CharDriverState));
s = g_malloc0(sizeof(SpiceCharDriver)); s = g_malloc0(sizeof(SpiceCharDriver));
s->chr = chr; s->chr = chr;
s->debug = debug;
s->active = false; s->active = false;
s->sin.subtype = subtype; s->sin.subtype = subtype;
chr->opaque = s; chr->opaque = s;
...@@ -240,35 +238,32 @@ static CharDriverState *chr_open(QemuOpts *opts, const char *subtype) ...@@ -240,35 +238,32 @@ static CharDriverState *chr_open(QemuOpts *opts, const char *subtype)
return chr; return chr;
} }
CharDriverState *qemu_chr_open_spice(QemuOpts *opts) CharDriverState *qemu_chr_open_spice_vmc(const char *type)
{ {
CharDriverState *chr; CharDriverState *chr;
const char *name = qemu_opt_get(opts, "name");
const char **psubtype = spice_server_char_device_recognized_subtypes(); const char **psubtype = spice_server_char_device_recognized_subtypes();
const char *subtype = NULL;
if (name == NULL) { if (type == NULL) {
fprintf(stderr, "spice-qemu-char: missing name parameter\n"); fprintf(stderr, "spice-qemu-char: missing name parameter\n");
print_allowed_subtypes(); print_allowed_subtypes();
return NULL; return NULL;
} }
for(;*psubtype != NULL; ++psubtype) { for (; *psubtype != NULL; ++psubtype) {
if (strcmp(name, *psubtype) == 0) { if (strcmp(type, *psubtype) == 0) {
subtype = *psubtype;
break; break;
} }
} }
if (subtype == NULL) { if (*psubtype == NULL) {
fprintf(stderr, "spice-qemu-char: unsupported name: %s\n", name); fprintf(stderr, "spice-qemu-char: unsupported type: %s\n", type);
print_allowed_subtypes(); print_allowed_subtypes();
return NULL; return NULL;
} }
chr = chr_open(opts, subtype); chr = chr_open(type);
#if SPICE_SERVER_VERSION < 0x000901 #if SPICE_SERVER_VERSION < 0x000901
/* See comment in vmc_state() */ /* See comment in vmc_state() */
if (strcmp(subtype, "vdagent") == 0) { if (strcmp(type, "vdagent") == 0) {
qemu_chr_generic_open(chr); qemu_chr_generic_open(chr);
} }
#endif #endif
...@@ -277,18 +272,17 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) ...@@ -277,18 +272,17 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts)
} }
#if SPICE_SERVER_VERSION >= 0x000c02 #if SPICE_SERVER_VERSION >= 0x000c02
CharDriverState *qemu_chr_open_spice_port(QemuOpts *opts) CharDriverState *qemu_chr_open_spice_port(const char *name)
{ {
CharDriverState *chr; CharDriverState *chr;
SpiceCharDriver *s; SpiceCharDriver *s;
const char *name = qemu_opt_get(opts, "name");
if (name == NULL) { if (name == NULL) {
fprintf(stderr, "spice-qemu-char: missing name parameter\n"); fprintf(stderr, "spice-qemu-char: missing name parameter\n");
return NULL; return NULL;
} }
chr = chr_open(opts, "port"); chr = chr_open("port");
s = chr->opaque; s = chr->opaque;
s->sin.portname = name; s->sin.portname = name;
...@@ -308,12 +302,38 @@ void qemu_spice_register_ports(void) ...@@ -308,12 +302,38 @@ void qemu_spice_register_ports(void)
} }
#endif #endif
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
Error **errp)
{
const char *name = qemu_opt_get(opts, "name");
if (name == NULL) {
error_setg(errp, "chardev: spice channel: no name given");
return;
}
backend->spicevmc = g_new0(ChardevSpiceChannel, 1);
backend->spicevmc->type = g_strdup(name);
}
static void qemu_chr_parse_spice_port(QemuOpts *opts, ChardevBackend *backend,
Error **errp)
{
const char *name = qemu_opt_get(opts, "name");
if (name == NULL) {
error_setg(errp, "chardev: spice port: no name given");
return;
}
backend->spiceport = g_new0(ChardevSpicePort, 1);
backend->spiceport->fqdn = g_strdup(name);
}
static void register_types(void) static void register_types(void)
{ {
register_char_driver("spicevmc", qemu_chr_open_spice); register_char_driver_qapi("spicevmc", CHARDEV_BACKEND_KIND_SPICEVMC,
#if SPICE_SERVER_VERSION >= 0x000c02 qemu_chr_parse_spice_vmc);
register_char_driver("spiceport", qemu_chr_open_spice_port); register_char_driver_qapi("spiceport", CHARDEV_BACKEND_KIND_SPICEPORT,
#endif qemu_chr_parse_spice_port);
} }
type_init(register_types); type_init(register_types);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册