X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fpb-config%2Fstorage-powerpc-nvram.c;h=e6bf7df5544408900d5b1c24fc0f9d608a076798;hp=4b1647955996dcc17633caca9c7c655285ebd9d2;hb=2b41985dde73e71daad90c36fa5d06c199da3ae1;hpb=d6166b471a9356355ed16747de3c0febd4b8cd3e diff --git a/lib/pb-config/storage-powerpc-nvram.c b/lib/pb-config/storage-powerpc-nvram.c index 4b16479..e6bf7df 100644 --- a/lib/pb-config/storage-powerpc-nvram.c +++ b/lib/pb-config/storage-powerpc-nvram.c @@ -188,7 +188,7 @@ static const char *get_param(struct powerpc_nvram_storage *nv, return NULL; } -static int parse_hwaddr(struct network_config *config, char *str) +static int parse_hwaddr(struct interface_config *ifconf, char *str) { int i; @@ -207,65 +207,76 @@ static int parse_hwaddr(struct network_config *config, char *str) if (endp != byte + 2) return -1; - config->hwaddr[i] = x & 0xff; + ifconf->hwaddr[i] = x & 0xff; } return 0; } -static int parse_one_network_config(struct network_config *config, +static int parse_one_interface_config(struct config *config, char *confstr) { + struct interface_config *ifconf; char *tok, *saveptr; + ifconf = talloc(config, struct interface_config); + if (!confstr || !strlen(confstr)) - return -1; + goto out_err; /* first token should be the mac address */ tok = strtok_r(confstr, ",", &saveptr); if (!tok) - return -1; + goto out_err; - if (parse_hwaddr(config, tok)) - return -1; + if (parse_hwaddr(ifconf, tok)) + goto out_err; /* second token is the method */ tok = strtok_r(NULL, ",", &saveptr); if (!tok || !strlen(tok) || !strcmp(tok, "ignore")) { - config->ignore = true; - return 0; - } + ifconf->ignore = true; - if (!strcmp(tok, "dhcp")) { - config->method = CONFIG_METHOD_DHCP; + } else if (!strcmp(tok, "dhcp")) { + ifconf->method = CONFIG_METHOD_DHCP; } else if (!strcmp(tok, "static")) { - config->method = CONFIG_METHOD_STATIC; + ifconf->method = CONFIG_METHOD_STATIC; /* ip/mask, [optional] gateway, [optional] dns */ tok = strtok_r(NULL, ",", &saveptr); if (!tok) - return -1; - config->static_config.address = - talloc_strdup(config, tok); + goto out_err; + ifconf->static_config.address = + talloc_strdup(ifconf, tok); tok = strtok_r(NULL, ",", &saveptr); if (tok) { - config->static_config.gateway = - talloc_strdup(config, tok); + ifconf->static_config.gateway = + talloc_strdup(ifconf, tok); tok = strtok_r(NULL, ",", &saveptr); } if (tok) { - config->static_config.dns = + ifconf->static_config.dns = talloc_strdup(config, tok); } } else { pb_log("Unknown network configuration method %s\n", tok); - return -1; + goto out_err; } + config->network.interfaces = talloc_realloc(config, + config->network.interfaces, + struct interface_config *, + ++config->network.n_interfaces); + + config->network.interfaces[config->network.n_interfaces - 1] = ifconf; + return 0; +out_err: + talloc_free(ifconf); + return -1; } static void populate_network_config(struct powerpc_nvram_storage *nv, @@ -282,29 +293,14 @@ static void populate_network_config(struct powerpc_nvram_storage *nv, val = talloc_strdup(config, cval); for (i = 0; ; i++) { - struct network_config *netconf; char *tok, *saveptr; - int rc; tok = strtok_r(i == 0 ? val : NULL, " ", &saveptr); if (!tok) break; - netconf = talloc(nv, struct network_config); - - rc = parse_one_network_config(netconf, tok); - if (rc) { - talloc_free(netconf); - continue; - } - - config->network_configs = talloc_realloc(nv, - config->network_configs, - struct network_config *, - ++config->n_network_configs); + parse_one_interface_config(config, tok); - config->network_configs[config->n_network_configs - 1] = - netconf; } talloc_free(val);