X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=e65eb61ebc2e353fb4880b4b59260c1f9c969a73;hp=6e03ef3fa159136b6015983a0054411cb7f126c8;hb=0fdc5cc3f296db134729fe58e074c20084b99459;hpb=6d51866f409e90274ff8cfb06b92a6c828692698;ds=sidebyside diff --git a/discover/device-handler.c b/discover/device-handler.c index 6e03ef3..e65eb61 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -387,46 +387,31 @@ static int handle_remove_user_event(struct device_handler *handler, 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, + } +}; + int device_handler_event(struct device_handler *handler, struct event *event) { - int rc = 0; - - switch (event->type) { - case EVENT_TYPE_UDEV: - switch (event->action) { - case EVENT_ACTION_ADD: - rc = handle_add_udev_event(handler, event); - break; - case EVENT_ACTION_REMOVE: - rc = handle_remove_udev_event(handler, event); - break; - default: - pb_log("%s unknown action: %d\n", __func__, - event->action); - break; - } - break; - case EVENT_TYPE_USER: - switch (event->action) { - case EVENT_ACTION_ADD: - rc = handle_add_user_event(handler, event); - break; - case EVENT_ACTION_REMOVE: - rc = handle_remove_user_event(handler, event); - break; - default: - pb_log("%s unknown action: %d\n", __func__, - event->action); - break; - } - break; - default: - pb_log("%s unknown type: %d\n", __func__, event->type); - break; + if (event->type >= EVENT_TYPE_MAX || + event->action >= EVENT_ACTION_MAX || + !handlers[event->type][event->action]) { + pb_log("%s unknown type/action: %d/%d\n", __func__, + event->type, event->action); + return 0; } - return rc; + return handlers[event->type][event->action](handler, event); } struct device_handler *device_handler_init(struct discover_server *server)