conf.c revision 3b9fa0931dd86a1fe5507311ee8031650f5d0e8c
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Released under the terms of the GNU GPL v2.0.
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <ctype.h>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdlib.h>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <string.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <unistd.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <time.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sys/stat.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LKC_DIRECT_LINK
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "lkc.h"
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void conf(struct menu *menu);
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_conf(struct menu *menu);
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ask_all,
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ask_new,
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ask_silent,
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_default,
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_yes,
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_mod,
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_no,
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_random
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} input_mode = ask_all;
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldschar *defconfig_file;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int indent = 1;
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int valid_stdin = 1;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_cnt;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic signed char line[128];
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct menu *rootEntry;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
373b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melostatic char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void strip(signed char *str)
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	signed char *p = str;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int l;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while ((isspace(*p)))
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p++;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	l = strlen(p);
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (p != str)
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memmove(str, p, l + 1);
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!l)
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = str + l - 1;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while ((isspace(*p)))
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*p-- = 0;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_stdin(void)
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!valid_stdin && input_mode == ask_silent) {
593b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("aborted!\n\n"));
603b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("Console input/output is redirected. "));
613b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		exit(1);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void conf_askvalue(struct symbol *sym, const char *def)
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	enum symbol_type type = sym_get_type(sym);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	tristate val;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym_has_value(sym))
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("(NEW) ");
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line[0] = '\n';
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line[1] = 0;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym_is_changable(sym)) {
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%s\n", def);
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[0] = '\n';
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[1] = 0;
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (input_mode) {
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_new:
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_silent:
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_has_value(sym)) {
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("%s\n", def);
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		check_stdin();
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_all:
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fflush(stdout);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fgets(line, 128, stdin);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_default:
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%s\n", def);
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (type) {
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_INT:
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_HEX:
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_STRING:
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%s\n", def);
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		;
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (input_mode) {
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_yes:
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_tristate_within_range(sym, yes)) {
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[0] = 'y';
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[1] = '\n';
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[2] = 0;
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_mod:
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (type == S_TRISTATE) {
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (sym_tristate_within_range(sym, mod)) {
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[0] = 'm';
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[1] = '\n';
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[2] = 0;
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (sym_tristate_within_range(sym, yes)) {
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[0] = 'y';
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[1] = '\n';
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				line[2] = 0;
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_no:
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_tristate_within_range(sym, no)) {
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[0] = 'n';
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[1] = '\n';
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[2] = 0;
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_random:
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		do {
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			val = (tristate)(random() % 3);
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} while (!sym_tristate_within_range(sym, val));
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (val) {
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no: line[0] = 'n'; break;
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod: line[0] = 'm'; break;
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes: line[0] = 'y'; break;
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[1] = '\n';
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[2] = 0;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printf("%s", line);
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint conf_string(struct menu *menu)
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym = menu->sym;
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *def, *help;
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%*s%s ", indent - 1, "", menu->prompt->text);
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("(%s) ", sym->name);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		def = sym_get_string_value(sym);
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_get_string_value(sym))
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("[%s] ", def);
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_askvalue(sym, def);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (line[0]) {
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '\n':
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '?':
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* print help */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (line[1] == '\n') {
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				help = nohelp_text;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (menu->sym->help)
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					help = menu->sym->help;
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("\n%s\n", menu->sym->help);
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				def = NULL;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[strlen(line)-1] = 0;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			def = line;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (def && sym_set_string_value(sym, def))
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_sym(struct menu *menu)
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym = menu->sym;
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int type;
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	tristate oldval, newval;
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *help;
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%*s%s ", indent - 1, "", menu->prompt->text);
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->name)
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("(%s) ", sym->name);
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		type = sym_get_type(sym);
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		putchar('[');
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		oldval = sym_get_tristate_value(sym);
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (oldval) {
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('N');
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('M');
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('Y');
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != no && sym_tristate_within_range(sym, no))
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/n");
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != mod && sym_tristate_within_range(sym, mod))
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/m");
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != yes && sym_tristate_within_range(sym, yes))
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/y");
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->help)
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/?");
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("] ");
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_askvalue(sym, sym_get_string_value(sym));
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strip(line);
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (line[0]) {
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'n':
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'N':
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = no;
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1] || !strcmp(&line[1], "o"))
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'm':
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'M':
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = mod;
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1])
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'y':
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'Y':
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = yes;
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1] || !strcmp(&line[1], "es"))
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0:
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = oldval;
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '?':
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto help;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_set_tristate_value(sym, newval))
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldshelp:
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		help = nohelp_text;
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->help)
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			help = sym->help;
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("\n%s\n", help);
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_choice(struct menu *menu)
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym, *def_sym;
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int type;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bool is_new;
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	type = sym_get_type(sym);
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	is_new = !sym_has_value(sym);
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym_is_changable(sym)) {
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_sym(menu);
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sym_calc_value(sym);
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (sym_get_tristate_value(sym)) {
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (sym_get_tristate_value(sym)) {
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int cnt, def;
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		def_sym = sym_get_choice_value(sym);
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cnt = def = 0;
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[0] = '0';
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[1] = 0;
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (child = menu->list; child; child = child->next) {
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!menu_is_visible(child))
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!child->sym) {
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cnt++;
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (child->sym == def_sym) {
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				def = cnt;
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c", indent, '>');
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c", indent, ' ');
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf(" %d. %s", cnt, menu_get_prompt(child));
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (child->sym->name)
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf(" (%s)", child->sym->name);
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!sym_has_value(child->sym))
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf(" (NEW)");
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("\n");
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%*schoice", indent - 1, "");
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cnt == 1) {
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("[1]: 1\n");
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto conf_childs;
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("[1-%d", cnt);
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->help)
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("?");
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("]: ");
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (input_mode) {
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ask_new:
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ask_silent:
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!is_new) {
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = def;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%d\n", cnt);
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			check_stdin();
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ask_all:
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fflush(stdout);
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fgets(line, 128, stdin);
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			strip(line);
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (line[0] == '?') {
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("\n%s\n", menu->sym->help ?
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					menu->sym->help : nohelp_text);
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[0])
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = def;
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else if (isdigit(line[0]))
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = atoi(line);
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case set_random:
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			def = (random() % cnt) + 1;
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case set_default:
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case set_yes:
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case set_mod:
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case set_no:
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cnt = def;
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("%d\n", cnt);
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conf_childs:
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (child = menu->list; child; child = child->next) {
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!child->sym || !menu_is_visible(child))
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!--cnt)
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!child)
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (line[strlen(line) - 1] == '?') {
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("\n%s\n", child->sym->help ?
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				child->sym->help : nohelp_text);
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sym_set_choice_value(sym, child->sym);
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (child->list) {
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			indent += 2;
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			conf(child->list);
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			indent -= 2;
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void conf(struct menu *menu)
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct property *prop;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!menu_is_visible(menu))
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	prop = menu->prompt;
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (prop) {
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		const char *prompt;
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (prop->type) {
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case P_MENU:
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (input_mode == ask_silent && rootEntry != menu) {
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				check_conf(menu);
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case P_COMMENT:
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			prompt = menu_get_prompt(menu);
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (prompt)
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c\n%*c %s\n%*c\n",
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					indent, '*',
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					indent, '*', prompt,
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					indent, '*');
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			;
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym)
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto conf_childs;
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym_is_choice(sym)) {
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_choice(menu);
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->curr.tri != mod)
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return;
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto conf_childs;
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (sym->type) {
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_INT:
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_HEX:
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_STRING:
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_string(menu);
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_sym(menu);
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconf_childs:
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym)
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		indent += 2;
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (child = menu->list; child; child = child->next)
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf(child);
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym)
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		indent -= 2;
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_conf(struct menu *menu)
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym;
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!menu_is_visible(menu))
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym) {
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_is_changable(sym) && !sym_has_value(sym)) {
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!conf_cnt++)
4733b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo				printf(_("*\n* Restart config...\n*\n"));
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			rootEntry = menu_get_parent_menu(menu);
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			conf(rootEntry);
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (child = menu->list; child; child = child->next)
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		check_conf(child);
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint main(int ac, char **av)
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i = 1;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *name;
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct stat tmpstat;
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ac > i && av[i][0] == '-') {
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (av[i++][1]) {
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'o':
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = ask_new;
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 's':
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = ask_silent;
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			valid_stdin = isatty(0) && isatty(1) && isatty(2);
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'd':
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_default;
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'D':
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_default;
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			defconfig_file = av[i++];
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!defconfig_file) {
5073b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo				printf(_("%s: No default config file specified\n"),
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					av[0]);
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				exit(1);
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'n':
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_no;
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'm':
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_mod;
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'y':
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_yes;
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'r':
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = set_random;
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			srandom(time(NULL));
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'h':
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '?':
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("%s [-o|-s] config\n", av[0]);
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			exit(0);
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  	name = av[i];
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!name) {
5333b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("%s: Kconfig file missing\n"), av[0]);
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conf_parse(name);
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	//zconfdump(stdout);
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (input_mode) {
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case set_default:
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!defconfig_file)
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			defconfig_file = conf_get_default_confname();
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (conf_read(defconfig_file)) {
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("***\n"
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"*** Can't find default configuration \"%s\"!\n"
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"***\n", defconfig_file);
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			exit(1);
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_silent:
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (stat(".config", &tmpstat)) {
5503b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo			printf(_("***\n"
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"*** You have not yet configured your kernel!\n"
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"***\n"
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"*** \"make menuconfig\" or \"make xconfig\").\n"
5553b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo				"***\n"));
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			exit(1);
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_all:
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ask_new:
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_read(NULL);
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (input_mode != ask_silent) {
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		rootEntry = &rootmenu;
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf(&rootmenu);
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (input_mode == ask_all) {
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			input_mode = ask_silent;
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			valid_stdin = 1;
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	do {
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_cnt = 0;
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		check_conf(&rootmenu);
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} while (conf_cnt);
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (conf_write(NULL)) {
5793b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
584