am d118394d: Merge "Properly handle cases of multiple inotify events" into jb-mr2-dev

* commit 'd118394d444107dba4430723d248863ff412c444':
  Properly handle cases of multiple inotify events
This commit is contained in:
Igor Murashkin 2013-03-26 01:14:42 +00:00 committed by Android Git Automerger
commit 858c8fe7f9

View file

@ -223,56 +223,61 @@ int usb_host_read_event(struct usb_host_context *context)
char event_buf[512]; char event_buf[512];
char path[100]; char path[100];
int i, ret, done = 0; int i, ret, done = 0;
int j, event_size; int offset = 0;
int wd; int wd;
ret = read(context->fd, event_buf, sizeof(event_buf)); ret = read(context->fd, event_buf, sizeof(event_buf));
if (ret >= (int)sizeof(struct inotify_event)) { if (ret >= (int)sizeof(struct inotify_event)) {
event = (struct inotify_event *)event_buf; while (offset < ret) {
wd = event->wd; event = (struct inotify_event*)&event_buf[offset];
if (wd == context->wdd) { done = 0;
if ((event->mask & IN_CREATE) && !strcmp(event->name, "bus")) { wd = event->wd;
watch_existing_subdirs(context, context->wds, MAX_USBFS_WD_COUNT); if (wd == context->wdd) {
done = find_existing_devices(context->cb_added, context->data); if ((event->mask & IN_CREATE) && !strcmp(event->name, "bus")) {
} else if ((event->mask & IN_DELETE) && !strcmp(event->name, "bus")) { watch_existing_subdirs(context, context->wds, MAX_USBFS_WD_COUNT);
for (i = 0; i < MAX_USBFS_WD_COUNT; i++) { done = find_existing_devices(context->cb_added, context->data);
if (context->wds[i] >= 0) { } else if ((event->mask & IN_DELETE) && !strcmp(event->name, "bus")) {
for (i = 0; i < MAX_USBFS_WD_COUNT; i++) {
if (context->wds[i] >= 0) {
inotify_rm_watch(context->fd, context->wds[i]);
context->wds[i] = -1;
}
}
}
} else if (wd == context->wds[0]) {
i = atoi(event->name);
snprintf(path, sizeof(path), USB_FS_DIR "/%s", event->name);
D("%s subdirectory %s: index: %d\n", (event->mask & IN_CREATE) ?
"new" : "gone", path, i);
if (i > 0 && i < MAX_USBFS_WD_COUNT) {
if (event->mask & IN_CREATE) {
ret = inotify_add_watch(context->fd, path,
IN_CREATE | IN_DELETE);
if (ret >= 0)
context->wds[i] = ret;
done = find_existing_devices_bus(path, context->cb_added,
context->data);
} else if (event->mask & IN_DELETE) {
inotify_rm_watch(context->fd, context->wds[i]); inotify_rm_watch(context->fd, context->wds[i]);
context->wds[i] = -1; context->wds[i] = -1;
} }
} }
} } else {
} else if (wd == context->wds[0]) { for (i = 1; (i < MAX_USBFS_WD_COUNT) && !done; i++) {
i = atoi(event->name); if (wd == context->wds[i]) {
snprintf(path, sizeof(path), USB_FS_DIR "/%s", event->name); snprintf(path, sizeof(path), USB_FS_DIR "/%03d/%s", i, event->name);
D("%s subdirectory %s: index: %d\n", (event->mask & IN_CREATE) ? if (event->mask == IN_CREATE) {
"new" : "gone", path, i); D("new device %s\n", path);
if (i > 0 && i < MAX_USBFS_WD_COUNT) { done = context->cb_added(path, context->data);
if (event->mask & IN_CREATE) { } else if (event->mask == IN_DELETE) {
ret = inotify_add_watch(context->fd, path, D("gone device %s\n", path);
IN_CREATE | IN_DELETE); done = context->cb_removed(path, context->data);
if (ret >= 0) }
context->wds[i] = ret;
done = find_existing_devices_bus(path, context->cb_added,
context->data);
} else if (event->mask & IN_DELETE) {
inotify_rm_watch(context->fd, context->wds[i]);
context->wds[i] = -1;
}
}
} else {
for (i = 1; (i < MAX_USBFS_WD_COUNT) && !done; i++) {
if (wd == context->wds[i]) {
snprintf(path, sizeof(path), USB_FS_DIR "/%03d/%s", i, event->name);
if (event->mask == IN_CREATE) {
D("new device %s\n", path);
done = context->cb_added(path, context->data);
} else if (event->mask == IN_DELETE) {
D("gone device %s\n", path);
done = context->cb_removed(path, context->data);
} }
} }
} }
offset += sizeof(struct inotify_event) + event->len;
} }
} }