summaryrefslogtreecommitdiffstats
path: root/ui/ncurses
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-10-24 14:02:49 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-11-14 13:23:52 +1100
commit663197d945b6e393c1237c6b2b25f11567a449d7 (patch)
treebcea9455c08af8c88720ed919da6793f9c5c3003 /ui/ncurses
parentc577cbee1e32fa85ba05698aa4ce298e1ebac3ed (diff)
downloadpetitboot-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.c117
-rw-r--r--ui/ncurses/nc-cui.c5
-rw-r--r--ui/ncurses/nc-cui.h1
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 */
OpenPOWER on IntegriCloud