libudev: test - use epoll
This commit is contained in:
parent
578cd5101d
commit
f2fd4d2723
|
@ -18,10 +18,12 @@
|
|||
#include <getopt.h>
|
||||
#include <syslog.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/epoll.h>
|
||||
|
||||
#include "libudev.h"
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
static void log_fn(struct udev *udev,
|
||||
int priority, const char *file, int line, const char *fn,
|
||||
const char *format, va_list args)
|
||||
|
@ -220,55 +222,81 @@ static int test_enumerate_print_list(struct udev_enumerate *enumerate)
|
|||
static int test_monitor(struct udev *udev)
|
||||
{
|
||||
struct udev_monitor *udev_monitor;
|
||||
fd_set readfds;
|
||||
int fd;
|
||||
int fd_ep;
|
||||
int fd_udev = -1;
|
||||
struct epoll_event ep_udev, ep_stdin;
|
||||
|
||||
fd_ep = epoll_create1(EPOLL_CLOEXEC);
|
||||
if (fd_ep < 0) {
|
||||
printf("error creating epoll fd: %m\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
|
||||
if (udev_monitor == NULL) {
|
||||
printf("no socket\n");
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
fd_udev = udev_monitor_get_fd(udev_monitor);
|
||||
|
||||
if (udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "block", NULL) < 0 ||
|
||||
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL) < 0 ||
|
||||
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device") < 0) {
|
||||
printf("filter failed\n");
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (udev_monitor_enable_receiving(udev_monitor) < 0) {
|
||||
printf("bind failed\n");
|
||||
return -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
fd = udev_monitor_get_fd(udev_monitor);
|
||||
FD_ZERO(&readfds);
|
||||
memset(&ep_udev, 0, sizeof(struct epoll_event));
|
||||
ep_udev.events = EPOLLIN;
|
||||
ep_udev.data.fd = fd_udev;
|
||||
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_udev, &ep_udev) < 0) {
|
||||
printf("fail to add fd to epoll: %m\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(&ep_stdin, 0, sizeof(struct epoll_event));
|
||||
ep_stdin.events = EPOLLIN;
|
||||
ep_stdin.data.fd = STDIN_FILENO;
|
||||
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, STDIN_FILENO, &ep_stdin) < 0) {
|
||||
printf("fail to add fd to epoll: %m\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
struct udev_device *device;
|
||||
int fdcount;
|
||||
|
||||
FD_SET(STDIN_FILENO, &readfds);
|
||||
FD_SET(fd, &readfds);
|
||||
struct epoll_event ev[4];
|
||||
struct udev_device *device;
|
||||
int i;
|
||||
|
||||
printf("waiting for events from udev, press ENTER to exit\n");
|
||||
fdcount = select(fd+1, &readfds, NULL, NULL, NULL);
|
||||
printf("select fd count: %i\n", fdcount);
|
||||
fdcount = epoll_wait(fd_ep, ev, ARRAY_SIZE(ev), -1);
|
||||
printf("epoll fd count: %i\n", fdcount);
|
||||
|
||||
if (FD_ISSET(fd, &readfds)) {
|
||||
device = udev_monitor_receive_device(udev_monitor);
|
||||
if (device == NULL) {
|
||||
printf("no device from socket\n");
|
||||
continue;
|
||||
for (i = 0; i < fdcount; i++) {
|
||||
if (ev[i].data.fd == fd_udev && ev[i].events & EPOLLIN) {
|
||||
device = udev_monitor_receive_device(udev_monitor);
|
||||
if (device == NULL) {
|
||||
printf("no device from socket\n");
|
||||
continue;
|
||||
}
|
||||
print_device(device);
|
||||
udev_device_unref(device);
|
||||
}
|
||||
print_device(device);
|
||||
udev_device_unref(device);
|
||||
}
|
||||
|
||||
if (FD_ISSET(STDIN_FILENO, &readfds)) {
|
||||
printf("exiting loop\n");
|
||||
break;
|
||||
if (ev[i].data.fd == STDIN_FILENO && ev[i].events & EPOLLIN) {
|
||||
printf("exiting loop\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (fd_ep >= 0)
|
||||
close(fd_ep);
|
||||
udev_monitor_unref(udev_monitor);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue