aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel/native/src
diff options
context:
space:
mode:
authordelta <darkussdelta@gmail.com>2023-05-12 16:18:24 +0200
committerdelta <darkussdelta@gmail.com>2023-05-12 16:18:24 +0200
commitf5612f081db0dc69f5c0ebc69e67fa3b098a9ad9 (patch)
tree7a04027efe5fede7f08688a9524c5dbe6628635b /.config/awesome/quarrel/native/src
parentea1bdf6585caed2c0ba8669ca5c3b3b92232281a (diff)
restructure services, add get_essid to quarrel.native and other wip work
Diffstat (limited to '.config/awesome/quarrel/native/src')
-rw-r--r--.config/awesome/quarrel/native/src/lenses/calculator.rs9
-rw-r--r--.config/awesome/quarrel/native/src/lib.rs3
-rw-r--r--.config/awesome/quarrel/native/src/net/mod.rs113
-rw-r--r--.config/awesome/quarrel/native/src/net/wireless.rs104
-rw-r--r--.config/awesome/quarrel/native/src/sound.rs17
5 files changed, 220 insertions, 26 deletions
diff --git a/.config/awesome/quarrel/native/src/lenses/calculator.rs b/.config/awesome/quarrel/native/src/lenses/calculator.rs
index 89b738e..c79dd42 100644
--- a/.config/awesome/quarrel/native/src/lenses/calculator.rs
+++ b/.config/awesome/quarrel/native/src/lenses/calculator.rs
@@ -13,14 +13,7 @@ use crate::lenses::entry::{
pub fn query<'a>(lua: &Lua, input: String) -> LuaResult<LuaTable> {
let result = match eval(input.trim(), true, Unit::Celsius, false) {
Ok(result) => {
- format!(
- "{}{}",
- result.value,
- match result.unit {
- Unit::NoUnit => "".to_owned(),
- _ => format!(" {:?}", result.unit),
- }
- )
+ format!("{result}")
}
Err(_) => return lua.create_table(),
};
diff --git a/.config/awesome/quarrel/native/src/lib.rs b/.config/awesome/quarrel/native/src/lib.rs
index d265d2d..e21e306 100644
--- a/.config/awesome/quarrel/native/src/lib.rs
+++ b/.config/awesome/quarrel/native/src/lib.rs
@@ -1,5 +1,5 @@
mod lenses;
-// mod sound;
+mod net;
use mlua::prelude::*;
@@ -11,6 +11,7 @@ fn qnative(lua: &Lua) -> LuaResult<LuaTable> {
let exports = lua.create_table()?;
exports.set("lenses", lenses)?;
+ exports.set("get_essid", lua.create_function(net::get_first_essid)?)?;
Ok(exports)
}
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,
+}
diff --git a/.config/awesome/quarrel/native/src/sound.rs b/.config/awesome/quarrel/native/src/sound.rs
deleted file mode 100644
index c398d70..0000000
--- a/.config/awesome/quarrel/native/src/sound.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-use std::{
- fs::File,
- io::BufReader,
- path::Path,
- time::Duration,
-};
-
-use mlua::prelude::*;
-use rodio::{
- Decoder,
- OutputStream,
- Sink,
-};
-
-pub fn play_sound(_: &Lua, file: String) -> LuaResult<()> {
-
-}