1use binder_rust::{Binder, BinderService, Parcel, ServiceManager};
4
5#[macro_use]
6extern crate num_derive;
7
8use nix::libc::{open, O_CREAT, O_RDWR};
9use num_traits::FromPrimitive;
10
11struct MyService {
12
13}
14
15#[repr(u32)]
16#[derive(Debug, FromPrimitive)]
17enum MyServiceCommands {
18 Echo = 1,
19 GetFile = 2,
20}
21
22impl BinderService for MyService {
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
43}
44fn main() {
45 let mut service_manager = &mut ServiceManager::new();
46
47 let myservice = MyService {};
48
49 let mut service = service_manager.register_service(&myservice, "myservice", "com.example.IMyService", true, 0);
50
51
52 service.run();
53}
54