[5/6] ui/ncurses: List available consoles in nc-config
diff mbox

Message ID 20160608062812.14480-6-sam@mendozajonas.com
State Accepted
Headers show

Commit Message

Samuel Mendoza-Jonas June 8, 2016, 6:28 a.m. UTC
Include a list of available consoles as specified by the discover server
in nc-config from which the user can select a default. The selected
console specifies the which console to be set as the primary console
when a kernel is kexec'd.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
 ui/ncurses/nc-config.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 52 insertions(+), 3 deletions(-)

Patch
diff mbox

diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c
index 66ca7a4..724fcae 100644
--- a/ui/ncurses/nc-config.c
+++ b/ui/ncurses/nc-config.c
@@ -33,7 +33,7 @@ 
 #include "nc-config.h"
 #include "nc-widgets.h"
 
-#define N_FIELDS	39
+#define N_FIELDS	42
 
 extern struct help_text config_help_text;
 
@@ -108,6 +108,9 @@  struct config_screen {
 
 		struct nc_widget_label		*allow_write_l;
 		struct nc_widget_select		*allow_write_f;
+		struct nc_widget_label		*boot_tty_l;
+		struct nc_widget_select		*boot_tty_f;
+		struct nc_widget_label		*current_tty_l;
 
 		struct nc_widget_label		*safe_mode;
 		struct nc_widget_button		*ok_b;
@@ -197,7 +200,7 @@  static int screen_process_form(struct config_screen *screen)
 	char *str, *end;
 	struct config *config;
 	int i, n_boot_opts, rc, idx;
-	unsigned int *order;
+	unsigned int *order, tty;
 	char mac[20];
 
 	config = config_copy(screen, screen->cui->config);
@@ -333,6 +336,19 @@  static int screen_process_form(struct config_screen *screen)
 	if (allow_write != config->allow_writes)
 		config->allow_writes = allow_write;
 
+	if (config->n_tty) {
+		tty = widget_select_get_value(screen->widgets.boot_tty_f);
+		if (!config->boot_tty) {
+			config->boot_tty = talloc_strdup(config,
+							config->tty_list[tty]);
+		} else if (strncmp(config->boot_tty, config->tty_list[tty],
+				strlen(config->boot_tty)) != 0) {
+			talloc_free(config->boot_tty);
+			config->boot_tty = talloc_strdup(config,
+							config->tty_list[tty]);
+		}
+	}
+
 	config->safe_mode = false;
 	rc = cui_send_config(screen->cui, config);
 	talloc_free(config);
@@ -579,6 +595,22 @@  static void config_screen_layout_widgets(struct config_screen *screen)
 
 	y += 1;
 
+	if (widget_height(widget_select_base(screen->widgets.boot_tty_f))) {
+		layout_pair(screen, y, screen->widgets.boot_tty_l,
+			    widget_select_base(screen->widgets.boot_tty_f));
+		y += widget_height(widget_select_base(screen->widgets.boot_tty_f));
+		widget_move(widget_label_base(screen->widgets.current_tty_l),
+			y, screen->field_x);
+		y += 2;
+	} else {
+		widget_set_visible(widget_label_base(
+					screen->widgets.boot_tty_l), false);
+		widget_set_visible(widget_select_base(
+					screen->widgets.boot_tty_f), false);
+		widget_set_visible(widget_label_base(
+					screen->widgets.current_tty_l), false);
+	}
+
 	widget_move(widget_button_base(screen->widgets.ok_b),
 			y, screen->field_x);
 	widget_move(widget_button_base(screen->widgets.help_b),
@@ -740,10 +772,11 @@  static void config_screen_setup_widgets(struct config_screen *screen,
 {
 	struct nc_widgetset *set = screen->widgetset;
 	struct interface_config *ifcfg;
-	char *str, *ip, *mask, *gw, *url;
+	char *str, *ip, *mask, *gw, *url, *tty;
 	enum net_conf_type type;
 	unsigned int i;
 	int add_len, clear_len, any_len, min_len = 20;
+	bool found;
 
 	build_assert(sizeof(screen->widgets) / sizeof(struct widget *)
 			== N_FIELDS);
@@ -986,6 +1019,22 @@  static void config_screen_setup_widgets(struct config_screen *screen,
 				_("Allow bootloader scripts to modify disks"),
 				config->allow_writes);
 
+	screen->widgets.boot_tty_l = widget_new_label(set, 0, 0,
+			_("Default tty:"));
+	screen->widgets.boot_tty_f = widget_new_select(set, 0, 0,
+						COLS - screen->field_x - 1);
+
+	for (i = 0; i < config->n_tty; i++){
+		found = strncmp(config->tty_list[i], config->boot_tty,
+				strlen(config->tty_list[i])) == 0;
+		widget_select_add_option(screen->widgets.boot_tty_f, i,
+					config->tty_list[i], found);
+	}
+
+	tty = talloc_asprintf(screen, _("Current interface: %s"),
+				ttyname(STDIN_FILENO));
+	screen->widgets.current_tty_l = widget_new_label(set, 0 , 0, tty);
+
 	screen->widgets.ok_b = widget_new_button(set, 0, 0, 10, _("OK"),
 			ok_click, screen);
 	screen->widgets.help_b = widget_new_button(set, 0, 0, 10, _("Help"),