rscamper 0.2.2

Rust interface to scamper network measurement tool
Documentation
// rscamper - Rust interface to libscamperctrl
//
// Copyright (C) 2026 Dimitrios Giakatos
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3.

use libc::{c_char, c_int, c_void, size_t, timeval};

#[repr(C)]
pub struct ScamperCtrlT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperInstT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperAttpT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTaskT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperMuxT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperVpsetT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperVpT {
    _opaque: [u8; 0],
}

pub const SCAMPER_CTRL_TYPE_DATA:  u8 = 1;
pub const SCAMPER_CTRL_TYPE_MORE:  u8 = 2;
pub const SCAMPER_CTRL_TYPE_ERR:   u8 = 3;
pub const SCAMPER_CTRL_TYPE_EOF:   u8 = 4;
pub const SCAMPER_CTRL_TYPE_FATAL: u8 = 5;

pub type ScamperCtrlCbT = unsafe extern "C" fn(
    inst: *mut ScamperInstT,
    kind: u8,
    task: *mut ScamperTaskT,
    data: *const c_void,
    len: size_t,
);

unsafe extern "C" {
    pub fn scamper_ctrl_alloc(cb: ScamperCtrlCbT) -> *mut ScamperCtrlT;
    pub fn scamper_ctrl_wait(ctrl: *mut ScamperCtrlT, to: *mut timeval) -> c_int;
    pub fn scamper_ctrl_free(ctrl: *mut ScamperCtrlT);
    pub fn scamper_ctrl_isdone(ctrl: *mut ScamperCtrlT) -> c_int;
    pub fn scamper_ctrl_param_get(ctrl: *const ScamperCtrlT) -> *mut c_void;
    pub fn scamper_ctrl_param_set(ctrl: *mut ScamperCtrlT, param: *mut c_void);
    pub fn scamper_ctrl_strerror(ctrl: *const ScamperCtrlT) -> *const c_char;

    pub fn scamper_inst_vp(
        ctrl: *mut ScamperCtrlT,
        vp: *const ScamperVpT,
    ) -> *mut ScamperInstT;
    pub fn scamper_inst_unix(
        ctrl: *mut ScamperCtrlT,
        attp: *const ScamperAttpT,
        path: *const c_char,
    ) -> *mut ScamperInstT;
    pub fn scamper_inst_inet(
        ctrl: *mut ScamperCtrlT,
        attp: *const ScamperAttpT,
        addr: *const c_char,
        port: u16,
    ) -> *mut ScamperInstT;
    pub fn scamper_inst_remote(
        ctrl: *mut ScamperCtrlT,
        path: *const c_char,
    ) -> *mut ScamperInstT;

    pub fn scamper_inst_free(inst: *mut ScamperInstT);
    pub fn scamper_inst_do(
        inst: *mut ScamperInstT,
        cmd: *const c_char,
        p: *mut c_void,
    ) -> *mut ScamperTaskT;
    pub fn scamper_inst_done(inst: *mut ScamperInstT) -> c_int;
    pub fn scamper_inst_param_get(inst: *const ScamperInstT) -> *mut c_void;
    pub fn scamper_inst_param_set(inst: *mut ScamperInstT, param: *mut c_void);
    pub fn scamper_inst_ctrl_get(inst: *const ScamperInstT) -> *mut ScamperCtrlT;
    pub fn scamper_inst_name_get(inst: *const ScamperInstT) -> *const c_char;
    pub fn scamper_inst_vp_get(inst: *const ScamperInstT) -> *mut ScamperVpT;

    pub fn scamper_inst_is_muxvp(inst: *const ScamperInstT) -> c_int;
    pub fn scamper_inst_is_inet(inst: *const ScamperInstT) -> c_int;
    pub fn scamper_inst_is_unix(inst: *const ScamperInstT) -> c_int;
    pub fn scamper_inst_is_remote(inst: *const ScamperInstT) -> c_int;

    pub fn scamper_task_halt(task: *mut ScamperTaskT) -> c_int;
    pub fn scamper_task_param_get(task: *const ScamperTaskT) -> *mut c_void;
    pub fn scamper_task_param_set(task: *mut ScamperTaskT, param: *mut c_void);
    pub fn scamper_task_free(task: *mut ScamperTaskT);
    pub fn scamper_task_use(task: *mut ScamperTaskT) -> *mut ScamperTaskT;

    pub fn scamper_mux_add(
        ctrl: *mut ScamperCtrlT,
        path: *const c_char,
    ) -> *mut ScamperMuxT;

    pub fn scamper_vpset_get(mux: *const ScamperMuxT) -> *mut ScamperVpsetT;
    pub fn scamper_vpset_free(vps: *mut ScamperVpsetT);
    pub fn scamper_vpset_vp_count(vps: *const ScamperVpsetT) -> size_t;
    pub fn scamper_vpset_vp_get(vps: *const ScamperVpsetT, i: size_t) -> *mut ScamperVpT;

    pub fn scamper_vp_free(vp: *mut ScamperVpT);
    pub fn scamper_vp_use(vp: *mut ScamperVpT) -> *mut ScamperVpT;
    pub fn scamper_vp_name_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_shortname_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_ipv4_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_asn4_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_cc_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_st_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_place_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_latlong_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_iata_get(vp: *const ScamperVpT) -> *const c_char;
    pub fn scamper_vp_tagc_get(vp: *const ScamperVpT) -> size_t;
    pub fn scamper_vp_tag_get(vp: *const ScamperVpT, i: size_t) -> *const c_char;

    pub fn scamper_attp_alloc() -> *mut ScamperAttpT;
    pub fn scamper_attp_listid_set(attp: *mut ScamperAttpT, list_id: u32);
    pub fn scamper_attp_listname_set(attp: *mut ScamperAttpT, list_name: *mut c_char) -> c_int;
    pub fn scamper_attp_listdescr_set(attp: *mut ScamperAttpT, list_descr: *mut c_char) -> c_int;
    pub fn scamper_attp_listmonitor_set(
        attp: *mut ScamperAttpT,
        list_monitor: *mut c_char,
    ) -> c_int;
    pub fn scamper_attp_cycleid_set(attp: *mut ScamperAttpT, cycle_id: u32);
    pub fn scamper_attp_priority_set(attp: *mut ScamperAttpT, priority: u32);
    pub fn scamper_attp_free(attp: *mut ScamperAttpT);
}