#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(dead_code)]
use std::mem::size_of;
use std::os::raw::{c_int, c_uint, c_void};
use std::ptr;
use crate::ported::batterymeter::ACPresence;
use crate::ported::networkiometer::NetworkIOData;
use crate::ported::signalspanel::SignalItem;
const VM_LOADAVG: c_int = 2;
#[repr(C)]
struct loadavg {
ldavg: [u32; 3],
fscale: libc::c_long,
}
pub static Platform_signals: [SignalItem; 34] = [
SignalItem {
name: " 0 Cancel",
number: 0,
},
SignalItem {
name: " 1 SIGHUP",
number: 1,
},
SignalItem {
name: " 2 SIGINT",
number: 2,
},
SignalItem {
name: " 3 SIGQUIT",
number: 3,
},
SignalItem {
name: " 4 SIGILL",
number: 4,
},
SignalItem {
name: " 5 SIGTRAP",
number: 5,
},
SignalItem {
name: " 6 SIGABRT",
number: 6,
},
SignalItem {
name: " 7 SIGEMT",
number: 7,
},
SignalItem {
name: " 8 SIGFPE",
number: 8,
},
SignalItem {
name: " 9 SIGKILL",
number: 9,
},
SignalItem {
name: "10 SIGBUS",
number: 10,
},
SignalItem {
name: "11 SIGSEGV",
number: 11,
},
SignalItem {
name: "12 SIGSYS",
number: 12,
},
SignalItem {
name: "13 SIGPIPE",
number: 13,
},
SignalItem {
name: "14 SIGALRM",
number: 14,
},
SignalItem {
name: "15 SIGTERM",
number: 15,
},
SignalItem {
name: "16 SIGURG",
number: 16,
},
SignalItem {
name: "17 SIGSTOP",
number: 17,
},
SignalItem {
name: "18 SIGTSTP",
number: 18,
},
SignalItem {
name: "19 SIGCONT",
number: 19,
},
SignalItem {
name: "20 SIGCHLD",
number: 20,
},
SignalItem {
name: "21 SIGTTIN",
number: 21,
},
SignalItem {
name: "22 SIGTTOU",
number: 22,
},
SignalItem {
name: "23 SIGIO",
number: 23,
},
SignalItem {
name: "24 SIGXCPU",
number: 24,
},
SignalItem {
name: "25 SIGXFSZ",
number: 25,
},
SignalItem {
name: "26 SIGVTALRM",
number: 26,
},
SignalItem {
name: "27 SIGPROF",
number: 27,
},
SignalItem {
name: "28 SIGWINCH",
number: 28,
},
SignalItem {
name: "29 SIGINFO",
number: 29,
},
SignalItem {
name: "30 SIGUSR1",
number: 30,
},
SignalItem {
name: "31 SIGUSR2",
number: 31,
},
SignalItem {
name: "32 SIGTHR",
number: 32,
},
SignalItem {
name: "33 SIGLIBRT",
number: 33,
},
];
pub const Platform_numberOfSignals: u32 = Platform_signals.len() as u32;
pub fn Platform_init() -> bool {
true
}
pub fn Platform_done() {
}
pub fn Platform_setBindings() {
}
pub fn Platform_getUptime() -> c_int {
let mut bootTime: libc::timeval = unsafe { std::mem::zeroed() };
let mib: [c_int; 2] = [libc::CTL_KERN, libc::KERN_BOOTTIME];
let mut size = size_of::<libc::timeval>();
let err = unsafe {
libc::sysctl(
mib.as_ptr() as *mut c_int,
2,
&mut bootTime as *mut libc::timeval as *mut c_void,
&mut size,
ptr::null_mut(),
0,
)
};
if err != 0 {
return -1;
}
let mut currTime: libc::timeval = unsafe { std::mem::zeroed() };
unsafe { libc::gettimeofday(&mut currTime, ptr::null_mut()) };
(currTime.tv_sec - bootTime.tv_sec) as c_int
}
pub fn Platform_getLoadAverage(one: &mut f64, five: &mut f64, fifteen: &mut f64) {
let mut loadAverage: loadavg = unsafe { std::mem::zeroed() };
let mib: [c_int; 2] = [libc::CTL_VM, VM_LOADAVG];
let mut size = size_of::<loadavg>();
let err = unsafe {
libc::sysctl(
mib.as_ptr() as *mut c_int,
2,
&mut loadAverage as *mut loadavg as *mut c_void,
&mut size,
ptr::null_mut(),
0,
)
};
if err != 0 {
*one = 0.0;
*five = 0.0;
*fifteen = 0.0;
return;
}
*one = loadAverage.ldavg[0] as f64 / loadAverage.fscale as f64;
*five = loadAverage.ldavg[1] as f64 / loadAverage.fscale as f64;
*fifteen = loadAverage.ldavg[2] as f64 / loadAverage.fscale as f64;
}
pub fn Platform_getMaxPid() -> libc::pid_t {
let mut maxPid: c_int = 0;
let mut size = size_of::<c_int>();
let err = unsafe {
libc::sysctlbyname(
b"kern.pid_max\0".as_ptr() as *const libc::c_char,
&mut maxPid as *mut c_int as *mut c_void,
&mut size,
ptr::null_mut(),
0,
)
};
if err != 0 {
return 999999;
}
maxPid
}
pub fn Platform_setCPUValues() {
todo!("port of dragonflybsd/Platform.c:204 — Meter::host typed as LinuxMachine")
}
pub fn Platform_setMemoryValues() {
todo!("port of dragonflybsd/Platform.c:240 — Meter::host typed as LinuxMachine")
}
pub fn Platform_setSwapValues() {
todo!("port of dragonflybsd/Platform.c:258 — Meter::host typed as LinuxMachine")
}
pub fn Platform_getProcessEnv(pid: libc::pid_t) -> Option<String> {
let _ = pid; None
}
pub fn Platform_getProcessLocks() {
todo!("port of dragonflybsd/Platform.c:270 — needs FileLocks_ProcessData type")
}
pub fn Platform_getFileDescriptors() {
todo!("port of dragonflybsd/Platform.c:275 — needs Generic_getFileDescriptors_sysctl")
}
pub fn Platform_getDiskIO() {
todo!("port of dragonflybsd/Platform.c:279 — needs libdevstat (getdevs/selectdevs) FFI")
}
pub fn Platform_getNetworkIO(data: &mut NetworkIOData) -> bool {
let mut ifaddrs: *mut libc::ifaddrs = ptr::null_mut();
if unsafe { libc::getifaddrs(&mut ifaddrs) } != 0 {
return false;
}
let mut ifa = ifaddrs;
while !ifa.is_null() {
let cur = unsafe { &*ifa };
ifa = cur.ifa_next;
if cur.ifa_addr.is_null() {
continue;
}
if unsafe { (*cur.ifa_addr).sa_family } as c_int != libc::AF_LINK {
continue;
}
if cur.ifa_flags & libc::IFF_LOOPBACK as c_uint != 0 {
continue;
}
let ifd = cur.ifa_data as *const libc::if_data;
if ifd.is_null() {
continue;
}
let ifd = unsafe { &*ifd };
data.bytesReceived += ifd.ifi_ibytes as u64;
data.packetsReceived += ifd.ifi_ipackets as u64;
data.bytesTransmitted += ifd.ifi_obytes as u64;
data.packetsTransmitted += ifd.ifi_opackets as u64;
}
unsafe { libc::freeifaddrs(ifaddrs) };
true
}
pub fn Platform_getBattery(percent: &mut f64, isOnAC: &mut ACPresence) {
let mut life: c_int = 0;
let mut life_len = size_of::<c_int>();
if unsafe {
libc::sysctlbyname(
b"hw.acpi.battery.life\0".as_ptr() as *const libc::c_char,
&mut life as *mut c_int as *mut c_void,
&mut life_len,
ptr::null_mut(),
0,
)
} == -1
{
*percent = f64::NAN;
} else {
*percent = life as f64;
}
let mut acline: c_int = 0;
let mut acline_len = size_of::<c_int>();
if unsafe {
libc::sysctlbyname(
b"hw.acpi.acline\0".as_ptr() as *const libc::c_char,
&mut acline as *mut c_int as *mut c_void,
&mut acline_len,
ptr::null_mut(),
0,
)
} == -1
{
*isOnAC = ACPresence::AC_ERROR;
} else {
*isOnAC = if acline == 0 {
ACPresence::AC_ABSENT
} else {
ACPresence::AC_PRESENT
};
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signal_table_matches_c() {
assert_eq!(Platform_signals.len(), 34);
assert_eq!(Platform_numberOfSignals, 34);
for (i, s) in Platform_signals.iter().enumerate() {
assert_eq!(s.number, i as i32);
}
assert_eq!(Platform_signals[0].name, " 0 Cancel");
assert_eq!(Platform_signals[9].name, " 9 SIGKILL");
assert_eq!(Platform_signals[15].name, "15 SIGTERM");
assert_eq!(Platform_signals[33].name, "33 SIGLIBRT");
}
}