+static char *iface_config_str(void *ctx, struct interface_config *config)
+{
+ char *str;
+
+ /* todo: HWADDR size is hardcoded as 6, but we may need to handle
+ * different hardware address formats */
+ str = talloc_asprintf(ctx, "%02x:%02x:%02x:%02x:%02x:%02x,",
+ config->hwaddr[0], config->hwaddr[1],
+ config->hwaddr[2], config->hwaddr[3],
+ config->hwaddr[4], config->hwaddr[5]);
+
+ if (config->ignore) {
+ str = talloc_asprintf_append(str, "ignore");
+
+ } else if (config->method == CONFIG_METHOD_DHCP) {
+ str = talloc_asprintf_append(str, "dhcp");
+
+ } else if (config->method == CONFIG_METHOD_STATIC) {
+ str = talloc_asprintf_append(str, "static,%s%s%s",
+ config->static_config.address,
+ config->static_config.gateway ? "," : "",
+ config->static_config.gateway ?: "");
+ }
+ return str;
+}
+
+static char *dns_config_str(void *ctx, const char **dns_servers, int n)
+{
+ char *str;
+ int i;
+
+ str = talloc_strdup(ctx, "dns=");
+ for (i = 0; i < n; i++) {
+ str = talloc_asprintf_append(str, "%s%s",
+ i == 0 ? "" : ",",
+ dns_servers[i]);
+ }
+
+ return str;
+}
+
+static void update_network_config(struct powerpc_nvram_storage *nv,
+ struct config *config)
+{
+ unsigned int i;
+ char *val;
+
+ val = talloc_strdup(nv, "");
+
+ for (i = 0; i < config->network.n_interfaces; i++) {
+ char *iface_str = iface_config_str(nv,
+ config->network.interfaces[i]);
+ val = talloc_asprintf_append(val, "%s%s",
+ *val == '\0' ? "" : " ", iface_str);
+ talloc_free(iface_str);
+ }
+
+ if (config->network.n_dns_servers) {
+ char *dns_str = dns_config_str(nv, config->network.dns_servers,
+ config->network.n_dns_servers);
+ val = talloc_asprintf_append(val, "%s%s",
+ *val == '\0' ? "" : " ", dns_str);
+ talloc_free(dns_str);
+ }
+
+ set_param(nv, "petitboot,network", val);
+
+ talloc_free(val);
+}
+
+static int update_config(struct powerpc_nvram_storage *nv,
+ struct config *config, struct config *defaults)
+{
+ char *val;
+
+ if (config->autoboot_enabled != defaults->autoboot_enabled) {
+ val = config->autoboot_enabled ? "true" : "false";
+ set_param(nv, "auto-boot?", val);
+ }
+
+ if (config->autoboot_timeout_sec != defaults->autoboot_timeout_sec) {
+ val = talloc_asprintf(nv, "%d", config->autoboot_timeout_sec);
+ set_param(nv, "petitboot,timeout", val);
+ talloc_free(val);
+ }
+
+ if (config->network.n_interfaces)
+ update_network_config(nv, config);
+
+ return write_nvram(nv);
+}
+