ckb_debugger/
syscall_file_write.rs

1use ckb_vm::{
2    Error, Memory, Register, SupportMachine, Syscalls,
3    registers::{A0, A1, A2, A7},
4};
5
6#[derive(Clone, Default)]
7pub struct FileWriter {}
8
9impl FileWriter {
10    pub fn new() -> Self {
11        FileWriter {}
12    }
13}
14
15impl<Mac: SupportMachine> Syscalls<Mac> for FileWriter {
16    fn initialize(&mut self, _machine: &mut Mac) -> Result<(), Error> {
17        Ok(())
18    }
19
20    fn ecall(&mut self, machine: &mut Mac) -> Result<bool, Error> {
21        let id = machine.registers()[A7].to_u64();
22        if id != 9013 {
23            return Ok(false);
24        }
25        let path_ptr = machine.registers()[A0].clone();
26        let path = ckb_vm::memory::load_c_string_byte_by_byte(machine.memory_mut(), &path_ptr)?;
27        let addr = machine.registers()[A1].to_u64();
28        let size = machine.registers()[A2].to_u64();
29        let data = machine.memory_mut().load_bytes(addr, size)?;
30        if let Ok(_) = crate::arch::file_write(&String::from_utf8_lossy(&path), &data) {
31            machine.set_register(A0, Mac::REG::from_u64(0));
32        } else {
33            machine.set_register(A0, Mac::REG::from_i64(-1));
34        }
35        return Ok(true);
36    }
37}