1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
extern crate libudev_sys as udev;
extern crate libc;
use std::ffi::CStr;
use std::str;
use libc::c_char;
fn main() {
unsafe {
let udev = udev::udev_new();
if !udev.is_null() {
enumerate_devices(udev);
udev::udev_unref(udev);
}
}
}
unsafe fn enumerate_devices(udev: *mut udev::udev) {
udev::udev_ref(udev);
let enumerate = udev::udev_enumerate_new(udev);
if !enumerate.is_null() {
list_devices(enumerate);
udev::udev_enumerate_unref(enumerate);
}
udev::udev_unref(udev);
}
unsafe fn list_devices(enumerate: *mut udev::udev_enumerate) {
udev::udev_enumerate_ref(enumerate);
if udev::udev_enumerate_scan_devices(enumerate) < 0 {
udev::udev_enumerate_unref(enumerate);
return;
}
print_devices(
udev::udev_enumerate_get_udev(enumerate),
udev::udev_enumerate_get_list_entry(enumerate));
udev::udev_enumerate_unref(enumerate);
}
unsafe fn print_devices(udev: *mut udev::udev, list_entry: *mut udev::udev_list_entry) {
if list_entry.is_null() {
return;
}
let syspath = udev::udev_list_entry_get_name(list_entry);
let device = udev::udev_device_new_from_syspath(udev, syspath);
if !device.is_null() {
print_device(device);
}
print_devices(udev, udev::udev_list_entry_get_next(list_entry));
}
unsafe fn print_device(device: *mut udev::udev_device) {
udev::udev_device_ref(device);
println!("");
let initialized = udev::udev_device_get_is_initialized(device) != 0;
let since = udev::udev_device_get_usec_since_initialized(device);
println!("initialized: {} usec={}", initialized, since);
println!(" devnum: {}", udev::udev_device_get_devnum(device));
println!(" devpath: {}", unwrap_cstr(udev::udev_device_get_devpath(device)));
println!(" subsystem: {}", unwrap_cstr(udev::udev_device_get_subsystem(device)));
println!(" devtype: {}", unwrap_cstr(udev::udev_device_get_devtype(device)));
println!(" syspath: {}", unwrap_cstr(udev::udev_device_get_syspath(device)));
println!(" sysname: {}", unwrap_cstr(udev::udev_device_get_sysname(device)));
println!(" sysnum: {}", unwrap_cstr(udev::udev_device_get_sysnum(device)));
println!(" devnode: {}", unwrap_cstr(udev::udev_device_get_devnode(device)));
println!(" driver: {}", unwrap_cstr(udev::udev_device_get_driver(device)));
println!(" properties:");
print_device_properties(udev::udev_device_get_properties_list_entry(device), device);
println!(" attributes:");
print_device_attributes(udev::udev_device_get_sysattr_list_entry(device), device);
udev::udev_device_unref(device);
}
unsafe fn print_device_properties(list_entry: *mut udev::udev_list_entry, device: *mut udev::udev_device) {
if list_entry.is_null() {
return;
}
let propname = udev::udev_list_entry_get_name(list_entry);
let propval = udev::udev_device_get_property_value(device, propname);
println!("{:>15}: {}", unwrap_cstr(propname), unwrap_cstr(propval));
print_device_properties(udev::udev_list_entry_get_next(list_entry), device);
}
unsafe fn print_device_attributes(list_entry: *mut udev::udev_list_entry, device: *mut udev::udev_device) {
if list_entry.is_null() {
return;
}
let attrname = udev::udev_list_entry_get_name(list_entry);
let attrval = udev::udev_device_get_sysattr_value(device, attrname);
println!("{:>15}: {}", unwrap_cstr(attrname), unwrap_cstr(attrval));
print_device_attributes(udev::udev_list_entry_get_next(list_entry), device);
}
unsafe fn unwrap_cstr<'a>(ptr: *const c_char) -> &'a str {
if ptr.is_null() {
""
}
else {
str::from_utf8(CStr::from_ptr(ptr).to_bytes()).unwrap_or("")
}
}
|