+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;
+ struct config *config;
+ int i, n_boot_opts, rc, idx;
+ unsigned int *order;
+ bool allow_write;
+ char mac[20];
+
+ config = config_copy(screen, screen->cui->config);
+
+ talloc_free(config->autoboot_opts);
+ config->n_autoboot_opts = 0;
+
+ n_boot_opts = widget_subset_get_order(config, &order,
+ screen->widgets.boot_order_f);
+
+ config->autoboot_enabled = n_boot_opts > 0;
+
+ config->n_autoboot_opts = n_boot_opts;
+ config->autoboot_opts = talloc_array(config, struct autoboot_option,
+ n_boot_opts);
+
+ for (i = 0; i < n_boot_opts; i++) {
+ if (order[i] < sysinfo->n_blockdevs) {
+ /* disk uuid */
+ config->autoboot_opts[i].boot_type = BOOT_DEVICE_UUID;
+ config->autoboot_opts[i].uuid = talloc_strdup(config,
+ sysinfo->blockdevs[order[i]]->uuid);
+ } else if(order[i] < (sysinfo->n_blockdevs + sysinfo->n_interfaces)) {
+ /* net uuid */
+ order[i] -= sysinfo->n_blockdevs;
+ config->autoboot_opts[i].boot_type = BOOT_DEVICE_UUID;
+ mac_str(sysinfo->interfaces[order[i]]->hwaddr,
+ sysinfo->interfaces[order[i]]->hwaddr_size,
+ mac, sizeof(mac));
+ config->autoboot_opts[i].uuid = talloc_strdup(config, mac);
+ } else {
+ /* device type */
+ order[i] -= (sysinfo->n_blockdevs + sysinfo->n_interfaces);
+ config->autoboot_opts[i].boot_type = BOOT_DEVICE_TYPE;
+ config->autoboot_opts[i].type = order[i];
+ }
+ }
+
+ 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;
+ }
+
+ if (screen->ipmi_override)
+ if (widget_checkbox_get_value(screen->widgets.ipmi_clear_cb))
+ config->ipmi_bootdev = IPMI_BOOTDEV_INVALID;
+
+
+ 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, *url;
+
+ 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);
+ url = widget_textbox_get_value(screen->widgets.url_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);
+ iface->static_config.url = talloc_strdup(iface, url);
+ }
+
+ 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;
+ }
+ }
+
+ allow_write = widget_select_get_value(screen->widgets.allow_write_f);
+ if (allow_write != config->allow_writes)
+ config->allow_writes = allow_write;
+
+ 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;
+}
+