Skip to main content

async_ebpf/
helpers.rs

1use crate::program::{HelperScope, MutableUserMemory};
2
3/// Function signature for eBPF helpers invoked by the runtime.
4pub type Helper =
5  fn(scope: &HelperScope, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) -> Result<u64, ()>;
6
7/// Writes a NUL-terminated C string assembled from slices into user memory.
8///
9/// Return value has the same semantics as `snprintf`.
10pub fn write_cstr(mut input: &[&[u8]], output: &mut MutableUserMemory) -> u64 {
11  let input_len = input.iter().map(|x| x.len()).sum::<usize>();
12
13  if output.len() == 0 {
14    return input_len as u64;
15  }
16
17  let copy_len = input_len.min(output.len() - 1);
18  let mut written_len = 0;
19
20  while written_len < copy_len {
21    let part = input[0];
22    input = &input[1..];
23    let part_copy_len = part.len().min(copy_len - written_len);
24    output[written_len..written_len + part_copy_len].copy_from_slice(&part[..part_copy_len]);
25    written_len += part_copy_len;
26  }
27
28  output[copy_len] = 0;
29  input_len as u64
30}