+static int screen_process_form(struct config_screen *screen)
+{
+ const struct system_info *sysinfo = screen->cui->sysinfo;
+ enum net_conf_type net_conf_type;
+ struct interface_config *iface;
+ char *str, *end, *uuid;
+ struct config *config;
+ int rc, idx;
+
+ config = config_copy(screen, screen->cui->config);
+
+ screen->autoboot_type =
+ widget_select_get_value(screen->widgets.autoboot_f);
+
+ config->autoboot_enabled = screen->autoboot_type != AUTOBOOT_DISABLED;
+
+ uuid = NULL;
+ if (screen->autoboot_type == AUTOBOOT_ONE) {
+ char mac[20];
+
+ /* if idx is -1 here, we have an unknown UUID selected.
+ * Otherwise, it's a blockdev index (idx <= n_blockdevs) or an
+ * interface index.
+ */
+ idx = widget_select_get_value(screen->widgets.boot_device_f);
+ if (idx >= (int)sysinfo->n_blockdevs) {
+ struct interface_info *info = sysinfo->
+ interfaces[idx - sysinfo->n_blockdevs];
+ mac_str(info->hwaddr, info->hwaddr_size,
+ mac, sizeof(mac));
+ uuid = mac;
+ } else if (idx != -1) {
+ uuid = sysinfo->blockdevs[idx]->uuid;
+ }
+ }
+
+ talloc_free(config->boot_device);
+ config->boot_device = uuid ? talloc_strdup(config, uuid) : NULL;
+
+ str = widget_textbox_get_value(screen->widgets.timeout_f);
+ if (str) {
+ unsigned long x;
+ errno = 0;
+ x = strtoul(str, &end, 10);
+ if (!errno && end != str)
+ config->autoboot_timeout_sec = x;
+ }
+
+ net_conf_type = widget_select_get_value(screen->widgets.network_f);
+
+ /* if we don't have any network interfaces, prevent per-interface
+ * configuration */
+ if (sysinfo->n_interfaces == 0)
+ net_conf_type = NET_CONF_TYPE_DHCP_ALL;
+
+ if (net_conf_type == NET_CONF_TYPE_DHCP_ALL) {
+ config->network.n_interfaces = 0;
+
+ } else {
+ iface = talloc_zero(config, struct interface_config);
+ config->network.n_interfaces = 1;
+ config->network.interfaces = talloc_array(config,
+ struct interface_config *, 1);
+ config->network.interfaces[0] = iface;
+
+ /* copy hwaddr (from the sysinfo interface data) to
+ * the configuration */
+ idx = widget_select_get_value(screen->widgets.iface_f);
+ memcpy(iface->hwaddr, sysinfo->interfaces[idx]->hwaddr,
+ sizeof(iface->hwaddr));
+ }
+
+ if (net_conf_type == NET_CONF_TYPE_DHCP_ONE) {
+ iface->method = CONFIG_METHOD_DHCP;
+ }
+
+ if (net_conf_type == NET_CONF_TYPE_STATIC) {
+ char *ip, *mask, *gateway;
+
+ ip = widget_textbox_get_value(screen->widgets.ip_addr_f);
+ mask = widget_textbox_get_value(screen->widgets.ip_mask_f);
+ gateway = widget_textbox_get_value(screen->widgets.gateway_f);
+
+ if (!ip || !*ip || !mask || !*mask) {
+ screen->scr.frame.status =
+ _("No IP / mask values are set");
+ nc_scr_frame_draw(&screen->scr);
+ talloc_free(config);
+ return -1;
+ }
+
+ iface->method = CONFIG_METHOD_STATIC;
+ iface->static_config.address = talloc_asprintf(iface, "%s/%s",
+ ip, mask);
+ iface->static_config.gateway = talloc_strdup(iface, gateway);
+ }
+
+ str = widget_textbox_get_value(screen->widgets.dns_f);
+ talloc_free(config->network.dns_servers);
+ config->network.dns_servers = NULL;
+ config->network.n_dns_servers = 0;
+
+ if (str && strlen(str)) {
+ char *dns, *tmp;
+ int i;
+
+ for (;;) {
+ dns = strtok_r(str, " \t", &tmp);
+
+ if (!dns)
+ break;
+
+ i = config->network.n_dns_servers++;
+ config->network.dns_servers = talloc_realloc(config,
+ config->network.dns_servers,
+ const char *,
+ config->network.n_dns_servers);
+ config->network.dns_servers[i] =
+ talloc_strdup(config, dns);
+
+ str = NULL;
+ }
+ }
+
+ config->safe_mode = false;
+ rc = cui_send_config(screen->cui, config);
+ talloc_free(config);
+
+ if (rc)
+ pb_log("cui_send_config failed!\n");
+ else
+ pb_debug("config sent!\n");
+
+ return 0;
+}
+