Небольшая программа, которая печатает список доступных USB-устройств и затем мониторит добавление/удаление устройств и также их распечатывает.
Документация: libudev and Sysfs Tutorial.
Пример запуска
Код
Документация: libudev and Sysfs Tutorial.
Пример запуска
$ ./a.out usb usb_device exists 1d6b:0001 /dev/bus/usb/002/001 usb usb_device exists 046d:c05b /dev/bus/usb/002/002 usb usb_device exists 1d6b:0001 /dev/bus/usb/003/001 usb usb_device exists 1d6b:0001 /dev/bus/usb/004/001 usb usb_device exists 1d6b:0001 /dev/bus/usb/005/001 usb usb_device exists 1d6b:0002 /dev/bus/usb/001/001 usb usb_device add 8564:1000 /dev/bus/usb/001/026 usb usb_device remove 0000:0000 /dev/bus/usb/001/026 ^C
Код
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 | #include <libudev.h> #include <stdio.h> #define SUBSYSTEM "usb" static void print_device(struct udev_device *dev) { const char *action = udev_device_get_action(dev); if (! action) action = "exists"; const char *vendor = udev_device_get_sysattr_value(dev,"idVendor"); if (! vendor) vendor = "0000"; const char *product = udev_device_get_sysattr_value(dev,"idProduct"); if (! product) product = "0000"; printf("%s %s %6s %s:%s %s\n", udev_device_get_subsystem(dev), udev_device_get_devtype(dev), action, vendor, product, udev_device_get_devnode(dev)); } static void process_device(struct udev_device *dev) { if (dev) { if (udev_device_get_devnode(dev)) print_device(dev); udev_device_unref(dev); } } static void enumerate_devices(struct udev *udev) { struct udev_enumerate *enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate, SUBSYSTEM); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry; udev_list_entry_foreach(entry, devices) { const char *path = udev_list_entry_get_name(entry); struct udev_device *dev = udev_device_new_from_syspath(udev, path); process_device(dev); } udev_enumerate_unref(enumerate); } static void monitor_devices(struct udev *udev) { struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev"); udev_monitor_filter_add_match_subsystem_devtype(mon, SUBSYSTEM, NULL); udev_monitor_enable_receiving(mon); int fd = udev_monitor_get_fd(mon); while (1) { fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); int ret = select(fd+1, &fds, NULL, NULL, NULL); if (ret <= 0) break; if (FD_ISSET(fd, &fds)) { struct udev_device *dev = udev_monitor_receive_device(mon); process_device(dev); } } } int main (void) { struct udev *udev = udev_new(); if (! udev) { fprintf(stderr, "udev_new() failed\n"); return 1; } enumerate_devices(udev); monitor_devices(udev); udev_unref(udev); return 0; } |
Комментариев нет:
Отправить комментарий