summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-05-21 14:16:35 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-06-24 12:52:50 +0800
commit2723662cabd4d34d4155ab5d6668c591a20a086b (patch)
tree66b5fe222d9dd30d7713923b6693b842b4d56d0d
parent4a78c9a5327cad94a2c23b9bff8edcd77fb54fa9 (diff)
downloadtalos-petitboot-2723662cabd4d34d4155ab5d6668c591a20a086b.tar.gz
talos-petitboot-2723662cabd4d34d4155ab5d6668c591a20a086b.zip
discover: Add "cancel default boot" messages
Allow the default boot process to be cancelled, via a message with action PB_PROTOCOL_ACTION_CANCEL_DEFAULT. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--discover/device-handler.c29
-rw-r--r--discover/device-handler.h1
-rw-r--r--discover/discover-server.c28
-rw-r--r--lib/pb-protocol/pb-protocol.h1
4 files changed, 50 insertions, 9 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index 5b7c02e..e991662 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -32,6 +32,7 @@ struct device_handler {
struct waitset *waitset;
struct waiter *timeout_waiter;
+ bool default_enabled;
unsigned int sec_to_boot;
struct discover_boot_option *default_boot_option;
@@ -291,6 +292,7 @@ struct device_handler *device_handler_init(struct discover_server *server,
handler->waitset = waitset;
handler->dry_run = dry_run;
handler->default_boot_option = NULL;
+ handler->default_enabled = true;
list_init(&handler->unresolved_boot_options);
/* set up our mount point base */
@@ -434,6 +436,9 @@ static void set_default(struct device_handler *handler,
if (handler->default_boot_option)
return;
+ if (!handler->default_enabled)
+ return;
+
handler->default_boot_option = opt;
handler->sec_to_boot = DEFAULT_BOOT_TIMEOUT_SEC;
default_timeout(handler);
@@ -800,4 +805,28 @@ void device_handler_boot(struct device_handler *handler,
boot(handler, opt, cmd, handler->dry_run, boot_status, handler);
}
+
+void device_handler_cancel_default(struct device_handler *handler)
+{
+ struct boot_status status;
+
+ if (handler->timeout_waiter)
+ waiter_remove(handler->timeout_waiter);
+
+ handler->timeout_waiter = NULL;
+ handler->default_enabled = false;
+
+ /* we only send status if we had a default boot option queued */
+ if (!handler->default_boot_option)
+ return;
+
+ handler->default_boot_option = NULL;
+
+ status.type = BOOT_STATUS_INFO;
+ status.progress = -1;
+ status.detail = NULL;
+ status.message = "Default boot cancelled";
+
+ discover_server_notify_boot_status(handler->server, &status);
+}
#endif
diff --git a/discover/device-handler.h b/discover/device-handler.h
index 7182f00..60a33b7 100644
--- a/discover/device-handler.h
+++ b/discover/device-handler.h
@@ -90,5 +90,6 @@ struct discover_device *device_lookup_by_id(struct device_handler *handler,
void device_handler_boot(struct device_handler *handler,
struct boot_command *cmd);
+void device_handler_cancel_default(struct device_handler *handler);
#endif /* _DEVICE_HANDLER_H */
diff --git a/discover/discover-server.c b/discover/discover-server.c
index 67ce266..29816ee 100644
--- a/discover/discover-server.c
+++ b/discover/discover-server.c
@@ -182,20 +182,30 @@ static int discover_server_process_message(void *arg)
}
- if (message->action != PB_PROTOCOL_ACTION_BOOT) {
- pb_log("%s: invalid action %d\n", __func__, message->action);
- return 0;
- }
+ switch (message->action) {
+ case PB_PROTOCOL_ACTION_BOOT:
+ boot_command = talloc(client, struct boot_command);
+
+ rc = pb_protocol_deserialise_boot_command(boot_command,
+ message);
+ if (rc) {
+ pb_log("%s: no boot command?", __func__);
+ return 0;
+ }
+
+ device_handler_boot(client->server->device_handler,
+ boot_command);
+ break;
- boot_command = talloc(client, struct boot_command);
+ case PB_PROTOCOL_ACTION_CANCEL_DEFAULT:
+ device_handler_cancel_default(client->server->device_handler);
+ break;
- rc = pb_protocol_deserialise_boot_command(boot_command, message);
- if (rc) {
- pb_log("%s: no boot command?", __func__);
+ default:
+ pb_log("%s: invalid action %d\n", __func__, message->action);
return 0;
}
- device_handler_boot(client->server->device_handler, boot_command);
return 0;
}
diff --git a/lib/pb-protocol/pb-protocol.h b/lib/pb-protocol/pb-protocol.h
index 0390f66..aa79e66 100644
--- a/lib/pb-protocol/pb-protocol.h
+++ b/lib/pb-protocol/pb-protocol.h
@@ -18,6 +18,7 @@ enum pb_protocol_action {
/* PB_PROTOCOL_ACTION_BOOT_OPTION_REMOVE = 0x4, */
PB_PROTOCOL_ACTION_BOOT = 0x5,
PB_PROTOCOL_ACTION_STATUS = 0x6,
+ PB_PROTOCOL_ACTION_CANCEL_DEFAULT = 0x7,
};
struct pb_protocol_message {
OpenPOWER on IntegriCloud