discover: Add "cancel default boot" messages
authorJeremy Kerr <jk@ozlabs.org>
Tue, 21 May 2013 06:16:35 +0000 (14:16 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Mon, 24 Jun 2013 04:52:50 +0000 (12:52 +0800)
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>
discover/device-handler.c
discover/device-handler.h
discover/discover-server.c
lib/pb-protocol/pb-protocol.h

index 5b7c02e52d5ceec0b1157f97f0f552c3dbf90712..e991662d6a372eb5e45dc8625b75f0314d1261d9 100644 (file)
@@ -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
index 7182f002a203364a937c10ce6d984f943798ffce..60a33b7bfc9107c5fba31177d794f13a5eb6313b 100644 (file)
@@ -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 */
index 67ce266c4c433fced328f810360094cd8e60f10f..29816ee6a3614d4ad4500b2b7d31307e43fb19dd 100644 (file)
@@ -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;
 }
index 0390f6661fe55e73e5c0035749dea1528d67a5f4..aa79e668635e4613e8049aca171627dabe719b7c 100644 (file)
@@ -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 {