Add safe wrapper for RpcPreconnectedClient.
Test: atest compos_key_tests MicrodroidHostTestCases MicrodroidTestApp
Change-Id: I8dcc6c9b0465950bfaced03699fa3167dc3dc641
diff --git a/vmclient/src/lib.rs b/vmclient/src/lib.rs
index 9b5b8dd..b3bb635 100644
--- a/vmclient/src/lib.rs
+++ b/vmclient/src/lib.rs
@@ -16,12 +16,11 @@
mod death_reason;
mod errors;
-mod rpc_binder;
mod sync;
pub use crate::death_reason::DeathReason;
-pub use crate::errors::{ConnectServiceError, VmWaitError};
-use crate::{rpc_binder::VsockFactory, sync::Monitor};
+pub use crate::errors::VmWaitError;
+use crate::sync::Monitor;
use android_system_virtualizationservice::{
aidl::android::system::virtualizationservice::{
DeathReason::DeathReason as AidlDeathReason,
@@ -36,10 +35,12 @@
ParcelFileDescriptor, Result as BinderResult, StatusCode, Strong,
},
};
+use binder_common::rpc_client::connect_preconnected_rpc_binder;
use log::warn;
use std::{
fmt::{self, Debug, Formatter},
fs::File,
+ os::unix::io::IntoRawFd,
sync::Arc,
time::Duration,
};
@@ -145,12 +146,19 @@
pub fn connect_service<T: FromIBinder + ?Sized>(
&self,
port: u32,
- ) -> Result<Strong<T>, ConnectServiceError> {
- let mut vsock_factory = VsockFactory::new(&*self.vm, port);
-
- let ibinder = vsock_factory.connect_rpc_client()?;
-
- FromIBinder::try_from(ibinder).map_err(ConnectServiceError::WrongServiceType)
+ ) -> Result<Strong<T>, StatusCode> {
+ connect_preconnected_rpc_binder(|| {
+ match self.vm.connectVsock(port as i32) {
+ Ok(vsock) => {
+ // Ownership of the fd is transferred to binder
+ Some(vsock.into_raw_fd())
+ }
+ Err(e) => {
+ warn!("Vsock connection failed: {}", e);
+ None
+ }
+ }
+ })
}
/// Get ramdump