ckb_debugger/
syscall_file_write.rs1use 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}