Process multiple inotify events
If multiple inotify events are presented, process *all* of them. This can happen when several device adds are pushed simultaneously. handle_inotify() was refactored. Signed-off-by: Peter Hurley <phurley@charter.net> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
ea4acf08bc
commit
c6569f39f1
35
src/fw.c
35
src/fw.c
|
@ -360,21 +360,16 @@ handle_device_event(raw1394handle_t handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
handle_inotify(raw1394handle_t handle, struct epoll_closure *ec,
|
process_inotify_event(fw_handle_t fwhandle, struct inotify_event *event)
|
||||||
__uint32_t events)
|
|
||||||
{
|
{
|
||||||
fw_handle_t fwhandle = handle->mode.fw;
|
|
||||||
struct inotify_event *event;
|
|
||||||
char filename[32];
|
char filename[32];
|
||||||
struct fw_cdev_get_info info;
|
struct fw_cdev_get_info info;
|
||||||
struct fw_cdev_event_bus_reset reset;
|
struct fw_cdev_event_bus_reset reset;
|
||||||
struct epoll_event ep;
|
struct epoll_event ep;
|
||||||
int i, len, fd, phy_id, fname_str_sz;
|
int i, fd, phy_id, fname_str_sz;
|
||||||
|
|
||||||
event = (struct inotify_event *) fwhandle->buffer;
|
|
||||||
len = read(fwhandle->inotify_fd, event, BUFFER_SIZE);
|
|
||||||
if (!(event->mask & IN_CREATE))
|
if (!(event->mask & IN_CREATE))
|
||||||
return -1;
|
return 0;
|
||||||
if (!is_fw_device_name(event->name))
|
if (!is_fw_device_name(event->name))
|
||||||
return 0;
|
return 0;
|
||||||
snprintf(filename, sizeof filename, FW_DEVICE_DIR "/%s", event->name);
|
snprintf(filename, sizeof filename, FW_DEVICE_DIR "/%s", event->name);
|
||||||
|
@ -433,6 +428,30 @@ handle_inotify(raw1394handle_t handle, struct epoll_closure *ec,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
handle_inotify(raw1394handle_t handle, struct epoll_closure *ec,
|
||||||
|
__uint32_t events)
|
||||||
|
{
|
||||||
|
fw_handle_t fwhandle = handle->mode.fw;
|
||||||
|
struct inotify_event *event;
|
||||||
|
int len;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
event = (struct inotify_event *) fwhandle->buffer;
|
||||||
|
len = read(fwhandle->inotify_fd, event, BUFFER_SIZE);
|
||||||
|
|
||||||
|
while (len >= sizeof(struct inotify_event)) {
|
||||||
|
retval = process_inotify_event(fwhandle, event);
|
||||||
|
if (retval == -1)
|
||||||
|
break;
|
||||||
|
len -= sizeof(struct inotify_event) + event->len;
|
||||||
|
event = (struct inotify_event *) ((char *)event +
|
||||||
|
(sizeof(struct inotify_event) + event->len));
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
int fw_loop_iterate(raw1394handle_t handle)
|
int fw_loop_iterate(raw1394handle_t handle)
|
||||||
{
|
{
|
||||||
int i, count, retval = 0;
|
int i, count, retval = 0;
|
||||||
|
|
Reference in New Issue