udevw
is a header-only libudev
wrapper written in modern C++. It covers
all of libudev
with the exception of those functions that are marked as
deprecated in the most recent version of the library.
In general, udevw
mirrors the libudev
API quite closely, with list handling
being the one major exception. Wrapper equivalents of the
udev_*_get_*_list_entry
family of functions, which return C-style linked lists,
instead return STL containers.
#include <iostream>
#include <udevw.hpp>
int main() {
auto udev = udevw::Udev::create();
auto enumerate = udevw::Enumerate::create(udev);
enumerate.add_match_subsystem("input");
auto devices_list = enumerate.scan_devices();
for (const auto &device_entry : devices_list) {
auto device = udevw::Device::create_from_syspath(udev, device_entry.name);
auto syspath = device.get_syspath();
if (syspath)
std::cout << *syspath << std::endl;
}
auto monitor = udevw::Monitor::create_from_netlink(udev, "udev");
monitor.filter_add_match_subsystem("input"); // devtype = nullptr implied
monitor.enable_receiving();
int fd = monitor.get_fd();
for (;;) {
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
if (select(fd +1, &fds, nullptr, nullptr, nullptr) > 0 && FD_ISSET(fd, &fds)) {
auto device = monitor.receive_device();
auto syspath = device.get_syspath();
if (!syspath)
continue;
auto action = device.get_action();
if (!action)
continue;
if (*action == "add")
std::cout << "[+] " << *syspath << std::endl;
else if (*action == "remove")
std::cout << "[-] " << *syspath << std::endl;
}
}
}