From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, eblake@redhat.com,
"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [Qemu-devel] [PATCH 37/40] char: move pty chardev in its own file
Date: Wed, 11 Jan 2017 18:29:53 +0100 [thread overview]
Message-ID: <20170111172956.11255-38-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20170111172956.11255-1-marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
chardev/char-pty.c | 277 ++++++++++++++++++++++++++++++++++++++++++++++++++
chardev/char.c | 258 ----------------------------------------------
chardev/Makefile.objs | 1 +
3 files changed, 278 insertions(+), 258 deletions(-)
create mode 100644 chardev/char-pty.c
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
new file mode 100644
index 0000000000..bd9fdfa60d
--- /dev/null
+++ b/chardev/char-pty.c
@@ -0,0 +1,277 @@
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "sysemu/char.h"
+#include "io/channel-file.h"
+#include "qemu/sockets.h"
+#include "qemu/error-report.h"
+
+#include "char-io.h"
+
+#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
+ || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
+ || defined(__GLIBC__)
+
+typedef struct {
+ Chardev parent;
+ QIOChannel *ioc;
+ int read_bytes;
+
+ /* Protected by the Chardev chr_write_lock. */
+ int connected;
+ guint timer_tag;
+ guint open_tag;
+} PtyChardev;
+
+#define PTY_CHARDEV(obj) OBJECT_CHECK(PtyChardev, (obj), TYPE_CHARDEV_PTY)
+
+static void pty_chr_update_read_handler_locked(Chardev *chr);
+static void pty_chr_state(Chardev *chr, int connected);
+
+static gboolean pty_chr_timer(gpointer opaque)
+{
+ struct Chardev *chr = CHARDEV(opaque);
+ PtyChardev *s = PTY_CHARDEV(opaque);
+
+ qemu_mutex_lock(&chr->chr_write_lock);
+ s->timer_tag = 0;
+ s->open_tag = 0;
+ if (!s->connected) {
+ /* Next poll ... */
+ pty_chr_update_read_handler_locked(chr);
+ }
+ qemu_mutex_unlock(&chr->chr_write_lock);
+ return FALSE;
+}
+
+/* Called with chr_write_lock held. */
+static void pty_chr_rearm_timer(Chardev *chr, int ms)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+ char *name;
+
+ if (s->timer_tag) {
+ g_source_remove(s->timer_tag);
+ s->timer_tag = 0;
+ }
+
+ if (ms == 1000) {
+ name = g_strdup_printf("pty-timer-secs-%s", chr->label);
+ s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr);
+ } else {
+ name = g_strdup_printf("pty-timer-ms-%s", chr->label);
+ s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr);
+ }
+ g_source_set_name_by_id(s->timer_tag, name);
+ g_free(name);
+}
+
+/* Called with chr_write_lock held. */
+static void pty_chr_update_read_handler_locked(Chardev *chr)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+ GPollFD pfd;
+ int rc;
+ QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc);
+
+ pfd.fd = fioc->fd;
+ pfd.events = G_IO_OUT;
+ pfd.revents = 0;
+ do {
+ rc = g_poll(&pfd, 1, 0);
+ } while (rc == -1 && errno == EINTR);
+ assert(rc >= 0);
+
+ if (pfd.revents & G_IO_HUP) {
+ pty_chr_state(chr, 0);
+ } else {
+ pty_chr_state(chr, 1);
+ }
+}
+
+static void pty_chr_update_read_handler(Chardev *chr,
+ GMainContext *context)
+{
+ qemu_mutex_lock(&chr->chr_write_lock);
+ pty_chr_update_read_handler_locked(chr);
+ qemu_mutex_unlock(&chr->chr_write_lock);
+}
+
+/* Called with chr_write_lock held. */
+static int char_pty_chr_write(Chardev *chr, const uint8_t *buf, int len)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+
+ if (!s->connected) {
+ /* guest sends data, check for (re-)connect */
+ pty_chr_update_read_handler_locked(chr);
+ if (!s->connected) {
+ return 0;
+ }
+ }
+ return io_channel_send(s->ioc, buf, len);
+}
+
+static GSource *pty_chr_add_watch(Chardev *chr, GIOCondition cond)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+ if (!s->connected) {
+ return NULL;
+ }
+ return qio_channel_create_watch(s->ioc, cond);
+}
+
+static int pty_chr_read_poll(void *opaque)
+{
+ Chardev *chr = CHARDEV(opaque);
+ PtyChardev *s = PTY_CHARDEV(opaque);
+
+ s->read_bytes = qemu_chr_be_can_write(chr);
+ return s->read_bytes;
+}
+
+static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
+{
+ Chardev *chr = CHARDEV(opaque);
+ PtyChardev *s = PTY_CHARDEV(opaque);
+ gsize len;
+ uint8_t buf[CHR_READ_BUF_LEN];
+ ssize_t ret;
+
+ len = sizeof(buf);
+ if (len > s->read_bytes) {
+ len = s->read_bytes;
+ }
+ if (len == 0) {
+ return TRUE;
+ }
+ ret = qio_channel_read(s->ioc, (char *)buf, len, NULL);
+ if (ret <= 0) {
+ pty_chr_state(chr, 0);
+ return FALSE;
+ } else {
+ pty_chr_state(chr, 1);
+ qemu_chr_be_write(chr, buf, ret);
+ }
+ return TRUE;
+}
+
+static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
+{
+ Chardev *chr = CHARDEV(opaque);
+ PtyChardev *s = PTY_CHARDEV(opaque);
+
+ s->open_tag = 0;
+ qemu_chr_be_generic_open(chr);
+ return FALSE;
+}
+
+/* Called with chr_write_lock held. */
+static void pty_chr_state(Chardev *chr, int connected)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+
+ if (!connected) {
+ if (s->open_tag) {
+ g_source_remove(s->open_tag);
+ s->open_tag = 0;
+ }
+ remove_fd_in_watch(chr);
+ s->connected = 0;
+ /* (re-)connect poll interval for idle guests: once per second.
+ * We check more frequently in case the guests sends data to
+ * the virtual device linked to our pty. */
+ pty_chr_rearm_timer(chr, 1000);
+ } else {
+ if (s->timer_tag) {
+ g_source_remove(s->timer_tag);
+ s->timer_tag = 0;
+ }
+ if (!s->connected) {
+ g_assert(s->open_tag == 0);
+ s->connected = 1;
+ s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr);
+ }
+ if (!chr->fd_in_tag) {
+ chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
+ pty_chr_read_poll,
+ pty_chr_read,
+ chr, NULL);
+ }
+ }
+}
+
+static void char_pty_finalize(Object *obj)
+{
+ Chardev *chr = CHARDEV(obj);
+ PtyChardev *s = PTY_CHARDEV(obj);
+
+ qemu_mutex_lock(&chr->chr_write_lock);
+ pty_chr_state(chr, 0);
+ object_unref(OBJECT(s->ioc));
+ if (s->timer_tag) {
+ g_source_remove(s->timer_tag);
+ s->timer_tag = 0;
+ }
+ qemu_mutex_unlock(&chr->chr_write_lock);
+ qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
+}
+
+static void char_pty_open(Chardev *chr,
+ ChardevBackend *backend,
+ bool *be_opened,
+ Error **errp)
+{
+ PtyChardev *s;
+ int master_fd, slave_fd;
+ char pty_name[PATH_MAX];
+ char *name;
+
+ master_fd = qemu_openpty_raw(&slave_fd, pty_name);
+ if (master_fd < 0) {
+ error_setg_errno(errp, errno, "Failed to create PTY");
+ return;
+ }
+
+ close(slave_fd);
+ qemu_set_nonblock(master_fd);
+
+ chr->filename = g_strdup_printf("pty:%s", pty_name);
+ error_report("char device redirected to %s (label %s)",
+ pty_name, chr->label);
+
+ s = PTY_CHARDEV(chr);
+ s->ioc = QIO_CHANNEL(qio_channel_file_new_fd(master_fd));
+ name = g_strdup_printf("chardev-pty-%s", chr->label);
+ qio_channel_set_name(QIO_CHANNEL(s->ioc), name);
+ g_free(name);
+ s->timer_tag = 0;
+ *be_opened = false;
+}
+
+static void char_pty_class_init(ObjectClass *oc, void *data)
+{
+ ChardevClass *cc = CHARDEV_CLASS(oc);
+
+ cc->open = char_pty_open;
+ cc->chr_write = char_pty_chr_write;
+ cc->chr_update_read_handler = pty_chr_update_read_handler;
+ cc->chr_add_watch = pty_chr_add_watch;
+}
+
+static const TypeInfo char_pty_type_info = {
+ .name = TYPE_CHARDEV_PTY,
+ .parent = TYPE_CHARDEV,
+ .instance_size = sizeof(PtyChardev),
+ .instance_finalize = char_pty_finalize,
+ .class_init = char_pty_class_init,
+};
+
+static void register_types(void)
+{
+ type_register_static(&char_pty_type_info);
+}
+
+type_init(register_types);
+
+#endif
diff --git a/chardev/char.c b/chardev/char.c
index f8e54d9c4b..ac29fcc841 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -661,261 +661,6 @@ void qemu_chr_fe_take_focus(CharBackend *b)
|| defined(__GLIBC__)
#define HAVE_CHARDEV_SERIAL 1
-#define HAVE_CHARDEV_PTY 1
-
-typedef struct {
- Chardev parent;
- QIOChannel *ioc;
- int read_bytes;
-
- /* Protected by the Chardev chr_write_lock. */
- int connected;
- guint timer_tag;
- guint open_tag;
-} PtyChardev;
-
-#define PTY_CHARDEV(obj) OBJECT_CHECK(PtyChardev, (obj), TYPE_CHARDEV_PTY)
-
-static void pty_chr_update_read_handler_locked(Chardev *chr);
-static void pty_chr_state(Chardev *chr, int connected);
-
-static gboolean pty_chr_timer(gpointer opaque)
-{
- struct Chardev *chr = CHARDEV(opaque);
- PtyChardev *s = PTY_CHARDEV(opaque);
-
- qemu_mutex_lock(&chr->chr_write_lock);
- s->timer_tag = 0;
- s->open_tag = 0;
- if (!s->connected) {
- /* Next poll ... */
- pty_chr_update_read_handler_locked(chr);
- }
- qemu_mutex_unlock(&chr->chr_write_lock);
- return FALSE;
-}
-
-/* Called with chr_write_lock held. */
-static void pty_chr_rearm_timer(Chardev *chr, int ms)
-{
- PtyChardev *s = PTY_CHARDEV(chr);
- char *name;
-
- if (s->timer_tag) {
- g_source_remove(s->timer_tag);
- s->timer_tag = 0;
- }
-
- if (ms == 1000) {
- name = g_strdup_printf("pty-timer-secs-%s", chr->label);
- s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr);
- } else {
- name = g_strdup_printf("pty-timer-ms-%s", chr->label);
- s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr);
- }
- g_source_set_name_by_id(s->timer_tag, name);
- g_free(name);
-}
-
-/* Called with chr_write_lock held. */
-static void pty_chr_update_read_handler_locked(Chardev *chr)
-{
- PtyChardev *s = PTY_CHARDEV(chr);
- GPollFD pfd;
- int rc;
- QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc);
-
- pfd.fd = fioc->fd;
- pfd.events = G_IO_OUT;
- pfd.revents = 0;
- do {
- rc = g_poll(&pfd, 1, 0);
- } while (rc == -1 && errno == EINTR);
- assert(rc >= 0);
-
- if (pfd.revents & G_IO_HUP) {
- pty_chr_state(chr, 0);
- } else {
- pty_chr_state(chr, 1);
- }
-}
-
-static void pty_chr_update_read_handler(Chardev *chr,
- GMainContext *context)
-{
- qemu_mutex_lock(&chr->chr_write_lock);
- pty_chr_update_read_handler_locked(chr);
- qemu_mutex_unlock(&chr->chr_write_lock);
-}
-
-/* Called with chr_write_lock held. */
-static int char_pty_chr_write(Chardev *chr, const uint8_t *buf, int len)
-{
- PtyChardev *s = PTY_CHARDEV(chr);
-
- if (!s->connected) {
- /* guest sends data, check for (re-)connect */
- pty_chr_update_read_handler_locked(chr);
- if (!s->connected) {
- return 0;
- }
- }
- return io_channel_send(s->ioc, buf, len);
-}
-
-static GSource *pty_chr_add_watch(Chardev *chr, GIOCondition cond)
-{
- PtyChardev *s = PTY_CHARDEV(chr);
- if (!s->connected) {
- return NULL;
- }
- return qio_channel_create_watch(s->ioc, cond);
-}
-
-static int pty_chr_read_poll(void *opaque)
-{
- Chardev *chr = CHARDEV(opaque);
- PtyChardev *s = PTY_CHARDEV(opaque);
-
- s->read_bytes = qemu_chr_be_can_write(chr);
- return s->read_bytes;
-}
-
-static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
-{
- Chardev *chr = CHARDEV(opaque);
- PtyChardev *s = PTY_CHARDEV(opaque);
- gsize len;
- uint8_t buf[CHR_READ_BUF_LEN];
- ssize_t ret;
-
- len = sizeof(buf);
- if (len > s->read_bytes)
- len = s->read_bytes;
- if (len == 0) {
- return TRUE;
- }
- ret = qio_channel_read(s->ioc, (char *)buf, len, NULL);
- if (ret <= 0) {
- pty_chr_state(chr, 0);
- return FALSE;
- } else {
- pty_chr_state(chr, 1);
- qemu_chr_be_write(chr, buf, ret);
- }
- return TRUE;
-}
-
-static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
-{
- Chardev *chr = CHARDEV(opaque);
- PtyChardev *s = PTY_CHARDEV(opaque);
-
- s->open_tag = 0;
- qemu_chr_be_generic_open(chr);
- return FALSE;
-}
-
-/* Called with chr_write_lock held. */
-static void pty_chr_state(Chardev *chr, int connected)
-{
- PtyChardev *s = PTY_CHARDEV(chr);
-
- if (!connected) {
- if (s->open_tag) {
- g_source_remove(s->open_tag);
- s->open_tag = 0;
- }
- remove_fd_in_watch(chr);
- s->connected = 0;
- /* (re-)connect poll interval for idle guests: once per second.
- * We check more frequently in case the guests sends data to
- * the virtual device linked to our pty. */
- pty_chr_rearm_timer(chr, 1000);
- } else {
- if (s->timer_tag) {
- g_source_remove(s->timer_tag);
- s->timer_tag = 0;
- }
- if (!s->connected) {
- g_assert(s->open_tag == 0);
- s->connected = 1;
- s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr);
- }
- if (!chr->fd_in_tag) {
- chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
- pty_chr_read_poll,
- pty_chr_read,
- chr, NULL);
- }
- }
-}
-
-static void char_pty_finalize(Object *obj)
-{
- Chardev *chr = CHARDEV(obj);
- PtyChardev *s = PTY_CHARDEV(obj);
-
- qemu_mutex_lock(&chr->chr_write_lock);
- pty_chr_state(chr, 0);
- object_unref(OBJECT(s->ioc));
- if (s->timer_tag) {
- g_source_remove(s->timer_tag);
- s->timer_tag = 0;
- }
- qemu_mutex_unlock(&chr->chr_write_lock);
- qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
-}
-
-static void char_pty_open(Chardev *chr,
- ChardevBackend *backend,
- bool *be_opened,
- Error **errp)
-{
- PtyChardev *s;
- int master_fd, slave_fd;
- char pty_name[PATH_MAX];
- char *name;
-
- master_fd = qemu_openpty_raw(&slave_fd, pty_name);
- if (master_fd < 0) {
- error_setg_errno(errp, errno, "Failed to create PTY");
- return;
- }
-
- close(slave_fd);
- qemu_set_nonblock(master_fd);
-
- chr->filename = g_strdup_printf("pty:%s", pty_name);
- error_report("char device redirected to %s (label %s)",
- pty_name, chr->label);
-
- s = PTY_CHARDEV(chr);
- s->ioc = QIO_CHANNEL(qio_channel_file_new_fd(master_fd));
- name = g_strdup_printf("chardev-pty-%s", chr->label);
- qio_channel_set_name(QIO_CHANNEL(s->ioc), name);
- g_free(name);
- s->timer_tag = 0;
- *be_opened = false;
-}
-
-static void char_pty_class_init(ObjectClass *oc, void *data)
-{
- ChardevClass *cc = CHARDEV_CLASS(oc);
-
- cc->open = char_pty_open;
- cc->chr_write = char_pty_chr_write;
- cc->chr_update_read_handler = pty_chr_update_read_handler;
- cc->chr_add_watch = pty_chr_add_watch;
-}
-
-static const TypeInfo char_pty_type_info = {
- .name = TYPE_CHARDEV_PTY,
- .parent = TYPE_CHARDEV,
- .instance_size = sizeof(PtyChardev),
- .instance_finalize = char_pty_finalize,
- .class_init = char_pty_class_init,
-};
static void tty_serial_init(int fd, int speed,
int parity, int data_bits, int stop_bits)
@@ -2153,9 +1898,6 @@ static void register_types(void)
#ifdef HAVE_CHARDEV_PARPORT
type_register_static(&char_parallel_type_info);
#endif
-#ifdef HAVE_CHARDEV_PTY
- type_register_static(&char_pty_type_info);
-#endif
/* this must be done after machine init, since we register FEs with muxes
* as part of realize functions like serial_isa_realizefn when -nographic
diff --git a/chardev/Makefile.objs b/chardev/Makefile.objs
index 778b312377..b2c14fe795 100644
--- a/chardev/Makefile.objs
+++ b/chardev/Makefile.objs
@@ -6,6 +6,7 @@ chardev-obj-y += char-io.o
chardev-obj-y += char-mux.o
chardev-obj-y += char-null.o
chardev-obj-y += char-pipe.o
+chardev-obj-$(CONFIG_POSIX) += char-pty.o
chardev-obj-y += char-ringbuf.o
chardev-obj-y += char-socket.o
chardev-obj-y += char-stdio.o
--
2.11.0
next prev parent reply other threads:[~2017-01-11 17:30 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-11 17:29 [Qemu-devel] [PATCH 00/40] chardev: qom clean-up and split in various backend files Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 01/40] spice-qemu-char: convert to finalize Marc-André Lureau
2017-01-11 19:52 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 02/40] baum: " Marc-André Lureau
2017-01-11 19:55 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 03/40] msmouse: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 04/40] mux: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 05/40] char-udp: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 06/40] char-socket: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 07/40] char-pty: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 08/40] char-ringbuf: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 09/40] char-parallel: convert parallel " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 10/40] char-stdio: convert " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 11/40] char-win-stdio: " Marc-André Lureau
2017-01-11 20:20 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 12/40] char-win: do not override chr_free Marc-André Lureau
2017-01-11 20:22 ` Eric Blake
2017-01-12 15:14 ` Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 13/40] char-win: convert to finalize Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 14/40] char-fd: " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 15/40] char: remove chr_free Marc-André Lureau
2017-01-11 20:27 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 16/40] char: get rid of CharDriver Marc-André Lureau
2017-01-11 21:33 ` Eric Blake
2017-01-12 16:14 ` Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 17/40] char: rename remaining CharDriver to Chardev Marc-André Lureau
2017-01-12 17:16 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 18/40] char: remove class kind field Marc-André Lureau
2017-01-12 18:32 ` Eric Blake
2017-01-13 15:23 ` Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 19/40] char: move to chardev/ Marc-André Lureau
2017-01-12 19:06 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 20/40] char: create chardev-obj-y Marc-André Lureau
2017-01-12 21:47 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 21/40] char: make null_chr_write() the default method Marc-André Lureau
2017-01-12 22:42 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 22/40] char: move null chardev to its own file Marc-André Lureau
2017-01-12 22:44 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 23/40] char: move mux " Marc-André Lureau
2017-01-12 23:06 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 24/40] char: move ringbuf/memory " Marc-André Lureau
2017-01-12 23:13 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 25/40] char: rename and move to header CHR_READ_BUF_LEN Marc-André Lureau
2017-01-12 23:13 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 26/40] char: remove unused READ_RETRIES Marc-André Lureau
2017-01-12 23:14 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 27/40] char: move QIOChannel-related in char-io.h Marc-André Lureau
2017-01-12 23:26 ` Eric Blake
2017-01-13 16:42 ` Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 28/40] char: move fd chardev in its own file Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 29/40] char: move win chardev base class " Marc-André Lureau
2017-01-13 19:51 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 30/40] char: move win-stdio into " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 31/40] char: move socket chardev to " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 32/40] char: move udp chardev in " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 33/40] char: move file " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 34/40] char: move stdio " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 35/40] char: move console " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 36/40] char: move pipe chardev " Marc-André Lureau
2017-01-11 17:29 ` Marc-André Lureau [this message]
2017-01-11 17:29 ` [Qemu-devel] [PATCH 38/40] char: move serial chardev to itw " Marc-André Lureau
2017-01-11 17:29 ` [Qemu-devel] [PATCH 39/40] char: move parallel chardev in its " Marc-André Lureau
2017-01-13 19:54 ` Eric Blake
2017-01-11 17:29 ` [Qemu-devel] [PATCH 40/40] char: headers clean-up Marc-André Lureau
2017-01-13 19:52 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170111172956.11255-38-marcandre.lureau@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=eblake@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).