diff options
author | delta <darkussdelta@gmail.com> | 2023-05-12 16:18:24 +0200 |
---|---|---|
committer | delta <darkussdelta@gmail.com> | 2023-05-12 16:18:24 +0200 |
commit | f5612f081db0dc69f5c0ebc69e67fa3b098a9ad9 (patch) | |
tree | 7a04027efe5fede7f08688a9524c5dbe6628635b /.config/awesome/quarrel/native/src/net | |
parent | ea1bdf6585caed2c0ba8669ca5c3b3b92232281a (diff) |
restructure services, add get_essid to quarrel.native and other wip work
Diffstat (limited to '.config/awesome/quarrel/native/src/net')
-rw-r--r-- | .config/awesome/quarrel/native/src/net/mod.rs | 113 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/net/wireless.rs | 104 |
2 files changed, 217 insertions, 0 deletions
diff --git a/.config/awesome/quarrel/native/src/net/mod.rs b/.config/awesome/quarrel/native/src/net/mod.rs new file mode 100644 index 0000000..c9d617c --- /dev/null +++ b/.config/awesome/quarrel/native/src/net/mod.rs @@ -0,0 +1,113 @@ +// This is an attempt to port the iwgetid and iwlib code + +mod wireless; +use std::{ + ffi::{ + c_char, + c_int, + c_uchar, + c_void, + }, + mem::size_of, + os::fd::RawFd, + str, +}; + +use mlua::prelude::*; +use nix::{ + ioctl_read_bad, + libc::IF_NAMESIZE, + sys::socket::{ + socket as open_socket, + AddressFamily, + SockFlag, + SockType, + }, + unistd::close +}; +use wireless::{ + IfConf, + IfConfData, + IwPoint, + IwReq, + IwReqData, + IwReqName, + IW_ESSID_MAX_SIZE, + SIOCGIFCONF, + SIOCGIWESSID, +}; + +ioctl_read_bad!(ioctl_get_interfaces, SIOCGIFCONF, IfConf); +ioctl_read_bad!(ioctl_get_essid, SIOCGIWESSID, IwReq); + +pub fn get_first_essid(_: &Lua, _: ()) -> LuaResult<String> { + type Buffer = [c_char; 1024]; + let mut buffer: Buffer = [0; 1024]; + + let mut if_conf = IfConf { + ifc_len: size_of::<Buffer>() as c_int, + data: IfConfData { + ifc_buf: buffer.as_mut_ptr(), + }, + }; + + let mut if_req; + let socket = get_first_socket().map_err(LuaError::external)?; + + unsafe { + ioctl_get_interfaces(socket, &mut if_conf).map_err(LuaError::external)?; + if_req = if_conf.data.ifc_req; + } + + for _ in 0..if_conf.ifc_len / size_of::<IfConf>() as c_int { + if let Ok(essid) = get_essid(socket, unsafe { *if_req }.ifr_name) { + close(socket).map_err(LuaError::external)?; + return Ok(essid); + }; + + unsafe { if_req = if_req.add(1) }; + } + + close(socket).map_err(LuaError::external)?; + Err(LuaError::external("couldn't find any valid interfaces")) +} + +fn get_essid(socket: RawFd, if_name: [c_char; IF_NAMESIZE]) -> LuaResult<String> { + let mut essid: [c_uchar; (IW_ESSID_MAX_SIZE + 1) as usize] = + [0; (IW_ESSID_MAX_SIZE + 1) as usize]; + let mut wrq = IwReq { + ifr_ifrn: IwReqName { ifrn_name: if_name }, + u: IwReqData { + essid: IwPoint { + pointer: essid.as_mut_ptr().cast::<c_void>(), + length: IW_ESSID_MAX_SIZE + 1, + flags: 0, + }, + }, + }; + + unsafe { + ioctl_get_essid(socket, &mut wrq).map_err(LuaError::external)?; + } + + Ok(str::from_utf8(essid.as_slice()) + .map_err(LuaError::external)? + .to_owned()) +} + +fn get_first_socket() -> LuaResult<RawFd> { + let families = [ + AddressFamily::Inet, + AddressFamily::Ipx, + AddressFamily::Ax25, + AddressFamily::AppleTalk, + ]; + + for family in families { + if let Ok(socket) = open_socket(family, SockType::Datagram, SockFlag::empty(), None) { + return Ok(socket); + } + } + + Err(LuaError::external("couldn't get a valid kernel socket")) +} diff --git a/.config/awesome/quarrel/native/src/net/wireless.rs b/.config/awesome/quarrel/native/src/net/wireless.rs new file mode 100644 index 0000000..d3999db --- /dev/null +++ b/.config/awesome/quarrel/native/src/net/wireless.rs @@ -0,0 +1,104 @@ +use std::ffi::{ + c_char, + c_int, + c_void, +}; + +use nix::libc::{ + __s16, + __s32, + __u16, + __u8, + ifreq as IfReq, + sockaddr as SockAddr, + IF_NAMESIZE, +}; + +pub static SIOCGIFCONF: c_int = 0x8912; +pub static SIOCGIWESSID: c_int = 0x8B1B; +pub const IW_ESSID_MAX_SIZE: u16 = 32; + +#[repr(C)] +pub struct IfConf { + pub ifc_len: c_int, + pub data: IfConfData, +} + +#[repr(C)] +pub union IfConfData { + pub ifc_req: *mut IfReq, + pub ifc_buf: *mut c_char, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwPoint { + pub pointer: *mut c_void, + pub length: __u16, + pub flags: __u16, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwFreq { + pub m: __s32, + pub e: __s16, + pub i: __u8, + pub flags: __u8, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwParam { + pub value: __s32, + pub fixed: __u8, + pub disabled: __u8, + pub flags: __u16, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwQuality { + pub qual: __u8, + pub level: __u8, + pub noise: __u8, + pub updated: __u8, +} + +#[repr(C)] +pub struct IwReq { + pub ifr_ifrn: IwReqName, + pub u: IwReqData, +} + +#[repr(C)] +pub union IwReqName { + pub ifrn_name: [c_char; IF_NAMESIZE], +} + +#[repr(C)] +pub union IwReqData { + pub name: [c_char; IF_NAMESIZE], + + pub essid: IwPoint, + pub nwid: IwParam, + pub freq: IwFreq, + + pub sens: IwParam, + pub bitrate: IwParam, + pub txpower: IwParam, + pub rts: IwParam, + pub frag: IwParam, + pub mode: u32, + pub retry: IwParam, + + pub encoding: IwPoint, + pub power: IwParam, + pub qual: IwQuality, + + pub ap_addr: SockAddr, + pub addr: SockAddr, + + pub param: IwParam, + pub data: IwPoint, +} |