main.cpp
#include <stdio.h>
#include "monitorusb.h"
int main()
{
monitorusb* m_monitor = new monitorusb;
m_monitor->run();
return 0;
}
monitorusb.h
#ifndef MONITORUSB_H
#define MONITORUSB_H
#include <libudev.h>
#include <thread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
class monitorusb
{
public:
monitorusb();
void run();
private:
struct udev *udev;
struct udev_enumerate *enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device *dev;
struct udev_monitor *mon;
int fd;
};
#endif // MONITORUSB_H
monitorusb.cpp
#include "monitorusb.h"
monitorusb::monitorusb()
{
udev = udev_new();
if (!udev) {
printf("error!!!\n");
}
mon = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", NULL);
udev_monitor_enable_receiving(mon);
fd = udev_monitor_get_fd(mon);
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "usb");
udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, devices) {
const char *path;
path = udev_list_entry_get_name(dev_list_entry);
dev = udev_device_new_from_syspath(udev, path);
dev = udev_device_get_parent_with_subsystem_devtype(
dev,
"usb",
"usb_device");
if (!dev) {
printf("Unable to find parent usb device.");
fflush(stdout);
}
udev_device_unref(dev);
}
udev_enumerate_unref(enumerate);
}
void monitorusb::run()
{
char buf[10];
char buf_devpath[50];
fd_set fds;
struct timeval tv;
int ret;
while (true) {
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 0;
tv.tv_usec = 0;
ret = select(fd+1, &fds, NULL, NULL, &tv);
if (ret > 0 && FD_ISSET(fd, &fds)) {
dev = udev_monitor_receive_device(mon);
if (dev) {
strcpy(buf_devpath, udev_device_get_devpath(dev));
strcpy(buf, udev_device_get_action(dev));
fflush(stdout);
printf(" Action: %s\n", udev_device_get_action(dev));
fflush(stdout);
udev_device_unref(dev);
}
else {
printf("No Device from receive_device(). An error occured.\n");
fflush(stdout);
}
}
sleep(1);
printf(".");
fflush(stdout);
}
udev_unref(udev);
}