X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fpb-config%2Fpb-config.c;h=915a01d47abaaab8a7929eef6f2abddc7e90d1fb;hp=315d9905659369ea8224f4ef8318de459138786e;hb=52bec18801b226b57f53d9f075addd2c07caa3db;hpb=9b7a01a40fd9476583fb5f7dfbd4006e45d8e291 diff --git a/lib/pb-config/pb-config.c b/lib/pb-config/pb-config.c index 315d990..915a01d 100644 --- a/lib/pb-config/pb-config.c +++ b/lib/pb-config/pb-config.c @@ -1,30 +1,46 @@ #include +#include #include #include "pb-config.h" #include "storage.h" +void *config_ctx; static struct config *config; static struct config_storage *storage; -static void config_set_defaults(struct config *config) +void config_set_defaults(struct config *config) { config->autoboot_enabled = true; + config->autoboot_timeout_sec = 10; config->network.interfaces = NULL; config->network.n_interfaces = 0; + config->network.dns_servers = NULL; + config->network.n_dns_servers = 0; + + config->n_boot_priorities = 2; + config->boot_priorities = talloc_array(config, struct boot_priority, + config->n_boot_priorities); + config->boot_priorities[0].type = DEVICE_TYPE_NETWORK; + config->boot_priorities[1].type = DEVICE_TYPE_DISK; + } -static void dump_config(struct config *config) +void dump_config(struct config *config); +void dump_config(struct config *config) { - int i; + unsigned int i; pb_log("configuration:\n"); - pb_log(" autoboot: %s\n", - config->autoboot_enabled ? "enabled" : "disabled"); + if (config->autoboot_enabled) + pb_log(" autoboot: enabled, %d sec\n", + config->autoboot_timeout_sec); + else + pb_log(" autoboot: disabled\n"); if (config->network.n_interfaces || config->network.n_dns_servers) pb_log(" network configuration:\n"); @@ -59,7 +75,9 @@ static void dump_config(struct config *config) int config_init(void *ctx) { - config = talloc(ctx, struct config); + config_ctx = talloc_new(ctx); + + config = talloc(config_ctx, struct config); config_set_defaults(config); storage = create_powerpc_nvram_storage(config); @@ -71,6 +89,41 @@ int config_init(void *ctx) return 0; } +int config_set(struct config *newconfig) +{ + int rc; + + if (!storage || !storage->save) + return -1; + + if (newconfig == config) + return 0; + + pb_log("new configuration data received\n"); + dump_config(newconfig); + + rc = storage->save(storage, newconfig); + + if (!rc) + config = talloc_steal(config_ctx, newconfig); + else + pb_log("error saving new configuration; changes lost\n"); + + return rc; +} + +/* A non-exported function to allow the test infrastructure to initialise + * (and change) the configuration variables */ +struct parser_test; +struct config __attribute__((unused)) *test_config_init( + struct parser_test *test); +struct config *test_config_init(struct parser_test *test) +{ + config = talloc(test, struct config); + config_set_defaults(config); + return config; +} + const struct config *config_get(void) { return config; @@ -86,6 +139,6 @@ void config_set_autoboot(bool autoboot_enabled) int config_fini(void) { - talloc_free(config); + talloc_free(config_ctx); return 0; }