我想读取我连接到的SSID。
我正在使用ioctl来实现这一点。我正在尝试使用nix::ioctl_read
来读取它。我是新手,所以我不确定我所做的是否正确。以下是我尝试的方法。
const SIOCGIWESSID: u8 = 0x8B;
ioctl_read!(read_essid, SIOCGIWESSID, 0x8B1B, Iwreq);
#[derive(Debug)]
pub struct Essid {
length: u8,
pointer: [u8; 33],
}
#[derive(Debug)]
pub struct WreqData {
essid: Essid,
}
#[derive(Debug)]
#[repr(C)]
pub struct Iwreq {
frn_name: [u8; 33],
u: WreqData,
}
fn get_essid() -> String {
const WESSID_LEN: usize = 33;
let fd = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
None,
)
.unwrap();
let pointer: [u8; WESSID_LEN] = [0; WESSID_LEN];
let mut ifr_tmp = [0u8; WESSID_LEN];
let interface_name = "wlp2s0\0";
ifr_tmp[..interface_name.len()].copy_from_slice(interface_name.as_bytes());
let mut data = Iwreq {
frn_name: ifr_tmp,
u: WreqData {
essid: Essid {
length: WESSID_LEN as u8,
pointer,
},
},
};
println!("{}", unsafe { read_essid(fd, &mut data).unwrap() });
println!("{:?}", data);
unimplemented!()
}
字符串
我从ioctl调用中得到错误“ENOTTY”。我想我向ioctl_read传递了不正确的参数。
我可以传递什么给ioctl_read!
来使它工作?或者我应该研究另一种解决方案?
1条答案
按热度按时间8yparm6h1#
看起来你有两个主要问题:
v6.5
版本中的struct iwreq
定义:include/uapi/linux/wireless.h
)ioctl
编号不遵循较新的约定。它们使用任意硬编码编号。nix
crate文档将这些编号称为 badioctl
s。因此,您可以使用ioctl_read_bad!
宏下面是一个修改后的版本,似乎在我的机器上工作:
字符串
或者,可以使用netlink套接字获得相同的信息。例如:
型
如果你想看完整版,我已经把这个例子/测试代码上传到GitLab:https://gitlab.com/harryausten/ssid-query。希望这对你有帮助!