1

我正在使用nftnl-rs构建一个 nftables 规则表,并取得了巨大的成功。但是现在我想知道系统中是否已经存在同名的表。我在 nftnl-rs 中发现了两个nftnl/src/table.rs似乎正是为此而设计的函数:get_tables_nlmsg()get_tables_cb()。但是我无法成功使用它们。get_tables_cb()的文档字符串说它是用来处理前者的输出,但get_tables_nlmsg()返回 a Vec<u8>,显然包含创建的 nlmsghdr 的内存地址,而get_tables_cb()将 a&nlmsghdr作为参数。

具体来说,我试过:

use std::collections::HashSet;
use std::ffi::CString;
use nftnl{self, nftnl_sys::libc};

fn dump_tables() -> Result<(), Box<dyn std::error::Error> {
    let mut tables: &mut HashSet<CString> = &mut HashSet::new();
    let mut buffer = nftnl::table::get_tables_nlmsg(0);
    let buffer = buffer.as_ptr() as *const libc::nlmsghdr;

    nftnl::table::get_tables_cb(&&buffer, &mut tables);
    println!("{:?}", tables);
    Ok(())
}

rustc 抱怨它期望 an&nlmsghdr并得到 a &&*const nlmsghdr,而我无法将前者转换为后者。我浏览了源代码和示例,没有看到这个铸造案例出现。在源代码中来回跳转,我发现 Nomicon 的一部分谈论似乎适用于的不透明结构nlmsghdr,但也不能解决我的问题。事实上,我对函数声明有点困惑:

pub fn get_tables_cb(header: &libc::nlmsghdr, tables: &mut HashSet<CString>) -> libc::c_int

如果*const libc::nlmsghdr是外来的 Struct,到底能&libc::nlmsghdr是什么?会不会是 nftnl-rs 的源代码中有错字?

4

1 回答 1

1

使用 Coder-256 的建议,可以mnl::cb_run2()从姐妹包mnl-rs中找到,它可以nftnl::tables::get_tables_cb()在接收到 netlink 数据包时用作回调。由于如果数据太大而无法放入一个 NlMsg 中,netlink 数据包可能会被打包,因此可能会像这样使用它:

use std::collections::HashSet;
use mnl;
use nftnl;

fn dump_tables() -> Result<(), Box<dyn std::error::Error>> {
    let seq = 0;
    let tables = &mut HashSet::new();
    let mut buffer = nftnl::table::get_tables_nlmsg(seq);
    let socket = mnl::Socket::new(mnl::Bus::Netfilter)?;

    socket.send(&buffer)?;
    // Answer may be multi-packed, loop over what we get.
    loop {
        let chars_written = socket.recv(&mut *buffer)?;
        if chars_written == 0 { break; }
        let message = &buffer[..chars_written];
        match mnl::cb_run2(message, seq, socket.portid(), nftnl::table::get_tables_cb, tables)? {
            mnl::CbResult::Stop => break,
            mnl::CbResult::Ok => ()
        }
    }
    println!("{:?}", tables);
    Ok(())
}

我必须承认我仍然不知道究竟是什么&libc::nlmsghdr意思,如何以及为什么要建造一个;我很乐意接受任何能够启发这一点的答案。

于 2021-10-09T17:55:23.393 回答