- case UDEV_ACTION_REMOVE:
- rc = handle_remove_event(handler, event);
- break;
+ /* add device to handler device array */
+ device_handler_add(handler, device);
+
+ return 0;
+
+fail:
+ talloc_free(device);
+ return 0;
+}
+
+static int handle_remove_user_event(struct device_handler *handler,
+ struct event *event)
+{
+ struct device *device = device_handler_find(handler, event->device);
+
+ if (!device)
+ return 0;
+
+ discover_server_notify_remove(handler->server, device);
+
+ /* remove device from handler device array */
+ device_handler_remove(handler, device);
+
+ talloc_free(device);
+ return 0;
+}
+
+typedef int (*event_handler)(struct device_handler *, struct event *);
+
+static event_handler handlers[EVENT_TYPE_MAX][EVENT_ACTION_MAX] = {
+ [EVENT_TYPE_UDEV] = {
+ [EVENT_ACTION_ADD] = handle_add_udev_event,
+ [EVENT_ACTION_REMOVE] = handle_remove_udev_event,
+ },
+ [EVENT_TYPE_USER] = {
+ [EVENT_ACTION_ADD] = handle_add_user_event,
+ [EVENT_ACTION_REMOVE] = handle_remove_user_event,