diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-10-24 14:02:49 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-11-14 13:23:52 +1100 |
commit | 663197d945b6e393c1237c6b2b25f11567a449d7 (patch) | |
tree | bcea9455c08af8c88720ed919da6793f9c5c3003 /ui/ncurses | |
parent | c577cbee1e32fa85ba05698aa4ce298e1ebac3ed (diff) | |
download | petitboot-663197d945b6e393c1237c6b2b25f11567a449d7.zip petitboot-663197d945b6e393c1237c6b2b25f11567a449d7.tar.gz |
ui/ncurses: Parse configuration form & send to server
This change implements the configuration save action, when the user
submits the nc-config form.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'ui/ncurses')
-rw-r--r-- | ui/ncurses/nc-config.c | 117 | ||||
-rw-r--r-- | ui/ncurses/nc-cui.c | 5 | ||||
-rw-r--r-- | ui/ncurses/nc-cui.h | 1 |
3 files changed, 113 insertions, 10 deletions
diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c index 0b2a8d7..0141ba0 100644 --- a/ui/ncurses/nc-config.c +++ b/ui/ncurses/nc-config.c @@ -17,9 +17,11 @@ #define _GNU_SOURCE - +#include <errno.h> +#include <stdlib.h> #include <string.h> +#include <pb-config/pb-config.h> #include <talloc/talloc.h> #include <types/types.h> #include <log/log.h> @@ -123,11 +125,111 @@ struct nc_scr *config_screen_scr(struct config_screen *screen) return &screen->scr; } +static int screen_process_form(struct config_screen *screen) +{ + const struct system_info *sysinfo = screen->cui->sysinfo; + struct config *config = talloc_zero(screen, struct config); + enum net_conf_type net_conf_type; + struct interface_config *iface; + char *str, *end; + int rc; + + config_set_defaults(config); + + config->autoboot_enabled = + widget_checkbox_get_value(screen->widgets.autoboot_f); + + + 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 { + int idx; + + 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) { + iface->method = CONFIG_METHOD_STATIC; + iface->static_config.address = talloc_asprintf(iface, "%s/%s", + widget_textbox_get_value( + screen->widgets.ip_addr_f), + widget_textbox_get_value( + screen->widgets.ip_mask_f)); + iface->static_config.gateway = talloc_strdup(iface, + widget_textbox_get_value( + screen->widgets.gateway_f)); + } + + str = widget_textbox_get_value(screen->widgets.dns_f); + 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; + } + } + + 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; +} + static void ok_click(void *arg) { struct config_screen *screen = arg; - /* todo: save config */ - screen->on_exit(screen->cui); + screen_process_form(screen); + screen->exit = true; } static void cancel_click(void *arg) @@ -212,13 +314,8 @@ static void config_screen_layout_widgets(struct config_screen *screen, if (show) y += layout_pair(screen, y, screen->widgets.gateway_l, wf); - wl = widget_label_base(screen->widgets.dns_l); - wf = widget_textbox_base(screen->widgets.dns_f); - widget_set_visible(wl, show); - widget_set_visible(wf, show); - - if (show) - y += 1 + layout_pair(screen, y, screen->widgets.dns_l, wf); + y += 1 + layout_pair(screen, y, screen->widgets.dns_l, + widget_textbox_base(screen->widgets.dns_f)); widget_move(widget_button_base(screen->widgets.ok_b), y, screen->field_x); diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index d74c1a4..93377bb 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -551,6 +551,11 @@ static void cui_update_config(struct config *config, void *arg) cui->config = talloc_steal(cui, config); } +int cui_send_config(struct cui *cui, struct config *config) +{ + return discover_client_send_config(cui->client, config); +} + static struct discover_client_ops cui_client_ops = { .device_add = NULL, .boot_option_add = cui_boot_option_add, diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h index 752f2db..aba682a 100644 --- a/ui/ncurses/nc-cui.h +++ b/ui/ncurses/nc-cui.h @@ -74,6 +74,7 @@ void cui_item_edit(struct pmenu_item *item); void cui_item_new(struct pmenu *menu); void cui_show_sysinfo(struct cui *cui); void cui_show_config(struct cui *cui); +int cui_send_config(struct cui *cui, struct config *config); /* convenience routines */ |