rscamper 0.2.2

Rust interface to scamper network measurement tool
Documentation
// rscamper - Rust FFI bindings for scamper_host.h
//
// 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, size_t, timeval};
use super::scamper_addr::ScamperAddrT;
use super::scamper_list::{ScamperListT, ScamperCycleT};

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

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

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

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

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

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

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

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

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

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

pub const SCAMPER_HOST_CLASS_IN: u16 = 1;

pub const SCAMPER_HOST_STOP_NONE:    u8 = 0;
pub const SCAMPER_HOST_STOP_DONE:    u8 = 1;
pub const SCAMPER_HOST_STOP_TIMEOUT: u8 = 2;
pub const SCAMPER_HOST_STOP_HALTED:  u8 = 3;
pub const SCAMPER_HOST_STOP_ERROR:   u8 = 4;

unsafe extern "C" {
    pub fn scamper_host_tojson(host: *const ScamperHostT, l: *mut size_t) -> *mut c_char;
    pub fn scamper_host_free(host: *mut ScamperHostT);

    pub fn scamper_host_stop_tostr(h: *const ScamperHostT, b: *mut c_char, l: size_t) -> *mut c_char;
    pub fn scamper_host_qtype_tostr(qtype: u16, b: *mut c_char, l: size_t) -> *mut c_char;
    pub fn scamper_host_qclass_tostr(qclass: u16, b: *mut c_char, l: size_t) -> *mut c_char;
    pub fn scamper_host_rcode_tostr(rcode: u8, b: *mut c_char, l: size_t) -> *mut c_char;

    pub fn scamper_host_list_get(host: *const ScamperHostT) -> *mut ScamperListT;
    pub fn scamper_host_cycle_get(host: *const ScamperHostT) -> *mut ScamperCycleT;
    pub fn scamper_host_src_get(host: *const ScamperHostT) -> *mut ScamperAddrT;
    pub fn scamper_host_dst_get(host: *const ScamperHostT) -> *mut ScamperAddrT;
    pub fn scamper_host_userid_get(host: *const ScamperHostT) -> u32;
    pub fn scamper_host_start_get(host: *const ScamperHostT) -> *const timeval;
    pub fn scamper_host_flags_get(host: *const ScamperHostT) -> u16;
    pub fn scamper_host_wait_get(host: *const ScamperHostT) -> u16;
    pub fn scamper_host_stop_get(host: *const ScamperHostT) -> u8;
    pub fn scamper_host_retries_get(host: *const ScamperHostT) -> u8;
    pub fn scamper_host_qtype_get(host: *const ScamperHostT) -> u16;
    pub fn scamper_host_qclass_get(host: *const ScamperHostT) -> u16;
    pub fn scamper_host_qname_get(host: *const ScamperHostT) -> *const c_char;
    pub fn scamper_host_qcount_get(host: *const ScamperHostT) -> u8;
    pub fn scamper_host_ecs_get(host: *const ScamperHostT) -> *const c_char;
    pub fn scamper_host_errmsg_get(host: *const ScamperHostT) -> *const c_char;

    pub fn scamper_host_query_get(host: *const ScamperHostT, i: u8) -> *mut ScamperHostQueryT;
    pub fn scamper_host_query_use(q: *mut ScamperHostQueryT) -> *mut ScamperHostQueryT;
    pub fn scamper_host_query_free(q: *mut ScamperHostQueryT);
    pub fn scamper_host_query_tx_get(q: *const ScamperHostQueryT) -> *const timeval;
    pub fn scamper_host_query_rx_get(q: *const ScamperHostQueryT) -> *const timeval;
    pub fn scamper_host_query_rcode_get(q: *const ScamperHostQueryT) -> u8;
    pub fn scamper_host_query_flags_get(q: *const ScamperHostQueryT) -> u8;
    pub fn scamper_host_query_id_get(q: *const ScamperHostQueryT) -> u16;
    pub fn scamper_host_query_ancount_get(q: *const ScamperHostQueryT) -> u16;
    pub fn scamper_host_query_nscount_get(q: *const ScamperHostQueryT) -> u16;
    pub fn scamper_host_query_arcount_get(q: *const ScamperHostQueryT) -> u16;
    pub fn scamper_host_query_an_get(q: *const ScamperHostQueryT, i: u16) -> *mut ScamperHostRrT;
    pub fn scamper_host_query_ns_get(q: *const ScamperHostQueryT, i: u16) -> *mut ScamperHostRrT;
    pub fn scamper_host_query_ar_get(q: *const ScamperHostQueryT, i: u16) -> *mut ScamperHostRrT;
    pub fn scamper_host_query_ar_opt_get(q: *const ScamperHostQueryT) -> *mut ScamperHostRrT;

    pub fn scamper_host_rr_use(rr: *mut ScamperHostRrT) -> *mut ScamperHostRrT;
    pub fn scamper_host_rr_free(rr: *mut ScamperHostRrT);
    pub fn scamper_host_rr_data_type(class_n: u16, type_n: u16) -> c_int;
    pub fn scamper_host_rr_data_str_typestr(qclass: u16, qtype: u16) -> *const c_char;
    pub fn scamper_host_rr_class_get(rr: *const ScamperHostRrT) -> u16;
    pub fn scamper_host_rr_type_get(rr: *const ScamperHostRrT) -> u16;
    pub fn scamper_host_rr_name_get(rr: *const ScamperHostRrT) -> *const c_char;
    pub fn scamper_host_rr_ttl_get(rr: *const ScamperHostRrT) -> u32;
    pub fn scamper_host_rr_v_get(rr: *const ScamperHostRrT) -> *const libc::c_void;
    pub fn scamper_host_rr_addr_get(rr: *const ScamperHostRrT) -> *mut ScamperAddrT;
    pub fn scamper_host_rr_str_get(rr: *const ScamperHostRrT) -> *const c_char;
    pub fn scamper_host_rr_soa_get(rr: *const ScamperHostRrT) -> *mut ScamperHostRrSoaT;
    pub fn scamper_host_rr_mx_get(rr: *const ScamperHostRrT) -> *mut ScamperHostRrMxT;
    pub fn scamper_host_rr_txt_get(rr: *const ScamperHostRrT) -> *mut ScamperHostRrTxtT;
    pub fn scamper_host_rr_opt_get(rr: *const ScamperHostRrT) -> *mut ScamperHostRrOptT;
    pub fn scamper_host_rr_svcb_get(rr: *const ScamperHostRrT) -> *mut ScamperHostRrSvcbT;

    pub fn scamper_host_rr_mx_use(mx: *mut ScamperHostRrMxT) -> *mut ScamperHostRrMxT;
    pub fn scamper_host_rr_mx_free(mx: *mut ScamperHostRrMxT);
    pub fn scamper_host_rr_mx_preference_get(mx: *const ScamperHostRrMxT) -> u16;
    pub fn scamper_host_rr_mx_exchange_get(mx: *const ScamperHostRrMxT) -> *const c_char;

    pub fn scamper_host_rr_soa_use(soa: *mut ScamperHostRrSoaT) -> *mut ScamperHostRrSoaT;
    pub fn scamper_host_rr_soa_free(soa: *mut ScamperHostRrSoaT);
    pub fn scamper_host_rr_soa_mname_get(soa: *const ScamperHostRrSoaT) -> *const c_char;
    pub fn scamper_host_rr_soa_rname_get(soa: *const ScamperHostRrSoaT) -> *const c_char;
    pub fn scamper_host_rr_soa_serial_get(soa: *const ScamperHostRrSoaT) -> u32;
    pub fn scamper_host_rr_soa_refresh_get(soa: *const ScamperHostRrSoaT) -> u32;
    pub fn scamper_host_rr_soa_retry_get(soa: *const ScamperHostRrSoaT) -> u32;
    pub fn scamper_host_rr_soa_expire_get(soa: *const ScamperHostRrSoaT) -> u32;
    pub fn scamper_host_rr_soa_minimum_get(soa: *const ScamperHostRrSoaT) -> u32;

    pub fn scamper_host_rr_txt_use(txt: *mut ScamperHostRrTxtT) -> *mut ScamperHostRrTxtT;
    pub fn scamper_host_rr_txt_free(txt: *mut ScamperHostRrTxtT);
    pub fn scamper_host_rr_txt_strc_get(txt: *const ScamperHostRrTxtT) -> u16;
    pub fn scamper_host_rr_txt_str_get(txt: *const ScamperHostRrTxtT, i: u16) -> *const c_char;

    pub fn scamper_host_rr_opt_use(opt: *mut ScamperHostRrOptT) -> *mut ScamperHostRrOptT;
    pub fn scamper_host_rr_opt_free(opt: *mut ScamperHostRrOptT);
    pub fn scamper_host_rr_opt_elemc_get(opt: *const ScamperHostRrOptT) -> u16;
    pub fn scamper_host_rr_opt_elem_free(elem: *mut ScamperHostRrOptElemT);
    pub fn scamper_host_rr_opt_elem_get(
        opt: *const ScamperHostRrOptT,
        i: u16,
    ) -> *mut ScamperHostRrOptElemT;
    pub fn scamper_host_rr_opt_elem_use(
        elem: *mut ScamperHostRrOptElemT,
    ) -> *mut ScamperHostRrOptElemT;
    pub fn scamper_host_rr_opt_elem_code_get(elem: *const ScamperHostRrOptElemT) -> u16;
    pub fn scamper_host_rr_opt_elem_code_tostr(
        code: u16,
        b: *mut c_char,
        l: size_t,
    ) -> *mut c_char;
    pub fn scamper_host_rr_opt_elem_len_get(elem: *const ScamperHostRrOptElemT) -> u16;
    pub fn scamper_host_rr_opt_elem_data_get(elem: *const ScamperHostRrOptElemT) -> *const u8;

    pub fn scamper_host_rr_svcb_use(svcb: *mut ScamperHostRrSvcbT) -> *mut ScamperHostRrSvcbT;
    pub fn scamper_host_rr_svcb_free(svcb: *mut ScamperHostRrSvcbT);
    pub fn scamper_host_rr_svcb_target_get(svcb: *const ScamperHostRrSvcbT) -> *const c_char;
    pub fn scamper_host_rr_svcb_priority_get(svcb: *const ScamperHostRrSvcbT) -> u16;
    pub fn scamper_host_rr_svcb_paramc_get(svcb: *const ScamperHostRrSvcbT) -> u16;
    pub fn scamper_host_rr_svcb_param_free(param: *mut ScamperHostRrSvcbParamT);
    pub fn scamper_host_rr_svcb_param_get(
        svcb: *const ScamperHostRrSvcbT,
        i: u16,
    ) -> *mut ScamperHostRrSvcbParamT;
    pub fn scamper_host_rr_svcb_param_use(
        param: *mut ScamperHostRrSvcbParamT,
    ) -> *mut ScamperHostRrSvcbParamT;
    pub fn scamper_host_rr_svcb_param_key_get(param: *const ScamperHostRrSvcbParamT) -> u16;
    pub fn scamper_host_rr_svcb_param_key_tostr(
        code: u16,
        b: *mut c_char,
        l: size_t,
    ) -> *mut c_char;
    pub fn scamper_host_rr_svcb_param_len_get(param: *const ScamperHostRrSvcbParamT) -> u16;
    pub fn scamper_host_rr_svcb_param_val_get(
        param: *const ScamperHostRrSvcbParamT,
    ) -> *const u8;
}