extern crate libc;
#[allow(non_camel_case_types)]
pub type scmp_filter_ctx = libc::c_void;
pub const __NR_SCMP_ERROR: libc::c_int = -1;
pub const SCMP_ACT_KILL: u32 = 0x00000000;
pub const SCMP_ACT_KILL_PROCESS: u32 = 0x80000000;
pub const SCMP_ACT_TRAP: u32 = 0x00030000;
#[allow(non_snake_case)]
pub fn SCMP_ACT_ERRNO(x: u32) -> u32 { 0x00050000 | ((x) & 0x0000ffff) }
#[allow(non_snake_case)]
pub fn SCMP_ACT_TRACE(x: u32) -> u32 { 0x7ff00000 | ((x) & 0x0000ffff) }
pub const SCMP_ACT_ALLOW: u32 = 0x7fff0000;
#[allow(non_camel_case_types)]
#[derive(Debug,Clone,Copy)]
#[repr(C)]
pub enum scmp_filter_attr {
_SCMP_FLTATR_MIN,
SCMP_FLTATR_ACT_DEFAULT,
SCMP_FLTATR_ACT_BADARCH,
SCMP_FLTATR_CTL_NNP,
_SCMP_FLTATR_MAX,
}
#[allow(non_camel_case_types)]
#[derive(Debug,Clone,Copy)]
#[repr(C)]
pub enum scmp_compare {
_SCMP_CMP_MIN = 0,
SCMP_CMP_NE = 1,
SCMP_CMP_LT = 2,
SCMP_CMP_LE = 3,
SCMP_CMP_EQ = 4,
SCMP_CMP_GE = 5,
SCMP_CMP_GT = 6,
SCMP_CMP_MASKED_EQ = 7,
_SCMP_CMP_MAX,
}
#[allow(non_camel_case_types)]
#[derive(Debug,Clone,Copy)]
#[repr(C)]
pub enum scmp_arch {
SCMP_ARCH_NATIVE = 0x0,
SCMP_ARCH_X86 = 0x40000003,
SCMP_ARCH_X86_64 = 0xc000003e,
SCMP_ARCH_X32 = 0x4000003e,
SCMP_ARCH_ARM = 0x40000028,
SCMP_ARCH_AARCH64 = 0xc00000b7,
SCMP_ARCH_MIPS = 0x8,
SCMP_ARCH_MIPS64 = 0x80000008,
SCMP_ARCH_MIPS64N32 = 0xa0000008,
SCMP_ARCH_MIPSEL = 0x40000008,
SCMP_ARCH_MIPSEL64 = 0xc0000008,
SCMP_ARCH_MIPSEL64N32 = 0xe0000008,
SCMP_ARCH_PPC = 0x14,
SCMP_ARCH_PPC64 = 0x80000015,
SCMP_ARCH_PPC64LE = 0xc0000015,
SCMP_ARCH_S390 = 0x16,
SCMP_ARCH_S390X = 0x80000016,
}
#[allow(non_camel_case_types)]
pub type scmp_datum_t = u64;
#[derive(Debug)]
#[repr(C)]
pub struct scmp_arg_cmp {
pub arg: libc::c_uint,
pub op: scmp_compare,
pub datum_a: scmp_datum_t,
pub datum_b: scmp_datum_t,
}
#[link(name = "seccomp")]
extern {
pub fn seccomp_init(def_action: u32) -> *mut scmp_filter_ctx;
pub fn seccomp_reset(ctx: *mut scmp_filter_ctx, def_action: u32) -> libc::c_int;
pub fn seccomp_release(ctx: *mut scmp_filter_ctx);
pub fn seccomp_arch_add(ctx: *mut scmp_filter_ctx, arch_token: u32) -> libc::c_int;
pub fn seccomp_arch_remove(ctx: *mut scmp_filter_ctx, arch_token: u32)-> libc::c_int;
pub fn seccomp_load(ctx: *const scmp_filter_ctx) -> libc::c_int;
pub fn seccomp_attr_get(ctx: *const scmp_filter_ctx,
attr: scmp_filter_attr, value: *mut u32) -> libc::c_int;
pub fn seccomp_attr_set(ctx: *mut scmp_filter_ctx,
attr: scmp_filter_attr, value: u32) -> libc::c_int;
pub fn seccomp_syscall_resolve_name(name: *const libc::c_char) -> libc::c_int;
pub fn seccomp_syscall_priority(ctx: *mut scmp_filter_ctx,
syscall: libc::c_int, priority: u8) -> libc::c_int;
pub fn seccomp_rule_add(ctx: *mut scmp_filter_ctx,
action: u32, syscall: libc::c_int, arg_cnt: libc::c_uint, ...) -> libc::c_int;
pub fn seccomp_rule_add_array(ctx: *mut scmp_filter_ctx,
action: u32, syscall: libc::c_int, arg_cnt: libc::c_uint,
arg_array: *const scmp_arg_cmp) -> libc::c_int;
pub fn seccomp_rule_add_exact(ctx: *mut scmp_filter_ctx, action: u32,
syscall: libc::c_int, arg_cnt: libc::c_uint, ...) -> libc::c_int;
pub fn seccomp_rule_add_exact_array(ctx: *mut scmp_filter_ctx,
action: u32, syscall: libc::c_int, arg_cnt: libc::c_uint,
arg_array: *const scmp_arg_cmp) -> libc::c_int;
pub fn seccomp_export_pfc(ctx: *const scmp_filter_ctx, fd: libc::c_int) -> libc::c_int;
pub fn seccomp_export_bpf(ctx: *const scmp_filter_ctx, fd: libc::c_int) -> libc::c_int;
}
#[test]
fn does_it_even_work() {
unsafe {
let context = seccomp_init(SCMP_ACT_ALLOW);
let comparator = scmp_arg_cmp {
arg: 0,
op: scmp_compare::SCMP_CMP_EQ,
datum_a: 1000,
datum_b: 0,
};
assert!(seccomp_rule_add(context, SCMP_ACT_KILL, 105, 1, comparator) == 0);
assert!(seccomp_load(context) == 0);
}
}