tracexec 0.8.2

Tracer for execve{,at} and pre-exec behavior, launcher for debuggers.
fn main() {
  #[cfg(feature = "ebpf")]
  {
    use std::{
      env,
      ffi::{OsStr, OsString},
      path::PathBuf,
    };

    use libbpf_cargo::SkeletonBuilder;

    const BPF_SRC: &str = "src/bpf/tracexec_system.bpf.c";
    let manifest_dir =
      PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"));
    let bpf_src = manifest_dir.join(BPF_SRC);
    let skel_out = manifest_dir
      .clone()
      .join("src")
      .join("bpf")
      .join("tracexec_system.skel.rs");
    let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("CARGO_CFG_TARGET_ARCH not set");
    let arch_define = OsStr::new(match arch.as_str() {
      "x86_64" => "TRACEXEC_TARGET_X86_64",
      "riscv64" => "TRACEXEC_TARGET_RISCV64",
      "aarch64" => "TRACEXEC_TARGET_AARCH64",
      _ => panic!("Arch {arch} is not supported for now"),
    });
    let max_cpus = 64;
    let max_cpus_define = OsString::from(format!("MAX_CPUS={max_cpus}"));
    let include_dir = manifest_dir.join("include");
    let mut clang_args = vec![
      // vmlinux.h
      OsStr::new("-I"),
      include_dir.as_os_str(),
      OsStr::new("-D"),
      arch_define,
      OsStr::new("-D"),
      &max_cpus_define,
    ];
    if cfg!(any(feature = "ebpf-debug", debug_assertions)) {
      clang_args.push(OsStr::new("-DEBPF_DEBUG"));
    }
    if cfg!(feature = "ebpf-no-rcu-kfuncs") {
      clang_args.push(OsStr::new("-DNO_RCU_KFUNCS"));
    }
    SkeletonBuilder::new()
      .source(bpf_src)
      .clang_args(clang_args)
      .build_and_generate(&skel_out)
      .unwrap();
    println!("cargo:rerun-if-changed={BPF_SRC}");
    println!("cargo:rerun-if-changed=src/bpf/common.h");
    println!("cargo:rerun-if-changed=src/bpf/interface.h");
  }
}