]> git.ozlabs.org Git - petitboot/blobdiff - discover/user-event.c
discover/event: Ensure event struct exists for async callers
[petitboot] / discover / user-event.c
index 8cad1a91a624f5f55cd17d49858edfab3820133c..d9f5bd4b9f2ab5fcd8934efe02fa1f704ce0de4b 100644 (file)
@@ -58,6 +58,10 @@ static const char *event_action_name(enum event_action action)
                return "url";
        case EVENT_ACTION_DHCP:
                return "dhcp";
+       case EVENT_ACTION_BOOT:
+               return "boot";
+       case EVENT_ACTION_SYNC:
+               return "sync";
        default:
                break;
        }
@@ -439,7 +443,37 @@ static int user_event_url(struct user_event *uev, struct event *event)
 
        url = event_get_param(event, "url");
        if (url)
-               device_handler_process_url(handler, url);
+               device_handler_process_url(handler, url, NULL, NULL);
+
+       return 0;
+}
+
+static int user_event_boot(struct user_event *uev, struct event *event)
+{
+       struct device_handler *handler = uev->handler;
+       struct boot_command *cmd = talloc(handler, struct boot_command);
+
+       cmd->option_id = talloc_strdup(cmd, event_get_param(event, "id"));
+       cmd->boot_image_file = talloc_strdup(cmd, event_get_param(event, "image"));
+       cmd->initrd_file = talloc_strdup(cmd, event_get_param(event, "initrd"));
+       cmd->dtb_file = talloc_strdup(cmd, event_get_param(event, "dtb"));
+       cmd->boot_args = talloc_strdup(cmd, event_get_param(event, "args"));
+
+       device_handler_boot(handler, cmd);
+
+       talloc_free(cmd);
+
+       return 0;
+}
+
+static int user_event_sync(struct user_event *uev, struct event *event)
+{
+       struct device_handler *handler = uev->handler;
+
+       if (strncasecmp(event->device, "all", strlen("all")) != 0)
+               device_sync_snapshots(handler, event->device);
+       else
+               device_sync_snapshots(handler, NULL);
 
        return 0;
 }
@@ -469,19 +503,27 @@ static void user_event_handle_message(struct user_event *uev, char *buf,
                break;
        case EVENT_ACTION_URL:
                result = user_event_url(uev, event);
-               break;
+               goto out;
        case EVENT_ACTION_CONF:
                result = user_event_conf(uev, event);
                break;
        case EVENT_ACTION_DHCP:
                result = user_event_dhcp(uev, event);
+               goto out;
+       case EVENT_ACTION_BOOT:
+               result = user_event_boot(uev, event);
+               break;
+       case EVENT_ACTION_SYNC:
+               result = user_event_sync(uev, event);
                break;
        default:
                break;
        }
 
+       /* user_event_url() and user_event_dhcp() will steal the event context,
+        * but all others still need to free */
        talloc_free(event);
-
+out:
        return;
 }