commit c12ae64d78bc0637dabb81f3af3544d034e517de Author: Aaron Kaiser Date: Wed Apr 3 17:00:29 2024 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..680931d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "agent_harness" +version = "0.1.0" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b2c0dcf --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "agent_harness" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +libc = "0.2.153" diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..9f4f097 --- /dev/null +++ b/shell.nix @@ -0,0 +1,16 @@ +{ pkgs ? import { } }: +with pkgs; +let + agent_src = fetchgit { + url = "https://gitea.rixxc.de/rixxc/x25519_agent.git"; + rev = "eafc5e9df6b316e0f9804b73e43d25f72f2c1d79"; + hash = "sha256-PTSFEOSS3dKr6g+y2z/KN1lE5md+D25CKVmCc2YpigI="; + }; + + agent = callPackage "${agent_src}/default.nix" { }; +in +pkgs.mkShell { + name = "agent-harness"; + + buildInputs = [ agent ]; +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e5596fa --- /dev/null +++ b/src/main.rs @@ -0,0 +1,50 @@ +use libc::{c_int, c_void, mmap, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE}; +use std::{env, ptr}; + +const SHARED_MEMORY_SIZE: usize = 1024; + +#[link(name = "agent")] +extern "C" { + fn agent_start(shared_memory: *mut u8, sync_memory: *mut u8); +} + +fn main() { + let args: Vec = env::args().collect(); + + let shared_fd: c_int = args[1] + .parse() + .expect("Please provide a valid file descriptor as first argument"); + + let sync_fd: c_int = args[2] + .parse() + .expect("Please provide a valid file descriptor as first argument"); + + let shared_memory = unsafe { + mmap( + ptr::null_mut() as *mut c_void, + SHARED_MEMORY_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED, + shared_fd, + 0, + ) + } as *mut u8; + assert_ne!(shared_memory, MAP_FAILED as *mut u8); + + let sync_memory = unsafe { + mmap( + ptr::null_mut() as *mut c_void, + SHARED_MEMORY_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED, + sync_fd, + 0, + ) + } as *mut u8; + assert_ne!(sync_memory, MAP_FAILED as *mut u8); + + println!("Starting agent..."); + unsafe { + agent_start(shared_memory, sync_memory); + } +}