Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
9.0 kB · 330 lines
Rust
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331use crate::{udev, udev_list};use std::{ffi, ptr, sync};
struct Device { properties: udev_list::ListEntry, sysattrs: udev_list::ListEntry, parent: Option<sync::Arc<Device>>, udev: *mut udev::udev,}
#[allow(non_camel_case_types)]#[repr(C)]pub struct udev_device { _private: [u8; 0],}
#[allow(non_camel_case_types)]type dev_t = u64;
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_syspath(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"SYSPATH".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_sysname(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"SYSNAME".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_sysnum(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"SYSNUM".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_devpath(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"DEVPATH".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_devnode(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"DEVNAME".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_seqnum(udev_device: *mut udev_device) -> ffi::c_ulonglong { let seqnum = udev_device_get_property_value(udev_device, c"SEQNUM".as_ptr()); if seqnum.is_null() { return 0; }
unsafe { std::ffi::CStr::from_ptr(seqnum) } .to_str() .ok() .and_then(|value| value.parse::<ffi::c_ulonglong>().ok()) .unwrap_or(0)}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_usec_since_initialized( _device: *mut udev_device,) -> ffi::c_ulonglong { 0}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_devnum(device: *mut udev_device) -> dev_t { let major = udev_device_get_property_value(device, c"DEVNAME".as_ptr()); let minor = udev_device_get_property_value(device, c"DEVNAME".as_ptr());
if major.is_null() || minor.is_null() { rustix::fs::makedev(0, 0); }
let major = unsafe { std::ffi::CStr::from_ptr(major) } .to_str() .ok() .and_then(|s| s.parse::<u32>().ok()) .unwrap_or(0);
let minor = unsafe { std::ffi::CStr::from_ptr(minor) } .to_str() .ok() .and_then(|s| s.parse::<u32>().ok()) .unwrap_or(0);
rustix::fs::makedev(major, minor)}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_devtype(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"DEVTYPE".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_subsystem(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"SUBSYSTEM".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_driver(device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(device, c"DRIVER".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_udev(device: *mut udev_device) -> *mut udev::udev { let Some(device) = (unsafe { device.cast::<Device>().as_ref() }) else { return ptr::null_mut(); };
device.udev}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_parent(udev_device: *mut udev_device) -> *mut udev_device { let Some(device) = (unsafe { udev_device.cast::<Device>().as_mut() }) else { return ptr::null_mut(); };
if let Some(parent) = device.parent.as_deref() { return (parent as *const Device).cast_mut().cast::<udev_device>(); }
let syspath = udev_device_get_syspath(udev_device); if syspath.is_null() { return ptr::null_mut(); }
let syspath = unsafe { ffi::CStr::from_ptr(syspath) }; let mut syspath = syspath.to_bytes().to_vec();
if !syspath.starts_with(b"/sys/") { return ptr::null_mut(); }
while let Some(relative_pos) = syspath[5..].iter().rposition(|&byte| byte == b'/') { let pos = relative_pos + 5; syspath.truncate(pos);
let Ok(candidate) = ffi::CString::new(syspath.clone()) else { break; };
let parent = udev_device_new_from_syspath(device.udev, candidate.as_ptr()); if parent.is_null() { continue; }
let parent = unsafe { sync::Arc::from_raw(parent.cast::<Device>()) }; let parent_ptr = sync::Arc::as_ptr(&parent).cast_mut().cast(); device.parent = Some(parent); return parent_ptr; }
ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_parent_with_subsystem_devtype( _device: *mut udev_device, _subsystem: *const ffi::c_char, _devtype: *const ffi::c_char,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_is_initialized(_device: *mut udev_device) -> ffi::c_int { 0}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_action(udev_device: *mut udev_device) -> *const ffi::c_char { udev_device_get_property_value(udev_device, c"ACTION".as_ptr())}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_has_tag( _device: *mut udev_device, _tag: *const ffi::c_char,) -> ffi::c_int { 0}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_devlinks_list_entry( udev_device: *mut udev_device,) -> *mut udev_list::udev_list_entry { let Some(device) = (unsafe { udev_device.cast::<Device>().as_ref() }) else { return ptr::null_mut(); };
udev_list::udev_list_entry_get_next( ptr::from_ref(&device.properties) .cast_mut() .cast::<udev_list::udev_list_entry>(), )}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_properties_list_entry( _device: *mut udev_device,) -> *mut udev_list::udev_list_entry { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_tags_list_entry( _device: *mut udev_device,) -> *mut udev_list::udev_list_entry { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_current_tags_list_entry( _device: *mut udev_device,) -> *mut udev_list::udev_list_entry { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_sysattr_list_entry( udev_device: *mut udev_device,) -> *mut udev_list::udev_list_entry { let Some(device) = (unsafe { udev_device.cast::<Device>().as_ref() }) else { return ptr::null_mut(); };
udev_list::udev_list_entry_get_next( ptr::from_ref(&device.sysattrs) .cast_mut() .cast::<udev_list::udev_list_entry>(), )}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_property_value( udev_device: *mut udev_device, key: *const ffi::c_char,) -> *const ffi::c_char { if key.is_null() { return ptr::null(); }
let Some(device) = (unsafe { udev_device.cast::<Device>().as_ref() }) else { return ptr::null_mut(); };
let properties = ptr::from_ref(&device.properties) .cast_mut() .cast::<udev_list::udev_list_entry>(); let entry = udev_list::udev_list_entry_get_by_name(properties, key);
udev_list::udev_list_entry_get_value(entry)}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_get_sysattr_value( _device: *mut udev_device, _sysattr: *const ffi::c_char,) -> *const ffi::c_char { ptr::null()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_set_sysattr_value( _device: *mut udev_device, _sysattr: *const ffi::c_char, _value: *const ffi::c_char,) -> ffi::c_int { 0}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_syspath( _udev: *mut udev::udev, _syspath: *const ffi::c_char,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_devnum( _udev: *mut udev::udev, _device_type: ffi::c_char, _devnum: dev_t,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_subsystem_sysname( _udev: *mut udev::udev, _subsystem: *const ffi::c_char, _sysname: *const ffi::c_char,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_uevent( _udev: *mut udev::udev, _buf: *mut ffi::c_char, _len: usize,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_device_id( _udev: *mut udev::udev, _id: *const ffi::c_char,) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_new_from_environment(_udev: *mut udev::udev) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_ref(_device: *mut udev_device) -> *mut udev_device { ptr::null_mut()}
#[unsafe(no_mangle)]pub extern "C" fn udev_device_unref(_device: *mut udev_device) -> *mut udev_device { ptr::null_mut()}