myservice/
myservice.rs

1/// Implements a simple service which echos any string it receives. Requires root to run.
2
3use 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); //status
38                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