* [Qemu-devel] [PULL 00/21] Chr tests patches
@ 2017-05-04 11:42 Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 01/21] char: remove qemu_chr_be_generic_open Marc-André Lureau
` (21 more replies)
0 siblings, 22 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60:
Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100)
are available in the git repository at:
https://github.com/elmarco/qemu.git tags/chr-tests-pull-request
for you to fetch changes up to 79c8db5a13c0f4b73f930be0fcff9bbc1237c258:
tests: add /char/console test (2017-05-04 15:34:42 +0400)
----------------------------------------------------------------
----------------------------------------------------------------
Marc-André Lureau (21):
char: remove qemu_chr_be_generic_open
mux: simplfy muxes_realize_done
xen: use a better chardev type check
container: don't leak container reference
char: add a /chardevs container
vl: add todo note about root container cleanup
char: use /chardevs container instead of chardevs list
char: remove qemu_chardev_add
char: remove chardevs list
char: useless NULL check
char-socket: introduce update_disconnected_filename()
char-socket: update local address after listen
char-socket: add 'addr' property
char-socket: add 'connected' property
char-udp: flush as much buffer as possible
tests: add alias check in /char/ringbuf
tests: add /char/pipe test
tests: add /char/file test
tests: add /char/socket test
tests: add /char/udp test
tests: add /char/console test
chardev/char-mux.h | 2 +-
include/sysemu/char.h | 10 --
chardev/char-mux.c | 11 +-
chardev/char-pty.c | 2 +-
chardev/char-socket.c | 46 +++++-
chardev/char-udp.c | 26 ++--
chardev/char.c | 148 ++++++++----------
gdbstub.c | 4 +-
hw/usb/ccid-card-passthru.c | 2 +-
hw/usb/redirect.c | 2 +-
hw/xen/xen-common.c | 2 +-
net/vhost-user.c | 2 +-
qom/container.c | 1 +
tests/test-char.c | 366 +++++++++++++++++++++++++++++++++++++++++++-
tests/vhost-user-test.c | 2 +-
ui/console.c | 2 +-
ui/gtk.c | 2 +-
vl.c | 1 +
18 files changed, 504 insertions(+), 127 deletions(-)
--
2.12.0.191.gc5d8de91d
^ permalink raw reply [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 01/21] char: remove qemu_chr_be_generic_open
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 02/21] mux: simplfy muxes_realize_done Marc-André Lureau
` (20 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini, Gerd Hoffmann
The function simply alias and hides the real event function.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/sysemu/char.h | 1 -
chardev/char-pty.c | 2 +-
chardev/char-socket.c | 2 +-
chardev/char.c | 10 ++--------
ui/console.c | 2 +-
ui/gtk.c | 2 +-
6 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index 450881d42c..a30ff3fa80 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -427,7 +427,6 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
*/
void qemu_chr_fe_take_focus(CharBackend *b);
-void qemu_chr_be_generic_open(Chardev *s);
void qemu_chr_fe_accept_input(CharBackend *be);
int qemu_chr_add_client(Chardev *s, int fd);
Chardev *qemu_chr_find(const char *name);
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index a6337be8aa..aa9d0cb2c3 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -185,7 +185,7 @@ static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
PtyChardev *s = PTY_CHARDEV(opaque);
s->open_tag = 0;
- qemu_chr_be_generic_open(chr);
+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);
return FALSE;
}
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 36ab0d633a..2789eb1f40 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -489,7 +489,7 @@ static void tcp_chr_connect(void *opaque)
tcp_chr_read,
chr, NULL);
}
- qemu_chr_be_generic_open(chr);
+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);
}
static void tcp_chr_update_read_handler(Chardev *chr,
diff --git a/chardev/char.c b/chardev/char.c
index 3df116350b..aad639b620 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -66,12 +66,6 @@ void qemu_chr_be_event(Chardev *s, int event)
be->chr_event(be->opaque, event);
}
-void qemu_chr_be_generic_open(Chardev *s)
-{
- qemu_chr_be_event(s, CHR_EVENT_OPENED);
-}
-
-
/* Not reporting errors from writing to logfile, as logs are
* defined to be "best effort" only */
static void qemu_chr_fe_write_log(Chardev *s,
@@ -469,7 +463,7 @@ static void muxes_realize_done(Notifier *notifier, void *unused)
/* mark mux as OPENED so any new FEs will immediately receive
* OPENED event
*/
- qemu_chr_be_generic_open(chr);
+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);
}
}
muxes_realized = true;
@@ -581,7 +575,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
/* We're connecting to an already opened device, so let's make sure we
also get the open event */
if (s->be_open) {
- qemu_chr_be_generic_open(s);
+ qemu_chr_be_event(s, CHR_EVENT_OPENED);
}
}
diff --git a/ui/console.c b/ui/console.c
index 189eecfd29..ac66b3c910 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -2076,7 +2076,7 @@ static void text_console_do_init(Chardev *chr, DisplayState *ds)
s->t_attrib = s->t_attrib_default;
}
- qemu_chr_be_generic_open(chr);
+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);
}
static void vc_chr_open(Chardev *chr,
diff --git a/ui/gtk.c b/ui/gtk.c
index a86848f3b0..7479ceef35 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1868,7 +1868,7 @@ static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc,
gtk_notebook_append_page(GTK_NOTEBOOK(s->notebook), vc->tab_item,
gtk_label_new(vc->label));
- qemu_chr_be_generic_open(vc->vte.chr);
+ qemu_chr_be_event(vc->vte.chr, CHR_EVENT_OPENED);
return group;
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 02/21] mux: simplfy muxes_realize_done
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 01/21] char: remove qemu_chr_be_generic_open Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` Marc-André Lureau
` (19 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
mux_chr_event() already send events to all backends, rename it,
export it, and use it from muxes_realize_done. This should help abstract
away mux implementation.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char-mux.h | 2 +-
chardev/char-mux.c | 11 ++++++++---
chardev/char.c | 9 ++-------
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/chardev/char-mux.h b/chardev/char-mux.h
index 9a2fffce91..3f41dfcfd2 100644
--- a/chardev/char-mux.h
+++ b/chardev/char-mux.h
@@ -58,6 +58,6 @@ typedef struct MuxChardev {
void mux_chr_set_handlers(Chardev *chr, GMainContext *context);
void mux_set_focus(Chardev *chr, int focus);
-void mux_chr_send_event(MuxChardev *d, int mux_nr, int event);
+void mux_chr_send_all_event(Chardev *chr, int event);
#endif /* CHAR_MUX_H */
diff --git a/chardev/char-mux.c b/chardev/char-mux.c
index 5547a36a0a..37d42c65c6 100644
--- a/chardev/char-mux.c
+++ b/chardev/char-mux.c
@@ -114,7 +114,7 @@ static void mux_print_help(Chardev *chr)
}
}
-void mux_chr_send_event(MuxChardev *d, int mux_nr, int event)
+static void mux_chr_send_event(MuxChardev *d, int mux_nr, int event)
{
CharBackend *be = d->backends[mux_nr];
@@ -222,9 +222,9 @@ static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
bool muxes_realized;
-static void mux_chr_event(void *opaque, int event)
+void mux_chr_send_all_event(Chardev *chr, int event)
{
- MuxChardev *d = MUX_CHARDEV(opaque);
+ MuxChardev *d = MUX_CHARDEV(chr);
int i;
if (!muxes_realized) {
@@ -237,6 +237,11 @@ static void mux_chr_event(void *opaque, int event)
}
}
+static void mux_chr_event(void *opaque, int event)
+{
+ mux_chr_send_all_event(CHARDEV(opaque), event);
+}
+
static GSource *mux_chr_add_watch(Chardev *s, GIOCondition cond)
{
MuxChardev *d = MUX_CHARDEV(s);
diff --git a/chardev/char.c b/chardev/char.c
index aad639b620..674c097fbe 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -451,22 +451,17 @@ static void muxes_realize_done(Notifier *notifier, void *unused)
{
Chardev *chr;
+ muxes_realized = true;
QTAILQ_FOREACH(chr, &chardevs, next) {
if (CHARDEV_IS_MUX(chr)) {
- MuxChardev *d = MUX_CHARDEV(chr);
- int i;
-
/* send OPENED to all already-attached FEs */
- for (i = 0; i < d->mux_cnt; i++) {
- mux_chr_send_event(d, i, CHR_EVENT_OPENED);
- }
+ mux_chr_send_all_event(CHARDEV(chr), CHR_EVENT_OPENED);
/* mark mux as OPENED so any new FEs will immediately receive
* OPENED event
*/
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
}
}
- muxes_realized = true;
}
static Notifier muxes_realize_notify = {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 03/21] xen: use a better chardev type check
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 02/21] mux: simplfy muxes_realize_done Marc-André Lureau
` (20 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel
Cc: stefanha, Marc-André Lureau, Stefano Stabellini,
Anthony Perard, open list:X86
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/xen/xen-common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xen/xen-common.c b/hw/xen/xen-common.c
index ae76150e8a..a9055e9eba 100644
--- a/hw/xen/xen-common.c
+++ b/hw/xen/xen-common.c
@@ -38,7 +38,7 @@ static int store_dev_info(int domid, Chardev *cs, const char *string)
int ret = -1;
/* Only continue if we're talking to a pty. */
- if (strncmp(cs->filename, "pty:", 4)) {
+ if (!CHARDEV_IS_PTY(cs)) {
return 0;
}
pts = cs->filename + 4;
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PULL 03/21] xen: use a better chardev type check
@ 2017-05-04 11:42 ` Marc-André Lureau
0 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel
Cc: Anthony Perard, stefanha, Stefano Stabellini, open list:X86,
Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/xen/xen-common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xen/xen-common.c b/hw/xen/xen-common.c
index ae76150e8a..a9055e9eba 100644
--- a/hw/xen/xen-common.c
+++ b/hw/xen/xen-common.c
@@ -38,7 +38,7 @@ static int store_dev_info(int domid, Chardev *cs, const char *string)
int ret = -1;
/* Only continue if we're talking to a pty. */
- if (strncmp(cs->filename, "pty:", 4)) {
+ if (!CHARDEV_IS_PTY(cs)) {
return 0;
}
pts = cs->filename + 4;
--
2.12.0.191.gc5d8de91d
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 04/21] container: don't leak container reference
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (2 preceding siblings ...)
2017-05-04 11:42 ` Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 05/21] char: add a /chardevs container Marc-André Lureau
` (17 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Andreas Färber
object_property_add_child() references the child, unref it after to
avoid ref leaks.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
qom/container.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/qom/container.c b/qom/container.c
index c9eb49b01e..f6ccaf7ea7 100644
--- a/qom/container.c
+++ b/qom/container.c
@@ -40,6 +40,7 @@ Object *container_get(Object *root, const char *path)
if (!child) {
child = object_new("container");
object_property_add_child(obj, parts[i], child, NULL);
+ object_unref(child);
}
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 05/21] char: add a /chardevs container
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (3 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 04/21] container: don't leak container reference Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 06/21] vl: add todo note about root container cleanup Marc-André Lureau
` (16 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel
Cc: stefanha, Marc-André Lureau, Paolo Bonzini, Gerd Hoffmann,
Michael S. Tsirkin, Jason Wang
Add a /chardevs container object to hold the list of chardevs.
(Note: QTAILQ chardevs is going away in the following commits)
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/sysemu/char.h | 8 --------
chardev/char.c | 50 +++++++++++++++++++++++++++++----------------
gdbstub.c | 4 ++--
hw/usb/ccid-card-passthru.c | 2 +-
hw/usb/redirect.c | 2 +-
net/vhost-user.c | 2 +-
tests/test-char.c | 8 ++++----
tests/vhost-user-test.c | 2 +-
8 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index a30ff3fa80..98903f31e4 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -171,14 +171,6 @@ int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp);
Chardev *qemu_chr_new_noreplay(const char *label, const char *filename);
/**
- * @qemu_chr_delete:
- *
- * Destroy a character backend and remove it from the list of
- * identified character backends.
- */
-void qemu_chr_delete(Chardev *chr);
-
-/**
* @qemu_chr_fe_set_echo:
*
* Ask the backend to override its normal echo setting. This only really
diff --git a/chardev/char.c b/chardev/char.c
index 674c097fbe..5456fb2e3a 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -45,6 +45,11 @@
static QTAILQ_HEAD(ChardevHead, Chardev) chardevs =
QTAILQ_HEAD_INITIALIZER(chardevs);
+static Object *get_chardevs_root(void)
+{
+ return container_get(object_get_root(), "/chardevs");
+}
+
void qemu_chr_be_event(Chardev *s, int event)
{
CharBackend *be = s->be;
@@ -413,6 +418,9 @@ static void char_finalize(Object *obj)
{
Chardev *chr = CHARDEV(obj);
+ if (QTAILQ_IN_USE(chr, next)) {
+ QTAILQ_REMOVE(&chardevs, chr, next);
+ }
if (chr->be) {
chr->be->chr = NULL;
}
@@ -946,7 +954,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
backend->u.mux.data->chardev = g_strdup(bid);
mux = qemu_chardev_add(id, TYPE_CHARDEV_MUX, backend, errp);
if (mux == NULL) {
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
chr = NULL;
goto out;
}
@@ -1060,12 +1068,6 @@ void qemu_chr_fe_disconnect(CharBackend *be)
}
}
-void qemu_chr_delete(Chardev *chr)
-{
- QTAILQ_REMOVE(&chardevs, chr, next);
- object_unref(OBJECT(chr));
-}
-
ChardevInfoList *qmp_query_chardev(Error **errp)
{
ChardevInfoList *chr_list = NULL;
@@ -1225,22 +1227,23 @@ void qemu_chr_set_feature(Chardev *chr,
}
Chardev *qemu_chardev_new(const char *id, const char *typename,
- ChardevBackend *backend, Error **errp)
+ ChardevBackend *backend,
+ Error **errp)
{
+ Object *obj;
Chardev *chr = NULL;
Error *local_err = NULL;
bool be_opened = true;
assert(g_str_has_prefix(typename, "chardev-"));
- chr = CHARDEV(object_new(typename));
+ obj = object_new(typename);
+ chr = CHARDEV(obj);
chr->label = g_strdup(id);
qemu_char_open(chr, backend, &be_opened, &local_err);
if (local_err) {
- error_propagate(errp, local_err);
- object_unref(OBJECT(chr));
- return NULL;
+ goto end;
}
if (!chr->filename) {
@@ -1250,6 +1253,21 @@ Chardev *qemu_chardev_new(const char *id, const char *typename,
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
}
+ if (id) {
+ object_property_add_child(get_chardevs_root(), id, obj, &local_err);
+ if (local_err) {
+ goto end;
+ }
+ object_unref(obj);
+ }
+
+end:
+ if (local_err) {
+ error_propagate(errp, local_err);
+ object_unref(obj);
+ return NULL;
+ }
+
return chr;
}
@@ -1298,16 +1316,12 @@ void qmp_chardev_remove(const char *id, Error **errp)
"Chardev '%s' cannot be unplugged in record/replay mode", id);
return;
}
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
void qemu_chr_cleanup(void)
{
- Chardev *chr, *tmp;
-
- QTAILQ_FOREACH_SAFE(chr, &chardevs, next, tmp) {
- qemu_chr_delete(chr);
- }
+ object_unparent(get_chardevs_root());
}
static void register_types(void)
diff --git a/gdbstub.c b/gdbstub.c
index 991115361e..07ebfe9626 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1611,7 +1611,7 @@ void gdb_exit(CPUArchState *env, int code)
#ifndef CONFIG_USER_ONLY
qemu_chr_fe_deinit(&s->chr);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
#endif
}
@@ -1912,7 +1912,7 @@ int gdbserver_start(const char *device)
monitor_init(mon_chr, 0);
} else {
if (qemu_chr_fe_get_driver(&s->chr)) {
- qemu_chr_delete(qemu_chr_fe_get_driver(&s->chr));
+ object_unparent(OBJECT(qemu_chr_fe_get_driver(&s->chr)));
}
mon_chr = s->mon_chr;
memset(s, 0, sizeof(GDBState));
diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c
index daab0d56cf..a41b0d6ec5 100644
--- a/hw/usb/ccid-card-passthru.c
+++ b/hw/usb/ccid-card-passthru.c
@@ -267,7 +267,7 @@ static void ccid_card_vscard_drop_connection(PassthruState *card)
Chardev *chr = qemu_chr_fe_get_driver(&card->cs);
qemu_chr_fe_deinit(&card->cs);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
card->vscard_in_pos = card->vscard_in_hdr = 0;
}
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index 0efe62f725..b001a27f05 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -1433,7 +1433,7 @@ static void usbredir_unrealize(USBDevice *udev, Error **errp)
Chardev *chr = qemu_chr_fe_get_driver(&dev->cs);
qemu_chr_fe_deinit(&dev->cs);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
/* Note must be done after qemu_chr_close, as that causes a close event */
qemu_bh_delete(dev->chardev_close_bh);
diff --git a/net/vhost-user.c b/net/vhost-user.c
index e7e63408a1..00a0c1cbc5 100644
--- a/net/vhost-user.c
+++ b/net/vhost-user.c
@@ -154,7 +154,7 @@ static void vhost_user_cleanup(NetClientState *nc)
Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
qemu_chr_fe_deinit(&s->chr);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
qemu_purge_queued_packets(nc);
diff --git a/tests/test-char.c b/tests/test-char.c
index da69f110e4..71de4b35ee 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -53,7 +53,7 @@ static void char_stdio_test_subprocess(void)
g_assert_cmpint(ret, ==, 4);
qemu_chr_fe_deinit(&be);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
static void char_stdio_test(void)
@@ -103,7 +103,7 @@ static void char_ringbuf_test(void)
g_free(data);
qemu_chr_fe_deinit(&be);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
static void char_mux_test(void)
@@ -179,7 +179,7 @@ static void char_mux_test(void)
qemu_chr_fe_deinit(&chr_be1);
qemu_chr_fe_deinit(&chr_be2);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
static void char_null_test(void)
@@ -222,7 +222,7 @@ static void char_null_test(void)
g_assert_cmpint(ret, ==, 4);
qemu_chr_fe_deinit(&be);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
}
static void char_invalid_test(void)
diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index a61896c32d..9095af267e 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -491,7 +491,7 @@ static gboolean _test_server_free(TestServer *server)
Chardev *chr = qemu_chr_fe_get_driver(&server->chr);
qemu_chr_fe_deinit(&server->chr);
- qemu_chr_delete(chr);
+ object_unparent(OBJECT(chr));
for (i = 0; i < server->fds_num; i++) {
close(server->fds[i]);
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 06/21] vl: add todo note about root container cleanup
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (4 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 05/21] char: add a /chardevs container Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 07/21] char: use /chardevs container instead of chardevs list Marc-André Lureau
` (15 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
vl.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/vl.c b/vl.c
index f46e070e0d..150e8ebf17 100644
--- a/vl.c
+++ b/vl.c
@@ -4727,6 +4727,7 @@ int main(int argc, char **argv, char **envp)
audio_cleanup();
monitor_cleanup();
qemu_chr_cleanup();
+ /* TODO: unref root container, check all devices are ok */
return 0;
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 07/21] char: use /chardevs container instead of chardevs list
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (5 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 06/21] vl: add todo note about root container cleanup Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 08/21] char: remove qemu_chardev_add Marc-André Lureau
` (14 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
Use object_resolve_path_component() and object_child_foreach() on
/chardevs container instead of iterating over chardevs list.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
chardev/char.c | 66 ++++++++++++++++++++++++++++++++--------------------------
1 file changed, 36 insertions(+), 30 deletions(-)
diff --git a/chardev/char.c b/chardev/char.c
index 5456fb2e3a..1859680bea 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -455,21 +455,24 @@ static const TypeInfo char_type_info = {
* mux will receive CHR_EVENT_OPENED notifications for the BE
* immediately.
*/
-static void muxes_realize_done(Notifier *notifier, void *unused)
+static int open_muxes(Object *child, void *opaque)
{
- Chardev *chr;
+ if (CHARDEV_IS_MUX(child)) {
+ /* send OPENED to all already-attached FEs */
+ mux_chr_send_all_event(CHARDEV(child), CHR_EVENT_OPENED);
+ /* mark mux as OPENED so any new FEs will immediately receive
+ * OPENED event
+ */
+ qemu_chr_be_event(CHARDEV(child), CHR_EVENT_OPENED);
+ }
+ return 0;
+}
+
+static void muxes_realize_done(Notifier *notifier, void *unused)
+{
muxes_realized = true;
- QTAILQ_FOREACH(chr, &chardevs, next) {
- if (CHARDEV_IS_MUX(chr)) {
- /* send OPENED to all already-attached FEs */
- mux_chr_send_all_event(CHARDEV(chr), CHR_EVENT_OPENED);
- /* mark mux as OPENED so any new FEs will immediately receive
- * OPENED event
- */
- qemu_chr_be_event(chr, CHR_EVENT_OPENED);
- }
- }
+ object_child_foreach(get_chardevs_root(), open_muxes, NULL);
}
static Notifier muxes_realize_notify = {
@@ -1068,21 +1071,29 @@ void qemu_chr_fe_disconnect(CharBackend *be)
}
}
+static int qmp_query_chardev_foreach(Object *obj, void *data)
+{
+ Chardev *chr = CHARDEV(obj);
+ ChardevInfoList **list = data;
+ ChardevInfoList *info = g_malloc0(sizeof(*info));
+
+ info->value = g_malloc0(sizeof(*info->value));
+ info->value->label = g_strdup(chr->label);
+ info->value->filename = g_strdup(chr->filename);
+ info->value->frontend_open = chr->be && chr->be->fe_open;
+
+ info->next = *list;
+ *list = info;
+
+ return 0;
+}
+
ChardevInfoList *qmp_query_chardev(Error **errp)
{
ChardevInfoList *chr_list = NULL;
- Chardev *chr;
-
- QTAILQ_FOREACH(chr, &chardevs, next) {
- ChardevInfoList *info = g_malloc0(sizeof(*info));
- info->value = g_malloc0(sizeof(*info->value));
- info->value->label = g_strdup(chr->label);
- info->value->filename = g_strdup(chr->filename);
- info->value->frontend_open = chr->be && chr->be->fe_open;
- info->next = chr_list;
- chr_list = info;
- }
+ object_child_foreach(get_chardevs_root(),
+ qmp_query_chardev_foreach, &chr_list);
return chr_list;
}
@@ -1110,14 +1121,9 @@ ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
Chardev *qemu_chr_find(const char *name)
{
- Chardev *chr;
+ Object *obj = object_resolve_path_component(get_chardevs_root(), name);
- QTAILQ_FOREACH(chr, &chardevs, next) {
- if (strcmp(chr->label, name) != 0)
- continue;
- return chr;
- }
- return NULL;
+ return obj ? CHARDEV(obj) : NULL;
}
QemuOptsList qemu_chardev_opts = {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 08/21] char: remove qemu_chardev_add
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (6 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 07/21] char: use /chardevs container instead of chardevs list Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 09/21] char: remove chardevs list Marc-André Lureau
` (13 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
qemu_chardev_new() now uses object_new_with_props() with /chardevs
parent container. It will fail to insert the object if the same "id"
already exists. "chardevs" list usage has been removed in previous
commits.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
chardev/char.c | 27 ++++-----------------------
1 file changed, 4 insertions(+), 23 deletions(-)
diff --git a/chardev/char.c b/chardev/char.c
index 1859680bea..276d27f403 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -805,26 +805,6 @@ static const ChardevClass *char_get_class(const char *driver, Error **errp)
return cc;
}
-static Chardev *qemu_chardev_add(const char *id, const char *typename,
- ChardevBackend *backend, Error **errp)
-{
- Chardev *chr;
-
- chr = qemu_chr_find(id);
- if (chr) {
- error_setg(errp, "Chardev '%s' already exists", id);
- return NULL;
- }
-
- chr = qemu_chardev_new(id, typename, backend, errp);
- if (!chr) {
- return NULL;
- }
-
- QTAILQ_INSERT_TAIL(&chardevs, chr, next);
- return chr;
-}
-
static const struct ChardevAlias {
const char *typename;
const char *alias;
@@ -941,9 +921,10 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
backend->u.null.data = ccom; /* Any ChardevCommon member would work */
}
- chr = qemu_chardev_add(bid ? bid : id,
+ chr = qemu_chardev_new(bid ? bid : id,
object_class_get_name(OBJECT_CLASS(cc)),
backend, errp);
+
if (chr == NULL) {
goto out;
}
@@ -955,7 +936,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
backend->type = CHARDEV_BACKEND_KIND_MUX;
backend->u.mux.data = g_new0(ChardevMux, 1);
backend->u.mux.data->chardev = g_strdup(bid);
- mux = qemu_chardev_add(id, TYPE_CHARDEV_MUX, backend, errp);
+ mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, errp);
if (mux == NULL) {
object_unparent(OBJECT(chr));
chr = NULL;
@@ -1289,7 +1270,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
return NULL;
}
- chr = qemu_chardev_add(id, object_class_get_name(OBJECT_CLASS(cc)),
+ chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
backend, errp);
if (!chr) {
return NULL;
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 09/21] char: remove chardevs list
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (7 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 08/21] char: remove qemu_chardev_add Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 10/21] char: useless NULL check Marc-André Lureau
` (12 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
The list is now empty, the chardev cleanup is taken care of by the unref
of the root container.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/sysemu/char.h | 1 -
chardev/char.c | 6 ------
2 files changed, 7 deletions(-)
diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index 98903f31e4..729d186d01 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -95,7 +95,6 @@ struct Chardev {
int be_open;
guint fd_in_tag;
DECLARE_BITMAP(features, QEMU_CHAR_FEATURE_LAST);
- QTAILQ_ENTRY(Chardev) next;
};
/**
diff --git a/chardev/char.c b/chardev/char.c
index 276d27f403..aee8b4555d 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -42,9 +42,6 @@
/***********************************************************/
/* character device */
-static QTAILQ_HEAD(ChardevHead, Chardev) chardevs =
- QTAILQ_HEAD_INITIALIZER(chardevs);
-
static Object *get_chardevs_root(void)
{
return container_get(object_get_root(), "/chardevs");
@@ -418,9 +415,6 @@ static void char_finalize(Object *obj)
{
Chardev *chr = CHARDEV(obj);
- if (QTAILQ_IN_USE(chr, next)) {
- QTAILQ_REMOVE(&chardevs, chr, next);
- }
if (chr->be) {
chr->be->chr = NULL;
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 10/21] char: useless NULL check
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (8 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 09/21] char: remove chardevs list Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 11/21] char-socket: introduce update_disconnected_filename() Marc-André Lureau
` (11 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
g_strdup(NULL) returns NULL already.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/chardev/char.c b/chardev/char.c
index aee8b4555d..33dbab6981 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -764,7 +764,7 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend)
const char *logfile = qemu_opt_get(opts, "logfile");
backend->has_logfile = logfile != NULL;
- backend->logfile = logfile ? g_strdup(logfile) : NULL;
+ backend->logfile = g_strdup(logfile);
backend->has_logappend = true;
backend->logappend = qemu_opt_get_bool(opts, "logappend", false);
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 11/21] char-socket: introduce update_disconnected_filename()
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (9 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 10/21] char: useless NULL check Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 12/21] char-socket: update local address after listen Marc-André Lureau
` (10 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
This helper will be used in yet another place in the following patch.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char-socket.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 2789eb1f40..511a82960d 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -366,6 +366,15 @@ static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
}
}
+static void update_disconnected_filename(SocketChardev *s)
+{
+ Chardev *chr = CHARDEV(s);
+
+ g_free(chr->filename);
+ chr->filename = SocketAddress_to_str("disconnected:", s->addr,
+ s->is_listen, s->is_telnet);
+}
+
static void tcp_chr_disconnect(Chardev *chr)
{
SocketChardev *s = SOCKET_CHARDEV(chr);
@@ -380,8 +389,7 @@ static void tcp_chr_disconnect(Chardev *chr)
s->listen_tag = qio_channel_add_watch(
QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
}
- chr->filename = SocketAddress_to_str("disconnected:", s->addr,
- s->is_listen, s->is_telnet);
+ update_disconnected_filename(s);
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
if (s->reconnect_time) {
qemu_chr_socket_restart_timer(chr);
@@ -875,8 +883,7 @@ static void qmp_chardev_open_socket(Chardev *chr,
/* be isn't opened until we get a connection */
*be_opened = false;
- chr->filename = SocketAddress_to_str("disconnected:",
- addr, is_listen, is_telnet);
+ update_disconnected_filename(s);
if (is_listen) {
if (is_telnet) {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 12/21] char-socket: update local address after listen
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (10 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 11/21] char-socket: introduce update_disconnected_filename() Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 13/21] char-socket: add 'addr' property Marc-André Lureau
` (9 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
This is mainly useful to know the actual bound port when using port 0.
For example, when starting qemu with socket on port 0, before:
QEMU waiting for connection on: disconnected:tcp:localhost:0,server
After:
QEMU waiting for connection on: disconnected:tcp:localhost:32454,server
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
chardev/char-socket.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 511a82960d..f24961ad16 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -911,6 +911,11 @@ static void qmp_chardev_open_socket(Chardev *chr,
if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
goto error;
}
+
+ qapi_free_SocketAddress(s->addr);
+ s->addr = socket_local_address(sioc->fd, errp);
+ update_disconnected_filename(s);
+
s->listen_ioc = sioc;
if (is_waitconnect &&
qemu_chr_wait_connected(chr, errp) < 0) {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 13/21] char-socket: add 'addr' property
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (11 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 12/21] char-socket: update local address after listen Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 14/21] char-socket: add 'connected' property Marc-André Lureau
` (8 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
Add a property to lookup the connection details.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char-socket.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index f24961ad16..5a5840edb1 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1009,6 +1009,15 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
sock->addr = addr;
}
+static void
+char_socket_get_addr(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ SocketChardev *s = SOCKET_CHARDEV(obj);
+
+ visit_type_SocketAddress(v, name, &s->addr, errp);
+}
+
static void char_socket_class_init(ObjectClass *oc, void *data)
{
ChardevClass *cc = CHARDEV_CLASS(oc);
@@ -1024,6 +1033,10 @@ static void char_socket_class_init(ObjectClass *oc, void *data)
cc->chr_add_client = tcp_chr_add_client;
cc->chr_add_watch = tcp_chr_add_watch;
cc->chr_update_read_handler = tcp_chr_update_read_handler;
+
+ object_class_property_add(oc, "addr", "SocketAddress",
+ char_socket_get_addr, NULL,
+ NULL, NULL, &error_abort);
}
static const TypeInfo char_socket_type_info = {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 14/21] char-socket: add 'connected' property
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (12 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 13/21] char-socket: add 'addr' property Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 15/21] char-udp: flush as much buffer as possible Marc-André Lureau
` (7 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char-socket.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 5a5840edb1..0118252002 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1018,6 +1018,14 @@ char_socket_get_addr(Object *obj, Visitor *v, const char *name,
visit_type_SocketAddress(v, name, &s->addr, errp);
}
+static bool
+char_socket_get_connected(Object *obj, Error **errp)
+{
+ SocketChardev *s = SOCKET_CHARDEV(obj);
+
+ return s->connected;
+}
+
static void char_socket_class_init(ObjectClass *oc, void *data)
{
ChardevClass *cc = CHARDEV_CLASS(oc);
@@ -1037,6 +1045,9 @@ static void char_socket_class_init(ObjectClass *oc, void *data)
object_class_property_add(oc, "addr", "SocketAddress",
char_socket_get_addr, NULL,
NULL, NULL, &error_abort);
+
+ object_class_property_add_bool(oc, "connected", char_socket_get_connected,
+ NULL, &error_abort);
}
static const TypeInfo char_socket_type_info = {
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 15/21] char-udp: flush as much buffer as possible
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (13 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 14/21] char-socket: add 'connected' property Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 16/21] tests: add alias check in /char/ringbuf Marc-André Lureau
` (6 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau, Paolo Bonzini
Instead of flushing the buffer byte by byte, call qemu_chr_be_write()
with as much byte possible accepted by the front-end.
Factor out buffer flushing in a common function udp_chr_flush_buffer().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
chardev/char-udp.c | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/chardev/char-udp.c b/chardev/char-udp.c
index 804bd22efa..1958c36de4 100644
--- a/chardev/char-udp.c
+++ b/chardev/char-udp.c
@@ -51,6 +51,18 @@ static int udp_chr_write(Chardev *chr, const uint8_t *buf, int len)
s->ioc, (const char *)buf, len, NULL);
}
+static void udp_chr_flush_buffer(UdpChardev *s)
+{
+ Chardev *chr = CHARDEV(s);
+
+ while (s->max_size > 0 && s->bufptr < s->bufcnt) {
+ int n = MIN(s->max_size, s->bufcnt - s->bufptr);
+ qemu_chr_be_write(chr, &s->buf[s->bufptr], n);
+ s->bufptr += n;
+ s->max_size = qemu_chr_be_can_write(chr);
+ }
+}
+
static int udp_chr_read_poll(void *opaque)
{
Chardev *chr = CHARDEV(opaque);
@@ -61,11 +73,8 @@ static int udp_chr_read_poll(void *opaque)
/* If there were any stray characters in the queue process them
* first
*/
- while (s->max_size > 0 && s->bufptr < s->bufcnt) {
- qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
- s->bufptr++;
- s->max_size = qemu_chr_be_can_write(chr);
- }
+ udp_chr_flush_buffer(s);
+
return s->max_size;
}
@@ -85,13 +94,8 @@ static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
return FALSE;
}
s->bufcnt = ret;
-
s->bufptr = 0;
- while (s->max_size > 0 && s->bufptr < s->bufcnt) {
- qemu_chr_be_write(chr, &s->buf[s->bufptr], 1);
- s->bufptr++;
- s->max_size = qemu_chr_be_can_write(chr);
- }
+ udp_chr_flush_buffer(s);
return TRUE;
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 16/21] tests: add alias check in /char/ringbuf
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (14 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 15/21] char-udp: flush as much buffer as possible Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 17/21] tests: add /char/pipe test Marc-André Lureau
` (5 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tests/test-char.c b/tests/test-char.c
index 71de4b35ee..2811644bcd 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -104,6 +104,16 @@ static void char_ringbuf_test(void)
qemu_chr_fe_deinit(&be);
object_unparent(OBJECT(chr));
+
+ /* check alias */
+ opts = qemu_opts_create(qemu_find_opts("chardev"), "memory-label",
+ 1, &error_abort);
+ qemu_opt_set(opts, "backend", "memory", &error_abort);
+ qemu_opt_set(opts, "size", "2", &error_abort);
+ chr = qemu_chr_new_from_opts(opts, NULL);
+ g_assert_nonnull(chr);
+ object_unparent(OBJECT(chr));
+ qemu_opts_del(opts);
}
static void char_mux_test(void)
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 17/21] tests: add /char/pipe test
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (15 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 16/21] tests: add alias check in /char/ringbuf Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 18/21] tests: add /char/file test Marc-André Lureau
` (4 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/tests/test-char.c b/tests/test-char.c
index 2811644bcd..2b155ffcb7 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -1,4 +1,5 @@
#include "qemu/osdep.h"
+#include <glib/gstdio.h>
#include "qemu-common.h"
#include "qemu/config-file.h"
@@ -7,12 +8,28 @@
#include "qapi/error.h"
#include "qmp-commands.h"
+static bool quit;
+
typedef struct FeHandler {
int read_count;
int last_event;
char read_buf[128];
} FeHandler;
+#ifndef _WIN32
+static void main_loop(void)
+{
+ bool nonblocking;
+ int last_io = 0;
+
+ quit = false;
+ do {
+ nonblocking = last_io > 0;
+ last_io = main_loop_wait(nonblocking);
+ } while (!quit);
+}
+#endif
+
static int fe_can_read(void *opaque)
{
FeHandler *h = opaque;
@@ -28,6 +45,7 @@ static void fe_read(void *opaque, const uint8_t *buf, int size)
memcpy(h->read_buf + h->read_count, buf, size);
h->read_count += size;
+ quit = true;
}
static void fe_event(void *opaque, int event)
@@ -35,6 +53,7 @@ static void fe_event(void *opaque, int event)
FeHandler *h = opaque;
h->last_event = event;
+ quit = true;
}
#ifdef CONFIG_HAS_GLIB_SUBPROCESS_TESTS
@@ -192,6 +211,72 @@ static void char_mux_test(void)
object_unparent(OBJECT(chr));
}
+#ifndef _WIN32
+static void char_pipe_test(void)
+{
+ gchar *tmp_path = g_dir_make_tmp("qemu-test-char.XXXXXX", NULL);
+ gchar *tmp, *in, *out, *pipe = g_build_filename(tmp_path, "pipe", NULL);
+ Chardev *chr;
+ CharBackend be;
+ int ret, fd;
+ char buf[10];
+ FeHandler fe = { 0, };
+
+ in = g_strdup_printf("%s.in", pipe);
+ if (mkfifo(in, 0600) < 0) {
+ abort();
+ }
+ out = g_strdup_printf("%s.out", pipe);
+ if (mkfifo(out, 0600) < 0) {
+ abort();
+ }
+
+ tmp = g_strdup_printf("pipe:%s", pipe);
+ chr = qemu_chr_new("pipe", tmp);
+ g_assert_nonnull(chr);
+ g_free(tmp);
+
+ qemu_chr_fe_init(&be, chr, &error_abort);
+
+ ret = qemu_chr_fe_write(&be, (void *)"pipe-out", 9);
+ g_assert_cmpint(ret, ==, 9);
+
+ fd = open(out, O_RDWR);
+ ret = read(fd, buf, sizeof(buf));
+ g_assert_cmpint(ret, ==, 9);
+ g_assert_cmpstr(buf, ==, "pipe-out");
+ close(fd);
+
+ fd = open(in, O_WRONLY);
+ ret = write(fd, "pipe-in", 8);
+ g_assert_cmpint(ret, ==, 8);
+ close(fd);
+
+ qemu_chr_fe_set_handlers(&be,
+ fe_can_read,
+ fe_read,
+ fe_event,
+ &fe,
+ NULL, true);
+
+ main_loop();
+
+ g_assert_cmpint(fe.read_count, ==, 8);
+ g_assert_cmpstr(fe.read_buf, ==, "pipe-in");
+
+ qemu_chr_fe_deinit(&be);
+ object_unparent(OBJECT(chr));
+
+ g_assert(g_unlink(in) == 0);
+ g_assert(g_unlink(out) == 0);
+ g_assert(g_rmdir(tmp_path) == 0);
+ g_free(in);
+ g_free(out);
+ g_free(tmp_path);
+ g_free(pipe);
+}
+#endif
+
static void char_null_test(void)
{
Error *err = NULL;
@@ -245,6 +330,8 @@ static void char_invalid_test(void)
int main(int argc, char **argv)
{
+ qemu_init_main_loop(&error_abort);
+
g_test_init(&argc, &argv, NULL);
module_call_init(MODULE_INIT_QOM);
@@ -258,6 +345,9 @@ int main(int argc, char **argv)
g_test_add_func("/char/stdio/subprocess", char_stdio_test_subprocess);
g_test_add_func("/char/stdio", char_stdio_test);
#endif
+#ifndef _WIN32
+ g_test_add_func("/char/pipe", char_pipe_test);
+#endif
return g_test_run();
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 18/21] tests: add /char/file test
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (16 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 17/21] tests: add /char/pipe test Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 19/21] tests: add /char/socket test Marc-André Lureau
` (3 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/tests/test-char.c b/tests/test-char.c
index 2b155ffcb7..87a4e2986d 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -277,6 +277,76 @@ static void char_pipe_test(void)
}
#endif
+static void char_file_test(void)
+{
+ char *tmp_path = g_dir_make_tmp("qemu-test-char.XXXXXX", NULL);
+ char *out = g_build_filename(tmp_path, "out", NULL);
+ char *contents = NULL;
+ ChardevFile file = { .out = out };
+ ChardevBackend backend = { .type = CHARDEV_BACKEND_KIND_FILE,
+ .u.file.data = &file };
+ Chardev *chr;
+ gsize length;
+ int ret;
+
+ chr = qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend,
+ &error_abort);
+ ret = qemu_chr_write_all(chr, (uint8_t *)"hello!", 6);
+ g_assert_cmpint(ret, ==, 6);
+ object_unref(OBJECT(chr));
+
+ ret = g_file_get_contents(out, &contents, &length, NULL);
+ g_assert(ret == TRUE);
+ g_assert_cmpint(length, ==, 6);
+ g_assert(strncmp(contents, "hello!", 6) == 0);
+ g_free(contents);
+
+#ifndef _WIN32
+ {
+ CharBackend be;
+ FeHandler fe = { 0, };
+ char *fifo = g_build_filename(tmp_path, "fifo", NULL);
+ int fd;
+
+ if (mkfifo(fifo, 0600) < 0) {
+ abort();
+ }
+
+ fd = open(fifo, O_RDWR);
+ ret = write(fd, "fifo-in", 8);
+ g_assert_cmpint(ret, ==, 8);
+
+ file.in = fifo;
+ file.has_in = true;
+ chr = qemu_chardev_new(NULL, TYPE_CHARDEV_FILE, &backend,
+ &error_abort);
+
+ qemu_chr_fe_init(&be, chr, &error_abort);
+ qemu_chr_fe_set_handlers(&be,
+ fe_can_read,
+ fe_read,
+ fe_event,
+ &fe, NULL, true);
+
+ main_loop();
+
+ close(fd);
+
+ g_assert_cmpint(fe.read_count, ==, 8);
+ g_assert_cmpstr(fe.read_buf, ==, "fifo-in");
+ qemu_chr_fe_deinit(&be);
+ object_unref(OBJECT(chr));
+ g_unlink(fifo);
+ g_free(fifo);
+ }
+#endif
+
+ g_unlink(out);
+ g_rmdir(tmp_path);
+ g_free(tmp_path);
+ g_free(out);
+}
+
static void char_null_test(void)
{
Error *err = NULL;
@@ -348,6 +418,7 @@ int main(int argc, char **argv)
#ifndef _WIN32
g_test_add_func("/char/pipe", char_pipe_test);
#endif
+ g_test_add_func("/char/file", char_file_test);
return g_test_run();
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 19/21] tests: add /char/socket test
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (17 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 18/21] tests: add /char/file test Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 20/21] tests: add /char/udp test Marc-André Lureau
` (2 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 112 insertions(+), 2 deletions(-)
diff --git a/tests/test-char.c b/tests/test-char.c
index 87a4e2986d..9971498391 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -3,9 +3,11 @@
#include "qemu-common.h"
#include "qemu/config-file.h"
+#include "qemu/sockets.h"
#include "sysemu/char.h"
#include "sysemu/sysemu.h"
#include "qapi/error.h"
+#include "qom/qom-qobject.h"
#include "qmp-commands.h"
static bool quit;
@@ -16,7 +18,6 @@ typedef struct FeHandler {
char read_buf[128];
} FeHandler;
-#ifndef _WIN32
static void main_loop(void)
{
bool nonblocking;
@@ -28,7 +29,6 @@ static void main_loop(void)
last_io = main_loop_wait(nonblocking);
} while (!quit);
}
-#endif
static int fe_can_read(void *opaque)
{
@@ -211,6 +211,114 @@ static void char_mux_test(void)
object_unparent(OBJECT(chr));
}
+typedef struct SocketIdleData {
+ GMainLoop *loop;
+ Chardev *chr;
+ bool conn_expected;
+ CharBackend *be;
+ CharBackend *client_be;
+} SocketIdleData;
+
+static gboolean char_socket_test_idle(gpointer user_data)
+{
+ SocketIdleData *data = user_data;
+
+ if (object_property_get_bool(OBJECT(data->chr), "connected", NULL)
+ == data->conn_expected) {
+ quit = true;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void socket_read(void *opaque, const uint8_t *buf, int size)
+{
+ SocketIdleData *data = opaque;
+
+ g_assert_cmpint(size, ==, 1);
+ g_assert_cmpint(*buf, ==, 'Z');
+
+ size = qemu_chr_fe_write(data->be, (const uint8_t *)"hello", 5);
+ g_assert_cmpint(size, ==, 5);
+}
+
+static int socket_can_read(void *opaque)
+{
+ return 10;
+}
+
+static void socket_read_hello(void *opaque, const uint8_t *buf, int size)
+{
+ g_assert_cmpint(size, ==, 5);
+ g_assert(strncmp((char *)buf, "hello", 5) == 0);
+
+ quit = true;
+}
+
+static int socket_can_read_hello(void *opaque)
+{
+ return 10;
+}
+
+static void char_socket_test(void)
+{
+ Chardev *chr = qemu_chr_new("server", "tcp:127.0.0.1:0,server,nowait");
+ Chardev *chr_client;
+ QObject *addr;
+ QDict *qdict, *data;
+ const char *port;
+ SocketIdleData d = { .chr = chr };
+ CharBackend be;
+ CharBackend client_be;
+ char *tmp;
+
+ d.be = &be;
+ d.client_be = &be;
+
+ g_assert_nonnull(chr);
+ g_assert(!object_property_get_bool(OBJECT(chr), "connected", &error_abort));
+
+ addr = object_property_get_qobject(OBJECT(chr), "addr", &error_abort);
+ qdict = qobject_to_qdict(addr);
+ data = qdict_get_qdict(qdict, "data");
+ port = qdict_get_str(data, "port");
+ tmp = g_strdup_printf("tcp:127.0.0.1:%s", port);
+ QDECREF(qdict);
+
+ qemu_chr_fe_init(&be, chr, &error_abort);
+ qemu_chr_fe_set_handlers(&be, socket_can_read, socket_read,
+ NULL, &d, NULL, true);
+
+ chr_client = qemu_chr_new("client", tmp);
+ qemu_chr_fe_init(&client_be, chr_client, &error_abort);
+ qemu_chr_fe_set_handlers(&client_be, socket_can_read_hello,
+ socket_read_hello,
+ NULL, &d, NULL, true);
+ g_free(tmp);
+
+ d.conn_expected = true;
+ guint id = g_idle_add(char_socket_test_idle, &d);
+ g_source_set_name_by_id(id, "test-idle");
+ g_assert_cmpint(id, >, 0);
+ main_loop();
+
+ g_assert(object_property_get_bool(OBJECT(chr), "connected", &error_abort));
+ g_assert(object_property_get_bool(OBJECT(chr_client),
+ "connected", &error_abort));
+
+ qemu_chr_write_all(chr_client, (const uint8_t *)"Z", 1);
+ main_loop();
+
+ object_unparent(OBJECT(chr_client));
+
+ d.conn_expected = false;
+ g_idle_add(char_socket_test_idle, &d);
+ main_loop();
+
+ object_unparent(OBJECT(chr));
+}
+
#ifndef _WIN32
static void char_pipe_test(void)
{
@@ -401,6 +509,7 @@ static void char_invalid_test(void)
int main(int argc, char **argv)
{
qemu_init_main_loop(&error_abort);
+ socket_init();
g_test_init(&argc, &argv, NULL);
@@ -419,6 +528,7 @@ int main(int argc, char **argv)
g_test_add_func("/char/pipe", char_pipe_test);
#endif
g_test_add_func("/char/file", char_file_test);
+ g_test_add_func("/char/socket", char_socket_test);
return g_test_run();
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 20/21] tests: add /char/udp test
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (18 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 19/21] tests: add /char/socket test Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 21/21] tests: add /char/console test Marc-André Lureau
2017-05-05 16:08 ` [Qemu-devel] [PULL 00/21] Chr tests patches Stefan Hajnoczi
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/tests/test-char.c b/tests/test-char.c
index 9971498391..19707bfcda 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -385,6 +385,51 @@ static void char_pipe_test(void)
}
#endif
+static void char_udp_test(void)
+{
+ struct sockaddr_in addr = { 0, }, other;
+ SocketIdleData d = { 0, };
+ Chardev *chr;
+ CharBackend be;
+ socklen_t alen = sizeof(addr);
+ int ret, sock = qemu_socket(PF_INET, SOCK_DGRAM, 0);
+ char buf[10];
+ char *tmp;
+
+ g_assert_cmpint(sock, >, 0);
+ addr.sin_family = AF_INET ;
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr.sin_port = 0;
+ ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+ g_assert_cmpint(ret, ==, 0);
+ ret = getsockname(sock, (struct sockaddr *)&addr, &alen);
+ g_assert_cmpint(ret, ==, 0);
+
+ tmp = g_strdup_printf("udp:127.0.0.1:%d",
+ ntohs(addr.sin_port));
+ chr = qemu_chr_new("client", tmp);
+ g_assert_nonnull(chr);
+
+ d.chr = chr;
+ qemu_chr_fe_init(&be, chr, &error_abort);
+ qemu_chr_fe_set_handlers(&be, socket_can_read_hello, socket_read_hello,
+ NULL, &d, NULL, true);
+ ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5);
+ g_assert_cmpint(ret, ==, 5);
+
+ alen = sizeof(addr);
+ ret = recvfrom(sock, buf, sizeof(buf), 0,
+ (struct sockaddr *)&other, &alen);
+ g_assert_cmpint(ret, ==, 5);
+ ret = sendto(sock, buf, 5, 0, (struct sockaddr *)&other, alen);
+ g_assert_cmpint(ret, ==, 5);
+
+ main_loop();
+
+ close(sock);
+ g_free(tmp);
+}
+
static void char_file_test(void)
{
char *tmp_path = g_dir_make_tmp("qemu-test-char.XXXXXX", NULL);
@@ -529,6 +574,7 @@ int main(int argc, char **argv)
#endif
g_test_add_func("/char/file", char_file_test);
g_test_add_func("/char/socket", char_socket_test);
+ g_test_add_func("/char/udp", char_udp_test);
return g_test_run();
}
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 21/21] tests: add /char/console test
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (19 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 20/21] tests: add /char/udp test Marc-André Lureau
@ 2017-05-04 11:42 ` Marc-André Lureau
2017-05-05 16:08 ` [Qemu-devel] [PULL 00/21] Chr tests patches Stefan Hajnoczi
21 siblings, 0 replies; 24+ messages in thread
From: Marc-André Lureau @ 2017-05-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
tests/test-char.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/tests/test-char.c b/tests/test-char.c
index 19707bfcda..773a1c36ba 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -57,6 +57,32 @@ static void fe_event(void *opaque, int event)
}
#ifdef CONFIG_HAS_GLIB_SUBPROCESS_TESTS
+#ifdef _WIN32
+static void char_console_test_subprocess(void)
+{
+ QemuOpts *opts;
+ Chardev *chr;
+
+ opts = qemu_opts_create(qemu_find_opts("chardev"), "console-label",
+ 1, &error_abort);
+ qemu_opt_set(opts, "backend", "console", &error_abort);
+
+ chr = qemu_chr_new_from_opts(opts, NULL);
+ g_assert_nonnull(chr);
+
+ qemu_chr_write_all(chr, (const uint8_t *)"CONSOLE", 7);
+
+ qemu_opts_del(opts);
+ object_unparent(OBJECT(chr));
+}
+
+static void char_console_test(void)
+{
+ g_test_trap_subprocess("/char/console/subprocess", 0, 0);
+ g_test_trap_assert_passed();
+ g_test_trap_assert_stdout("CONSOLE");
+}
+#endif
static void char_stdio_test_subprocess(void)
{
Chardev *chr;
@@ -83,7 +109,6 @@ static void char_stdio_test(void)
}
#endif
-
static void char_ringbuf_test(void)
{
QemuOpts *opts;
@@ -566,6 +591,10 @@ int main(int argc, char **argv)
g_test_add_func("/char/ringbuf", char_ringbuf_test);
g_test_add_func("/char/mux", char_mux_test);
#ifdef CONFIG_HAS_GLIB_SUBPROCESS_TESTS
+#ifdef _WIN32
+ g_test_add_func("/char/console/subprocess", char_console_test_subprocess);
+ g_test_add_func("/char/console", char_console_test);
+#endif
g_test_add_func("/char/stdio/subprocess", char_stdio_test_subprocess);
g_test_add_func("/char/stdio", char_stdio_test);
#endif
--
2.12.0.191.gc5d8de91d
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PULL 00/21] Chr tests patches
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
` (20 preceding siblings ...)
2017-05-04 11:42 ` [Qemu-devel] [PULL 21/21] tests: add /char/console test Marc-André Lureau
@ 2017-05-05 16:08 ` Stefan Hajnoczi
21 siblings, 0 replies; 24+ messages in thread
From: Stefan Hajnoczi @ 2017-05-05 16:08 UTC (permalink / raw)
To: Marc-André Lureau; +Cc: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 2567 bytes --]
On Thu, May 04, 2017 at 03:42:11PM +0400, Marc-André Lureau wrote:
> The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60:
>
> Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100)
>
> are available in the git repository at:
>
> https://github.com/elmarco/qemu.git tags/chr-tests-pull-request
>
> for you to fetch changes up to 79c8db5a13c0f4b73f930be0fcff9bbc1237c258:
>
> tests: add /char/console test (2017-05-04 15:34:42 +0400)
>
> ----------------------------------------------------------------
>
> ----------------------------------------------------------------
>
> Marc-André Lureau (21):
> char: remove qemu_chr_be_generic_open
> mux: simplfy muxes_realize_done
> xen: use a better chardev type check
> container: don't leak container reference
> char: add a /chardevs container
> vl: add todo note about root container cleanup
> char: use /chardevs container instead of chardevs list
> char: remove qemu_chardev_add
> char: remove chardevs list
> char: useless NULL check
> char-socket: introduce update_disconnected_filename()
> char-socket: update local address after listen
> char-socket: add 'addr' property
> char-socket: add 'connected' property
> char-udp: flush as much buffer as possible
> tests: add alias check in /char/ringbuf
> tests: add /char/pipe test
> tests: add /char/file test
> tests: add /char/socket test
> tests: add /char/udp test
> tests: add /char/console test
>
> chardev/char-mux.h | 2 +-
> include/sysemu/char.h | 10 --
> chardev/char-mux.c | 11 +-
> chardev/char-pty.c | 2 +-
> chardev/char-socket.c | 46 +++++-
> chardev/char-udp.c | 26 ++--
> chardev/char.c | 148 ++++++++----------
> gdbstub.c | 4 +-
> hw/usb/ccid-card-passthru.c | 2 +-
> hw/usb/redirect.c | 2 +-
> hw/xen/xen-common.c | 2 +-
> net/vhost-user.c | 2 +-
> qom/container.c | 1 +
> tests/test-char.c | 366 +++++++++++++++++++++++++++++++++++++++++++-
> tests/vhost-user-test.c | 2 +-
> ui/console.c | 2 +-
> ui/gtk.c | 2 +-
> vl.c | 1 +
> 18 files changed, 504 insertions(+), 127 deletions(-)
>
> --
> 2.12.0.191.gc5d8de91d
>
Thanks, applied to my staging tree:
https://github.com/stefanha/qemu/commits/staging
Stefan
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2017-05-05 16:08 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-04 11:42 [Qemu-devel] [PULL 00/21] Chr tests patches Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 01/21] char: remove qemu_chr_be_generic_open Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 02/21] mux: simplfy muxes_realize_done Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 03/21] xen: use a better chardev type check Marc-André Lureau
2017-05-04 11:42 ` Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 04/21] container: don't leak container reference Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 05/21] char: add a /chardevs container Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 06/21] vl: add todo note about root container cleanup Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 07/21] char: use /chardevs container instead of chardevs list Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 08/21] char: remove qemu_chardev_add Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 09/21] char: remove chardevs list Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 10/21] char: useless NULL check Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 11/21] char-socket: introduce update_disconnected_filename() Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 12/21] char-socket: update local address after listen Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 13/21] char-socket: add 'addr' property Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 14/21] char-socket: add 'connected' property Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 15/21] char-udp: flush as much buffer as possible Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 16/21] tests: add alias check in /char/ringbuf Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 17/21] tests: add /char/pipe test Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 18/21] tests: add /char/file test Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 19/21] tests: add /char/socket test Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 20/21] tests: add /char/udp test Marc-André Lureau
2017-05-04 11:42 ` [Qemu-devel] [PULL 21/21] tests: add /char/console test Marc-André Lureau
2017-05-05 16:08 ` [Qemu-devel] [PULL 00/21] Chr tests patches Stefan Hajnoczi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.