diff --git a/.gitmodules b/.gitmodules index 62bc8f7..0cf7a29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "rust/crates/libnfqws/zapret"] path = rust/crates/libnfqws/zapret url = https://github.com/bol-van/zapret.git +[submodule "rust/crates/libnfqws2/zapret2"] + path = rust/crates/libnfqws2/zapret2 + url = https://github.com/bol-van/zapret2 diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 025b27a..a6fb2d8 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -385,6 +385,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "libnfqws2" +version = "0.0.1" +dependencies = [ + "bindgen", + "cc", + "glob", + "once_cell", +] + [[package]] name = "lock_api" version = "0.4.14" diff --git a/rust/crates/libnfqws2/Cargo.toml b/rust/crates/libnfqws2/Cargo.toml new file mode 100644 index 0000000..0397e88 --- /dev/null +++ b/rust/crates/libnfqws2/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "libnfqws2" +version.workspace = true +edition.workspace = true +repository.workspace = true + +[build-dependencies] +cc = "1.2.43" +once_cell = "1.21.3" +glob = "0.3.3" +bindgen = "0.72.1" diff --git a/rust/crates/libnfqws2/build.rs b/rust/crates/libnfqws2/build.rs new file mode 100644 index 0000000..0e04f29 --- /dev/null +++ b/rust/crates/libnfqws2/build.rs @@ -0,0 +1,68 @@ +use once_cell::sync::Lazy; +use std::env; +use std::path::{Path, PathBuf}; + +macro_rules! rel_manifest_path { + ($name:ident, $path:expr) => { + static $name: Lazy = Lazy::new(|| { + let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + Path::new(&manifest_dir).join($path) + }); + }; +} + +rel_manifest_path!(NFQ, "zapret2/nfq2"); +rel_manifest_path!(NFQ_CRYPTO, "zapret2/nfq2/crypto"); + +fn main() { + cc::Build::new() + .files( + glob::glob(&format!("{}/*.c", NFQ.display())) + .unwrap() + .filter_map(Result::ok), + ) + .files( + glob::glob(&format!("{}/*.c", NFQ_CRYPTO.display())) + .unwrap() + .filter_map(Result::ok), + ) + .include(&*NFQ) + .include(&*NFQ_CRYPTO) + .flag("-w") + .define("main", "nfqws2_main") + .compile("libnfqws2.a"); + + println!("cargo:rustc-link-lib=z"); + println!("cargo:rustc-link-lib=netfilter_queue"); + println!("cargo:rustc-link-lib=nfnetlink"); + println!("cargo:rustc-link-lib=mnl"); + + let _ = env::var("NETFILTER_LIBS") + .map(|libs| println!("cargo:rustc-link-search=native={libs}/lib")); + + println!("cargo:rustc-link-lib=static=nfqws2"); + println!("cargo:rerun-if-changed={}", NFQ.display()); + println!("cargo:rerun-if-changed={}", NFQ_CRYPTO.display()); + println!("cargo:rerun-if-changed=build.rs"); + + let mut builder = bindgen::Builder::default(); + + for header in glob::glob(&format!("{}/*.h", NFQ.display())) + .unwrap() + .filter_map(Result::ok) + { + builder = builder.header(header.to_string_lossy()); + } + + builder = builder.clang_arg("-Dmain=nfqws2_main"); + + let bindings = builder + .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) + .generate() + .expect("Unable to generate libnfqws2"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("libnfqws2.rs")) + .expect("Couldn't write libnfqws2"); +} diff --git a/rust/crates/libnfqws2/src/lib.rs b/rust/crates/libnfqws2/src/lib.rs new file mode 100644 index 0000000..0442572 --- /dev/null +++ b/rust/crates/libnfqws2/src/lib.rs @@ -0,0 +1,2 @@ +#![allow(warnings)] +include!(concat!(env!("OUT_DIR"), "/libnfqws2.rs")); diff --git a/rust/crates/libnfqws2/zapret2 b/rust/crates/libnfqws2/zapret2 new file mode 160000 index 0000000..36ee42b --- /dev/null +++ b/rust/crates/libnfqws2/zapret2 @@ -0,0 +1 @@ +Subproject commit 36ee42bc8cd914fdc2126610a0c3aef6ce6efb9f