From: Jeremy Kerr Date: Fri, 18 Oct 2013 02:31:03 +0000 (+0800) Subject: config: Implement config messages X-Git-Tag: v1.0.0~353 X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=7832d10c59cfe7f06e19bc6f0b6acaac1a552618 config: Implement config messages On client connect, send a PB_PROTOCOL_ACTION_CONFIG message. Signed-off-by: Jeremy Kerr --- diff --git a/discover/discover-server.c b/discover/discover-server.c index 41a4fde..bd631f6 100644 --- a/discover/discover-server.c +++ b/discover/discover-server.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -190,6 +191,24 @@ static int write_system_info_message(struct discover_server *server, return client_write_message(server, client, message); } +static int write_config_message(struct discover_server *server, + struct client *client, const struct config *config) +{ + struct pb_protocol_message *message; + int len; + + len = pb_protocol_config_len(config); + + message = pb_protocol_create_message(client, + PB_PROTOCOL_ACTION_CONFIG, len); + if (!message) + return -1; + + pb_protocol_serialise_config(config, message->payload, len); + + return client_write_message(server, client, message); +} + static int discover_server_process_message(void *arg) { struct pb_protocol_message *message; @@ -263,6 +282,11 @@ static int discover_server_process_connection(void *arg) if (rc) return 0; + /* send config to client */ + rc = write_config_message(server, client, config_get()); + if (rc) + return 0; + /* send existing devices to client */ n_devices = device_handler_get_device_count(server->device_handler); for (i = 0; i < n_devices; i++) { @@ -332,6 +356,15 @@ void discover_server_notify_system_info(struct discover_server *server, write_system_info_message(server, client, sysinfo); } +void discover_server_notify_config(struct discover_server *server, + const struct config *config) +{ + struct client *client; + + list_for_each_entry(&server->clients, client, list) + write_config_message(server, client, config); +} + void discover_server_set_device_source(struct discover_server *server, struct device_handler *handler) { diff --git a/discover/discover-server.h b/discover/discover-server.h index d22fb38..97f53b9 100644 --- a/discover/discover-server.h +++ b/discover/discover-server.h @@ -9,6 +9,7 @@ struct boot_option; struct boot_status; struct system_info; struct device; +struct config; struct discover_server *discover_server_init(struct waitset *waitset); @@ -27,4 +28,6 @@ void discover_server_notify_boot_status(struct discover_server *server, struct boot_status *status); void discover_server_notify_system_info(struct discover_server *server, const struct system_info *sysinfo); +void discover_server_notify_config(struct discover_server *server, + const struct config *config); #endif /* _DISCOVER_SERVER_H */ diff --git a/test/parser/handler.c b/test/parser/handler.c index d9057eb..97ae388 100644 --- a/test/parser/handler.c +++ b/test/parser/handler.c @@ -36,6 +36,13 @@ void discover_server_notify_boot_status(struct discover_server *server, (void)status; } +void discover_server_notify_config(struct discover_server *server, + struct config *config) +{ + (void)server; + (void)config; +} + void parser_init(void) { } diff --git a/ui/common/discover-client.c b/ui/common/discover-client.c index fea8c57..de210bd 100644 --- a/ui/common/discover-client.c +++ b/ui/common/discover-client.c @@ -126,6 +126,13 @@ static void update_sysinfo(struct discover_client *client, talloc_free(sysinfo); } +static void update_config(struct discover_client *client, + struct config *config) +{ + if (client->ops.update_config) + client->ops.update_config(config, client->ops.cb_arg); +} + static int discover_client_process(void *arg) { struct discover_client *client = arg; @@ -133,6 +140,7 @@ static int discover_client_process(void *arg) struct system_info *sysinfo; struct boot_status *status; struct boot_option *opt; + struct config *config; struct device *dev; char *dev_id; int rc; @@ -194,6 +202,16 @@ static int discover_client_process(void *arg) } update_sysinfo(client, sysinfo); break; + case PB_PROTOCOL_ACTION_CONFIG: + config = talloc_zero(ctx, struct config); + + rc = pb_protocol_deserialise_config(config, message); + if (rc) { + pb_log("%s: invalid config message?\n", __func__); + return 0; + } + update_config(client, config); + break; default: pb_log("%s: unknown action %d\n", __func__, message->action); } diff --git a/ui/common/discover-client.h b/ui/common/discover-client.h index feca63b..6aa0432 100644 --- a/ui/common/discover-client.h +++ b/ui/common/discover-client.h @@ -27,6 +27,7 @@ struct discover_client_ops { void (*device_remove)(struct device *device, void *arg); void (*update_status)(struct boot_status *status, void *arg); void (*update_sysinfo)(struct system_info *sysinfo, void *arg); + void (*update_config)(struct config *sysinfo, void *arg); void *cb_arg; };