#[macro_export]
macro_rules! seccomp_arg_filter {
($argno:ident <= $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Le, $value)
};
($argno:ident < $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Lt, $value)
};
($argno:ident >= $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Ge, $value)
};
($argno:ident > $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Gt, $value)
};
($argno:ident == $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Eq, $value)
};
($argno:ident != $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::Ne, $value)
};
($argno:ident & $mask:tt == $value:expr) => {
$crate::SeccompArgumentFilter::new(match_argno!($argno), $crate::SeccompilerComparator::MaskedEq($mask), $value)
};
($_other:expr) => {compile_error!("usage: `arg[0-5] {<=, <, >=, >, ==, !=} <value>` or `arg[0-5] & <mask> == <value>`")};
}
#[doc(hidden)]
#[macro_export]
macro_rules! match_argno {
(arg0) => {0};
(arg1) => {1};
(arg2) => {2};
(arg3) => {3};
(arg4) => {4};
(arg5) => {5};
($_other:expr) => {compile_error!("Seccomp argument filters must start with argX where X is 0-5")};
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test_comparison_le() {
let cmp = seccomp_arg_filter!(arg0 <= 10);
assert_eq!(
cmp,
SeccompArgumentFilter::new(0, SeccompilerComparator::Le, 10)
);
}
#[test]
fn test_comparison_lt() {
let cmp = seccomp_arg_filter!(arg1 < 10);
assert_eq!(
cmp,
SeccompArgumentFilter::new(1, SeccompilerComparator::Lt, 10)
);
}
#[test]
fn test_comparison_ge() {
let cmp = seccomp_arg_filter!(arg2 >= 5);
assert_eq!(
cmp,
SeccompArgumentFilter::new(2, SeccompilerComparator::Ge, 5)
);
}
#[test]
fn test_comparison_gt() {
let cmp = seccomp_arg_filter!(arg3 > 200);
assert_eq!(
cmp,
SeccompArgumentFilter::new(3, SeccompilerComparator::Gt, 200)
);
}
#[test]
fn test_comparison_eq() {
let cmp = seccomp_arg_filter!(arg4 == 0);
assert_eq!(
cmp,
SeccompArgumentFilter::new(4, SeccompilerComparator::Eq, 0)
);
}
#[test]
fn test_comparison_ne() {
let cmp = seccomp_arg_filter!(arg5 != 80);
assert_eq!(
cmp,
SeccompArgumentFilter::new(5, SeccompilerComparator::Ne, 80)
);
}
#[test]
fn test_comparison_mask() {
let cmp = seccomp_arg_filter!(arg2 & 0x1337 == 0x37);
assert_eq!(
cmp,
SeccompArgumentFilter::new(2, SeccompilerComparator::MaskedEq(0x1337), 0x37)
);
}
}