|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 6/8] chardev: introduce .chr_get_pty_name() handler
Currently we do two wrong things:
1. Abuse s->filename to get pty_name from it
2. Violate layering with help of CHARDEV_IS_PTY()
Let's get rid of both, and introduce correct way to get pty name in
generic code, if available.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@xxxxxxxxxxxxxx>
---
chardev/char-pty.c | 7 +++++++
chardev/char.c | 19 +++++++++++++------
hw/char/xen_console.c | 7 ++++---
include/chardev/char.h | 7 +++++--
4 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index a582aa7bc7..047aade09e 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -387,6 +387,12 @@ static void pty_chr_parse(QemuOpts *opts, ChardevBackend
*backend, Error **errp)
pty->path = g_strdup(path);
}
+static char *pty_chr_get_pty_name(Chardev *chr)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+ return g_strdup(s->pty_name);
+}
+
static void char_pty_class_init(ObjectClass *oc, const void *data)
{
ChardevClass *cc = CHARDEV_CLASS(oc);
@@ -396,6 +402,7 @@ static void char_pty_class_init(ObjectClass *oc, const void
*data)
cc->chr_write = pty_chr_write;
cc->chr_update_read_handler = pty_chr_update_read_handler;
cc->chr_add_watch = pty_chr_add_watch;
+ cc->chr_get_pty_name = pty_chr_get_pty_name;
}
static const TypeInfo char_pty_type_info = {
diff --git a/chardev/char.c b/chardev/char.c
index 44bfed3627..0dc792b88f 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -1090,9 +1090,7 @@ ChardevReturn *qmp_chardev_add(const char *id,
ChardevBackend *backend,
}
ret = g_new0(ChardevReturn, 1);
- if (CHARDEV_IS_PTY(chr)) {
- ret->pty = g_strdup(chr->filename + 4);
- }
+ ret->pty = qemu_chr_get_pty_name(chr);
return ret;
@@ -1101,6 +1099,17 @@ err:
return NULL;
}
+char *qemu_chr_get_pty_name(Chardev *chr)
+{
+ ChardevClass *cc = CHARDEV_GET_CLASS(chr);
+
+ if (cc->chr_get_pty_name) {
+ return cc->chr_get_pty_name(chr);
+ }
+
+ return NULL;
+}
+
ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
Error **errp)
{
@@ -1192,9 +1201,7 @@ ChardevReturn *qmp_chardev_change(const char *id,
ChardevBackend *backend,
object_unref(OBJECT(chr_new));
ret = g_new0(ChardevReturn, 1);
- if (CHARDEV_IS_PTY(chr_new)) {
- ret->pty = g_strdup(chr_new->filename + 4);
- }
+ ret->pty = qemu_chr_get_pty_name(chr_new);
return ret;
}
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index a639fb0b11..7502de46e4 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -418,6 +418,7 @@ static void xen_console_realize(XenDevice *xendev, Error
**errp)
XenConsole *con = XEN_CONSOLE_DEVICE(xendev);
Chardev *cs = qemu_chr_fe_get_driver(&con->chr);
unsigned int u;
+ g_autofree char *pty_name = NULL;
if (!cs) {
error_setg(errp, "no backing character device");
@@ -450,9 +451,9 @@ static void xen_console_realize(XenDevice *xendev, Error
**errp)
trace_xen_console_realize(con->dev, object_get_typename(OBJECT(cs)));
- if (CHARDEV_IS_PTY(cs)) {
- /* Strip the leading 'pty:' */
- xen_device_frontend_printf(xendev, "tty", "%s", cs->filename + 4);
+ pty_name = qemu_chr_get_pty_name(cs);
+ if (pty_name) {
+ xen_device_frontend_printf(xendev, "tty", "%s", pty_name);
}
/* No normal PV driver initialization for the primary console under Xen */
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 23a227dca9..d36e50b99e 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -247,8 +247,6 @@ OBJECT_DECLARE_TYPE(Chardev, ChardevClass, CHARDEV)
#define CHARDEV_IS_RINGBUF(chr) \
object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_RINGBUF)
-#define CHARDEV_IS_PTY(chr) \
- object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_PTY)
struct ChardevClass {
ObjectClass parent_class;
@@ -306,6 +304,9 @@ struct ChardevClass {
/* handle various events */
void (*chr_be_event)(Chardev *s, QEMUChrEvent event);
+
+ /* return PTY name if available */
+ char *(*chr_get_pty_name)(Chardev *s);
};
Chardev *qemu_chardev_new(const char *id, const char *typename,
@@ -320,4 +321,6 @@ GSource *qemu_chr_timeout_add_ms(Chardev *chr, guint ms,
void suspend_mux_open(void);
void resume_mux_open(void);
+char *qemu_chr_get_pty_name(Chardev *chr);
+
#endif
--
2.48.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |