blob: 947b59f7623bdf7194b00f734616f8c9b6c6ec86 [file] [log] [blame]
Victor Hsieh09e26262021-03-03 16:00:55 -08001mod local_file;
2mod remote_file;
3
4pub use local_file::LocalFileReader;
Victor Hsieh6a47e7f2021-03-03 15:53:49 -08005pub use remote_file::{RemoteFileEditor, RemoteFileReader, RemoteMerkleTreeReader};
Victor Hsieh09e26262021-03-03 16:00:55 -08006
Victor Hsieh2445e332021-06-04 16:44:53 -07007use binder::unstable_api::{new_spibinder, AIBinder};
8use binder::FromIBinder;
Victor Hsieh09e26262021-03-03 16:00:55 -08009use std::io;
10
Victor Hsiehd0bb5d32021-03-19 12:48:03 -070011use crate::common::CHUNK_SIZE;
Victor Hsieh2445e332021-06-04 16:44:53 -070012use authfs_aidl_interface::aidl::com::android::virt::fs::IVirtFdService::IVirtFdService;
Victor Hsieh1a8cd042021-09-03 16:29:45 -070013use authfs_aidl_interface::binder::Strong;
Victor Hsieh09e26262021-03-03 16:00:55 -080014
Victor Hsieh2445e332021-06-04 16:44:53 -070015pub type VirtFdService = Strong<dyn IVirtFdService>;
Victor Hsieh09e26262021-03-03 16:00:55 -080016
Victor Hsiehd0bb5d32021-03-19 12:48:03 -070017pub type ChunkBuffer = [u8; CHUNK_SIZE as usize];
18
Victor Hsieh2445e332021-06-04 16:44:53 -070019pub const RPC_SERVICE_PORT: u32 = 3264;
20
Victor Hsieh1a8cd042021-09-03 16:29:45 -070021pub fn get_rpc_binder_service(cid: u32) -> io::Result<VirtFdService> {
Victor Hsieh2445e332021-06-04 16:44:53 -070022 // SAFETY: AIBinder returned by RpcClient has correct reference count, and the ownership can be
23 // safely taken by new_spibinder.
24 let ibinder = unsafe {
25 new_spibinder(binder_rpc_unstable_bindgen::RpcClient(cid, RPC_SERVICE_PORT) as *mut AIBinder)
26 };
27 if let Some(ibinder) = ibinder {
Chris Wailes2acfb0a2021-07-21 11:51:22 -070028 Ok(<dyn IVirtFdService>::try_from(ibinder).map_err(|e| {
Victor Hsieh2445e332021-06-04 16:44:53 -070029 io::Error::new(
30 io::ErrorKind::AddrNotAvailable,
31 format!("Cannot connect to RPC service: {}", e),
32 )
33 })?)
34 } else {
35 Err(io::Error::new(io::ErrorKind::InvalidInput, "Invalid raw AIBinder"))
36 }
37}
38
Victor Hsiehd0bb5d32021-03-19 12:48:03 -070039/// A trait for reading data by chunks. Chunks can be read by specifying the chunk index. Only the
40/// last chunk may have incomplete chunk size.
41pub trait ReadByChunk {
42 /// Reads the `chunk_index`-th chunk to a `ChunkBuffer`. Returns the size read, which has to be
43 /// `CHUNK_SIZE` except for the last incomplete chunk. Reading beyond the file size (including
44 /// empty file) should return 0.
45 fn read_chunk(&self, chunk_index: u64, buf: &mut ChunkBuffer) -> io::Result<usize>;
Victor Hsieh09e26262021-03-03 16:00:55 -080046}
47
48/// A trait to write a buffer to the destination at a given offset. The implementation does not
49/// necessarily own or maintain the destination state.
50///
51/// NB: The trait is required in a member of `fusefs::AuthFs`, which is required to be Sync and
52/// immutable (this the member).
53pub trait RandomWrite {
54 /// Writes `buf` to the destination at `offset`. Returns the written size, which may not be the
55 /// full buffer.
56 fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize>;
57
58 /// Writes the full `buf` to the destination at `offset`.
59 fn write_all_at(&self, buf: &[u8], offset: u64) -> io::Result<()> {
60 let mut input_offset = 0;
61 let mut output_offset = offset;
62 while input_offset < buf.len() {
63 let size = self.write_at(&buf[input_offset..], output_offset)?;
64 input_offset += size;
65 output_offset += size as u64;
66 }
67 Ok(())
68 }
Victor Hsieh9d0ab622021-04-26 17:07:02 -070069
70 /// Resizes the file to the new size.
71 fn resize(&self, size: u64) -> io::Result<()>;
Victor Hsieh09e26262021-03-03 16:00:55 -080072}