From 3b614f2e6621a0e43626280d3c9f17b29e5828ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Mon, 26 Jul 2021 11:55:53 +0400 Subject: [PATCH] Add chardev proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- qemu-display-listener/src/chardev.rs | 44 ++++++++++++++++++++++++++++ qemu-display-listener/src/lib.rs | 3 ++ qemu-rdw/src/main.rs | 20 ++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 qemu-display-listener/src/chardev.rs diff --git a/qemu-display-listener/src/chardev.rs b/qemu-display-listener/src/chardev.rs new file mode 100644 index 0000000..5284a6b --- /dev/null +++ b/qemu-display-listener/src/chardev.rs @@ -0,0 +1,44 @@ +use std::convert::TryFrom; +use zbus::dbus_proxy; +use zbus::export::zvariant::{Fd, ObjectPath}; + +use crate::Result; + +#[dbus_proxy(default_service = "org.qemu", interface = "org.qemu.Display1.Chardev")] +pub trait Chardev { + /// Register method + fn register(&self, stream: Fd) -> zbus::Result<()>; + + /// SendBreak method + fn send_break(&self) -> zbus::Result<()>; + + /// Echo property + #[dbus_proxy(property)] + fn echo(&self) -> zbus::Result; + + /// FEOpened property + #[dbus_proxy(property, name = "FEOpened")] + fn fe_opened(&self) -> zbus::Result; + + /// Name property + #[dbus_proxy(property)] + fn name(&self) -> zbus::Result; +} + +#[derive(derivative::Derivative)] +#[derivative(Debug)] +pub struct Chardev { + #[derivative(Debug = "ignore")] + pub proxy: AsyncChardevProxy<'static>, +} + +impl Chardev { + pub async fn new(conn: &zbus::azync::Connection, id: &str) -> Result { + let obj_path = ObjectPath::try_from(format!("/org/qemu/Display1/Chardev_{}", id))?; + let proxy = AsyncChardevProxy::builder(conn) + .path(&obj_path)? + .build_async() + .await?; + Ok(Self { proxy }) + } +} diff --git a/qemu-display-listener/src/lib.rs b/qemu-display-listener/src/lib.rs index 2490c5e..e339755 100644 --- a/qemu-display-listener/src/lib.rs +++ b/qemu-display-listener/src/lib.rs @@ -12,6 +12,9 @@ pub use vm::*; mod audio; pub use audio::*; +mod chardev; +pub use chardev::*; + mod clipboard; pub use clipboard::*; diff --git a/qemu-rdw/src/main.rs b/qemu-rdw/src/main.rs index f749291..659a387 100644 --- a/qemu-rdw/src/main.rs +++ b/qemu-rdw/src/main.rs @@ -2,7 +2,9 @@ use gio::ApplicationFlags; use glib::{clone, MainContext}; use gtk::{gio, glib, prelude::*}; use once_cell::sync::OnceCell; -use qemu_display_listener::Console; +use qemu_display_listener::{Chardev, Console}; +use std::os::unix::io::AsRawFd; +use std::os::unix::net::UnixStream; use zbus::Connection; mod audio; @@ -45,6 +47,22 @@ fn main() { Err(e) => log::warn!("Failed to setup clipboard: {}", e), } + if let Ok(c) = Chardev::new(&conn, "qmp").await { + use std::io::BufReader; + use std::io::prelude::*; + + let (p0, p1) = UnixStream::pair().unwrap(); + if c.proxy.register(p1.as_raw_fd().into()).await.is_ok() { + let mut reader = BufReader::new(p0.try_clone().unwrap()); + let mut line = String::new(); + std::thread::spawn(move || loop { + if reader.read_line(&mut line).unwrap() > 0 { + println!("{}", &line); + } + }); + } + } + window.show(); })); });