#include "qemu/osdep.h"
-#define dprintf(_scd, _level, _fmt, ...) \
- do { \
- static unsigned __dprintf_counter = 0; \
- if (_scd->debug >= _level) { \
- fprintf(stderr, "scd: %3d: " _fmt, ++__dprintf_counter, ## __VA_ARGS__);\
- } \
- } while (0)
-
typedef struct SpiceCharDriver {
CharDriverState* chr;
SpiceCharDeviceInstance sin;
uint8_t *buffer;
uint8_t *datapos;
ssize_t bufsize, datalen;
- uint32_t debug;
QLIST_ENTRY(SpiceCharDriver) next;
} SpiceCharDriver;
p += last_out;
}
- dprintf(scd, 3, "%s: %zu/%zd\n", __func__, out, len + out);
trace_spice_vmc_write(out, len + out);
return out;
}
SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
int bytes = MIN(len, scd->datalen);
- dprintf(scd, 2, "%s: %p %d/%d/%zd\n", __func__, scd->datapos, len, bytes, scd->datalen);
if (bytes > 0) {
memcpy(buf, scd->datapos, bytes);
scd->datapos += bytes;
chr_event = CHR_EVENT_BREAK;
break;
default:
- dprintf(scd, 2, "%s: unknown %d\n", __func__, event);
return;
}
- dprintf(scd, 2, "%s: %d\n", __func__, event);
trace_spice_vmc_event(chr_event);
qemu_chr_be_event(scd->chr, chr_event);
}
}
#endif
- if ((scd->chr->opened && connected) ||
- (!scd->chr->opened && !connected)) {
+ if ((scd->chr->be_open && connected) ||
+ (!scd->chr->be_open && !connected)) {
return;
}
if (scd->active) {
return;
}
- dprintf(scd, 1, "%s\n", __func__);
scd->sin.base.sif = &vmc_interface.base;
qemu_spice_add_interface(&scd->sin.base);
scd->active = true;
if (!scd->active) {
return;
}
- dprintf(scd, 1, "%s\n", __func__);
spice_server_remove_interface(&scd->sin.base);
scd->active = false;
trace_spice_vmc_unregister_interface(scd);
{
SpiceCharDriver *s = chr->opaque;
- dprintf(s, 2, "%s: %d\n", __func__, len);
- vmc_register_interface(s);
assert(s->datalen == 0);
if (s->bufsize < len) {
s->bufsize = len;
{
SpiceCharDriver *s = chr->opaque;
- printf("%s\n", __func__);
vmc_unregister_interface(s);
QLIST_REMOVE(s, next);
g_free(s);
}
-static void spice_chr_guest_open(struct CharDriverState *chr)
-{
- SpiceCharDriver *s = chr->opaque;
- vmc_register_interface(s);
-}
-
-static void spice_chr_guest_close(struct CharDriverState *chr)
+static void spice_chr_set_fe_open(struct CharDriverState *chr, int fe_open)
{
SpiceCharDriver *s = chr->opaque;
- vmc_unregister_interface(s);
+ if (fe_open) {
+ vmc_register_interface(s);
+ } else {
+ vmc_unregister_interface(s);
+ }
}
static void print_allowed_subtypes(void)
chr->opaque = s;
chr->chr_write = spice_chr_write;
chr->chr_close = spice_chr_close;
- chr->chr_guest_open = spice_chr_guest_open;
- chr->chr_guest_close = spice_chr_guest_close;
+ chr->chr_set_fe_open = spice_chr_set_fe_open;
QLIST_INSERT_HEAD(&spice_chars, s, next);