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
6534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor#include <locale.h>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <ctype.h>
89dfb563b07b1aafcd7d40528ebfa7f9ce28f0556Randy Dunlap#include <stdio.h>
975ff4309cdb1d7303750aeed07a5d80382fe2e71Ladislav Michl#include <stdlib.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <string.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <time.h>
1275ff4309cdb1d7303750aeed07a5d80382fe2e71Ladislav Michl#include <unistd.h>
134062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg#include <getopt.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sys/stat.h>
15b0fe551000179c868d46266278a890eab878bacaIngo Molnar#include <sys/time.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LKC_DIRECT_LINK
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "lkc.h"
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void conf(struct menu *menu);
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_conf(struct menu *menu);
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
234062f1a4c030157216dc8932e27131975cf7253cSam Ravnborgenum input_mode {
244062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	oldaskconfig,
254062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	silentoldconfig,
264062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	oldconfig,
274062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	allnoconfig,
284062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	allyesconfig,
294062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	allmodconfig,
300748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg	alldefconfig,
314062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	randconfig,
324062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	defconfig,
337cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg	savedefconfig,
34861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	listnewconfig,
35ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg	oldnoconfig,
364062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg} input_mode = oldaskconfig;
374062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldschar *defconfig_file;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int indent = 1;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int valid_stdin = 1;
42204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-mstatic int sync_kconfig;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_cnt;
4448b9d03c5f20a0585bb6f7d8c4abad3661df5d75J.A. Magallonstatic char line[128];
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct menu *rootEntry;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4766c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquanstatic void print_help(struct menu *menu)
4803d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg{
4966c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan	struct gstr help = str_new();
5066c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan
5166c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan	menu_get_ext_help(menu, &help);
5266c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan
5366c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan	printf("\n%s\n", str_get(&help));
5466c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan	str_free(&help);
5503d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg}
5603d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg
5748b9d03c5f20a0585bb6f7d8c4abad3661df5d75J.A. Magallonstatic void strip(char *str)
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5948b9d03c5f20a0585bb6f7d8c4abad3661df5d75J.A. Magallon	char *p = str;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int l;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while ((isspace(*p)))
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p++;
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	l = strlen(p);
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (p != str)
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memmove(str, p, l + 1);
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!l)
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = str + l - 1;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while ((isspace(*p)))
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*p-- = 0;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_stdin(void)
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
76204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	if (!valid_stdin) {
773b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("aborted!\n\n"));
783b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("Console input/output is redirected. "));
793b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		exit(1);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippelstatic int conf_askvalue(struct symbol *sym, const char *def)
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	enum symbol_type type = sym_get_type(sym);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym_has_value(sym))
89534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor		printf(_("(NEW) "));
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line[0] = '\n';
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line[1] = 0;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym_is_changable(sym)) {
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%s\n", def);
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[0] = '\n';
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		line[1] = 0;
98f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel		return 0;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (input_mode) {
1024062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case oldconfig:
1034062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case silentoldconfig:
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_has_value(sym)) {
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("%s\n", def);
106f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel			return 0;
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		check_stdin();
1094062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case oldaskconfig:
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fflush(stdout);
1114418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren		xfgets(line, 128, stdin);
112f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel		return 1;
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (type) {
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_INT:
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_HEX:
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_STRING:
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("%s\n", def);
122f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel		return 1;
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printf("%s", line);
127f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel	return 1;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1304356f4890792a678936c93c9196e8f7742e04535Trevor Keithstatic int conf_string(struct menu *menu)
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym = menu->sym;
13303d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg	const char *def;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
136534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("(%s) ", sym->name);
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		def = sym_get_string_value(sym);
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_get_string_value(sym))
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("[%s] ", def);
141f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel		if (!conf_askvalue(sym, def))
142f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel			return 0;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (line[0]) {
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '\n':
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '?':
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* print help */
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (line[1] == '\n') {
14966c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan				print_help(menu);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				def = NULL;
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			line[strlen(line)-1] = 0;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			def = line;
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (def && sym_set_string_value(sym, def))
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_sym(struct menu *menu)
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym = menu->sym;
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	tristate oldval, newval;
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
168534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->name)
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("(%s) ", sym->name);
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		putchar('[');
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		oldval = sym_get_tristate_value(sym);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (oldval) {
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('N');
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('M');
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			putchar('Y');
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != no && sym_tristate_within_range(sym, no))
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/n");
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != mod && sym_tristate_within_range(sym, mod))
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/m");
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (oldval != yes && sym_tristate_within_range(sym, yes))
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/y");
19003d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg		if (menu_has_help(menu))
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("/?");
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("] ");
193f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel		if (!conf_askvalue(sym, sym_get_string_value(sym)))
194f82f3f9422d4da1eeec6f6cf3e64c6c34c4fe19bRoman Zippel			return 0;
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strip(line);
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (line[0]) {
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'n':
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'N':
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = no;
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1] || !strcmp(&line[1], "o"))
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'm':
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'M':
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = mod;
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1])
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'y':
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 'Y':
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = yes;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[1] || !strcmp(&line[1], "es"))
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0:
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			newval = oldval;
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case '?':
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto help;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym_set_tristate_value(sym, newval))
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldshelp:
22766c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan		print_help(menu);
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int conf_choice(struct menu *menu)
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym, *def_sym;
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bool is_new;
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	is_new = !sym_has_value(sym);
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym_is_changable(sym)) {
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_sym(menu);
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sym_calc_value(sym);
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (sym_get_tristate_value(sym)) {
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (sym_get_tristate_value(sym)) {
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case no:
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case mod:
255534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor			printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case yes:
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int cnt, def;
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
265534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor		printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		def_sym = sym_get_choice_value(sym);
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cnt = def = 0;
26840aee729b350672c2550640622416a855e27938fRoman Zippel		line[0] = 0;
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (child = menu->list; child; child = child->next) {
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!menu_is_visible(child))
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!child->sym) {
273534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor				printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cnt++;
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (child->sym == def_sym) {
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				def = cnt;
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c", indent, '>');
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c", indent, ' ');
282534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor			printf(" %d. %s", cnt, _(menu_get_prompt(child)));
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (child->sym->name)
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf(" (%s)", child->sym->name);
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!sym_has_value(child->sym))
286534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor				printf(_(" (NEW)"));
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("\n");
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
289534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor		printf(_("%*schoice"), indent - 1, "");
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cnt == 1) {
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("[1]: 1\n");
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto conf_childs;
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("[1-%d", cnt);
29503d29122738f0bd81afd44b1f566e64ebf8d06feSam Ravnborg		if (menu_has_help(menu))
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printf("?");
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printf("]: ");
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (input_mode) {
2994062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case oldconfig:
3004062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case silentoldconfig:
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!is_new) {
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = def;
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%d\n", cnt);
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			check_stdin();
3074062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case oldaskconfig:
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fflush(stdout);
3094418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren			xfgets(line, 128, stdin);
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			strip(line);
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (line[0] == '?') {
31266c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan				print_help(menu);
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!line[0])
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = def;
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else if (isdigit(line[0]))
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = atoi(line);
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
322f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		default:
323f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg			break;
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conf_childs:
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (child = menu->list; child; child = child->next) {
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!child->sym || !menu_is_visible(child))
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				continue;
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!--cnt)
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!child)
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
3353ba41621156681afcdbcd624e3191cbc65eb94f4Ben Hutchings		if (line[0] && line[strlen(line) - 1] == '?') {
33666c4bd808508ae99e00e979ab3e9a1c6a6a7ad45Cheng Renquan			print_help(child);
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sym_set_choice_value(sym, child->sym);
340f5eaa323eb6819d2f737ead42464efccaf2b98b9Jan Beulich		for (child = child->list; child; child = child->next) {
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			indent += 2;
342f5eaa323eb6819d2f737ead42464efccaf2b98b9Jan Beulich			conf(child);
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			indent -= 2;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void conf(struct menu *menu)
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym;
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct property *prop;
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!menu_is_visible(menu))
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	prop = menu->prompt;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (prop) {
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		const char *prompt;
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (prop->type) {
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case P_MENU:
3654062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg			if ((input_mode == silentoldconfig ||
366861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg			     input_mode == listnewconfig ||
367ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg			     input_mode == oldnoconfig) &&
368f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski			    rootEntry != menu) {
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				check_conf(menu);
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case P_COMMENT:
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			prompt = menu_get_prompt(menu);
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (prompt)
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printf("%*c\n%*c %s\n%*c\n",
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					indent, '*',
377534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor					indent, '*', _(prompt),
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					indent, '*');
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!sym)
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto conf_childs;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym_is_choice(sym)) {
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_choice(menu);
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (sym->curr.tri != mod)
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return;
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto conf_childs;
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (sym->type) {
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_INT:
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_HEX:
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case S_STRING:
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_string(menu);
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_sym(menu);
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconf_childs:
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym)
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		indent += 2;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (child = menu->list; child; child = child->next)
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf(child);
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sym)
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		indent -= 2;
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_conf(struct menu *menu)
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct symbol *sym;
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct menu *child;
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!menu_is_visible(menu))
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sym = menu->sym;
4233f23ca2b37d13a89bb6cd0421821fc9c3b8ccd47Roman Zippel	if (sym && !sym_has_value(sym)) {
4243f23ca2b37d13a89bb6cd0421821fc9c3b8ccd47Roman Zippel		if (sym_is_changable(sym) ||
4253f23ca2b37d13a89bb6cd0421821fc9c3b8ccd47Roman Zippel		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
426861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg			if (input_mode == listnewconfig) {
427861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg				if (sym->name && !sym_is_choice_value(sym)) {
428ffb5957bc48f64f0773fd3fbc43cb9bb9b38e270Arnaud Lacombe					printf("%s%s\n", CONFIG_, sym->name);
429f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski				}
43071d8066265896a6498a4de1bed80dea8dc5daeadKyle McMartin			} else if (input_mode != oldnoconfig) {
431f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski				if (!conf_cnt++)
432f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski					printf(_("*\n* Restart config...\n*\n"));
433f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski				rootEntry = menu_get_parent_menu(menu);
434f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski				conf(rootEntry);
435f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski			}
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (child = menu->list; child; child = child->next)
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		check_conf(child);
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4434062f1a4c030157216dc8932e27131975cf7253cSam Ravnborgstatic struct option long_opts[] = {
4444062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
4454062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"oldconfig",       no_argument,       NULL, oldconfig},
4464062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"silentoldconfig", no_argument,       NULL, silentoldconfig},
4474062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"defconfig",       optional_argument, NULL, defconfig},
4487cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg	{"savedefconfig",   required_argument, NULL, savedefconfig},
4494062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"allnoconfig",     no_argument,       NULL, allnoconfig},
4504062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"allyesconfig",    no_argument,       NULL, allyesconfig},
4514062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"allmodconfig",    no_argument,       NULL, allmodconfig},
4520748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg	{"alldefconfig",    no_argument,       NULL, alldefconfig},
4534062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{"randconfig",      no_argument,       NULL, randconfig},
454861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	{"listnewconfig",   no_argument,       NULL, listnewconfig},
455ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg	{"oldnoconfig",     no_argument,       NULL, oldnoconfig},
4564062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	{NULL, 0, NULL, 0}
4574062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg};
4584062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint main(int ac, char **av)
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4612f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon	int opt;
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *name;
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct stat tmpstat;
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
465534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor	setlocale(LC_ALL, "");
466534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor	bindtextdomain(PACKAGE, LOCALEDIR);
467534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor	textdomain(PACKAGE);
468534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor
469c94d3fb01fb6db1899cdf53ea4eb9d38e08a08feArnaud Lacombe	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
4704062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		input_mode = (enum input_mode)opt;
4712f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon		switch (opt) {
4724062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case silentoldconfig:
473204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			sync_kconfig = 1;
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4754062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case defconfig:
4767cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg		case savedefconfig:
4772f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon			defconfig_file = optarg;
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4794062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case randconfig:
480b0fe551000179c868d46266278a890eab878bacaIngo Molnar		{
481b0fe551000179c868d46266278a890eab878bacaIngo Molnar			struct timeval now;
482b0fe551000179c868d46266278a890eab878bacaIngo Molnar			unsigned int seed;
483b0fe551000179c868d46266278a890eab878bacaIngo Molnar
484b0fe551000179c868d46266278a890eab878bacaIngo Molnar			/*
485b0fe551000179c868d46266278a890eab878bacaIngo Molnar			 * Use microseconds derived seed,
486b0fe551000179c868d46266278a890eab878bacaIngo Molnar			 * compensate for systems where it may be zero
487b0fe551000179c868d46266278a890eab878bacaIngo Molnar			 */
488b0fe551000179c868d46266278a890eab878bacaIngo Molnar			gettimeofday(&now, NULL);
489b0fe551000179c868d46266278a890eab878bacaIngo Molnar
490b0fe551000179c868d46266278a890eab878bacaIngo Molnar			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
491b0fe551000179c868d46266278a890eab878bacaIngo Molnar			srand(seed);
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
493b0fe551000179c868d46266278a890eab878bacaIngo Molnar		}
4944062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case '?':
495534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor			fprintf(stderr, _("See README for usage info\n"));
4962f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon			exit(1);
4974062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg			break;
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5002f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon	if (ac == optind) {
5013b9fa0931dd86a1fe5507311ee8031650f5d0e8cArnaldo Carvalho de Melo		printf(_("%s: Kconfig file missing\n"), av[0]);
502250725aa13f5c9595e5bc265ebed8471e816d8b4Randy Dunlap		exit(1);
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5042f4b489b77c68b9cba1bd9dec5a1bbf0ab3c47f8Andres Salomon	name = av[optind];
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conf_parse(name);
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	//zconfdump(stdout);
507204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	if (sync_kconfig) {
508284026cdfb5a899e558dcb7a36aefaf54a78c094Markus Heidelberg		name = conf_get_configname();
509284026cdfb5a899e558dcb7a36aefaf54a78c094Markus Heidelberg		if (stat(name, &tmpstat)) {
510204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			fprintf(stderr, _("***\n"
511652cf9821d2a5b22a1725ce8dc235ea5de0e1c6fArnaud Lacombe				"*** Configuration file \"%s\" not found!\n"
512204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m				"***\n"
513204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
514204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m				"*** \"make menuconfig\" or \"make xconfig\").\n"
515284026cdfb5a899e558dcb7a36aefaf54a78c094Markus Heidelberg				"***\n"), name);
516204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			exit(1);
517204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		}
518204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	}
519204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (input_mode) {
5214062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case defconfig:
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!defconfig_file)
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			defconfig_file = conf_get_default_confname();
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (conf_read(defconfig_file)) {
525534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor			printf(_("***\n"
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"*** Can't find default configuration \"%s\"!\n"
527534a450c383ef238b0461218bc2d3e54066ae043EGRY Gabor				"***\n"), defconfig_file);
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			exit(1);
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5317cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg	case savedefconfig:
5324062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case silentoldconfig:
5334062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case oldaskconfig:
5344062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case oldconfig:
535861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	case listnewconfig:
536ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg	case oldnoconfig:
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		conf_read(NULL);
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5394062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allnoconfig:
5404062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allyesconfig:
5414062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allmodconfig:
5420748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg	case alldefconfig:
5434062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case randconfig:
54490389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		name = getenv("KCONFIG_ALLCONFIG");
54590389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		if (name && !stat(name, &tmpstat)) {
546669bfad906522e74ee8d962801552a8c224c0d63Roman Zippel			conf_read_simple(name, S_DEF_USER);
54790389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel			break;
54890389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		}
54990389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		switch (input_mode) {
5504062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case allnoconfig:	name = "allno.config"; break;
5514062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case allyesconfig:	name = "allyes.config"; break;
5524062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case allmodconfig:	name = "allmod.config"; break;
5530748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg		case alldefconfig:	name = "alldef.config"; break;
5544062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		case randconfig:	name = "allrandom.config"; break;
55590389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		default: break;
55690389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		}
55790389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		if (!stat(name, &tmpstat))
558669bfad906522e74ee8d962801552a8c224c0d63Roman Zippel			conf_read_simple(name, S_DEF_USER);
55990389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		else if (!stat("all.config", &tmpstat))
560669bfad906522e74ee8d962801552a8c224c0d63Roman Zippel			conf_read_simple("all.config", S_DEF_USER);
56190389160efc2864501ced6e662f9419eb7a3e6c8Roman Zippel		break;
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
565204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m
566204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	if (sync_kconfig) {
567204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		if (conf_get_changed()) {
568204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			name = getenv("KCONFIG_NOSILENTUPDATE");
569204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			if (name && *name) {
570204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m				fprintf(stderr,
571652cf9821d2a5b22a1725ce8dc235ea5de0e1c6fArnaud Lacombe					_("\n*** The configuration requires explicit update.\n\n"));
572204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m				return 1;
573204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			}
574204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		}
575204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		valid_stdin = isatty(0) && isatty(1) && isatty(2);
576204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	}
577204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m
578f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg	switch (input_mode) {
5794062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allnoconfig:
580f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		conf_set_all_new_symbols(def_no);
581f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		break;
5824062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allyesconfig:
583f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		conf_set_all_new_symbols(def_yes);
584f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		break;
5854062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case allmodconfig:
586f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		conf_set_all_new_symbols(def_mod);
587f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		break;
5880748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg	case alldefconfig:
5890748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg		conf_set_all_new_symbols(def_default);
5900748cb3e1fbd89c03a98c15e91ad65797981de77Sam Ravnborg		break;
5914062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case randconfig:
592f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		conf_set_all_new_symbols(def_random);
593f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		break;
5944062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case defconfig:
59509748e178b6cb8d3b8a748d0159aa7ad8eadcbe1Sam Ravnborg		conf_set_all_new_symbols(def_default);
59609748e178b6cb8d3b8a748d0159aa7ad8eadcbe1Sam Ravnborg		break;
5977cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg	case savedefconfig:
5987cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg		break;
5994062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case oldaskconfig:
600204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		rootEntry = &rootmenu;
601204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		conf(&rootmenu);
6024062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg		input_mode = silentoldconfig;
603204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		/* fall through */
60414828349719aa09845843477df8bad60792d18f3Sam Ravnborg	case oldconfig:
605861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	case listnewconfig:
606ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg	case oldnoconfig:
6074062f1a4c030157216dc8932e27131975cf7253cSam Ravnborg	case silentoldconfig:
608204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		/* Update until a loop caused no more changes */
609204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		do {
610204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			conf_cnt = 0;
611204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			check_conf(&rootmenu);
612f0778c8c41001783d4074e34efc7d3e632d87ee3Aristeu Rozanski		} while (conf_cnt &&
613861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg			 (input_mode != listnewconfig &&
614ef61ca88c511154d6bead23c08f9a021cfdfeb01Sam Ravnborg			  input_mode != oldnoconfig));
615f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg		break;
616f443d2eccf077afd8a839cc7ed66cc4d520c5f05Sam Ravnborg	}
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
618204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m	if (sync_kconfig) {
619204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		/* silentoldconfig is used during the build so we shall update autoconf.
620204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		 * All other commands are only used to generate a config.
621204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		 */
622204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		if (conf_get_changed() && conf_write(NULL)) {
623652cf9821d2a5b22a1725ce8dc235ea5de0e1c6fArnaud Lacombe			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
624204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			exit(1);
625204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		}
626204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		if (conf_write_autoconf()) {
627652cf9821d2a5b22a1725ce8dc235ea5de0e1c6fArnaud Lacombe			fprintf(stderr, _("\n*** Error during update of the configuration.\n\n"));
628204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			return 1;
629204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		}
6307cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg	} else if (input_mode == savedefconfig) {
6317cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg		if (conf_write_defconfig(defconfig_file)) {
6327cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg			fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
6337cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg			        defconfig_file);
6347cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg			return 1;
6357cf3d73b4360e91b14326632ab1aeda4cb26308dSam Ravnborg		}
636861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	} else if (input_mode != listnewconfig) {
637204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		if (conf_write(NULL)) {
638652cf9821d2a5b22a1725ce8dc235ea5de0e1c6fArnaud Lacombe			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
639204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m			exit(1);
640204c96f609045a8ce84d1dca3e758ee9b0b2a95czippel@linux-m		}
641c955ccafc38e77312b4c65e5a70960080fb8a3f2Roman Zippel	}
642861b4ea4cc0eade661480f1ce197ae747f22a918Sam Ravnborg	return 0;
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6444418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren/*
6454418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren * Helper function to facilitate fgets() by Jean Sacren.
6464418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren */
6474418a2b904805814bbd14b555d6add6a175f49f3Jean Sacrenvoid xfgets(str, size, in)
6484418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren	char *str;
6494418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren	int size;
6504418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren	FILE *in;
6514418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren{
6524418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren	if (fgets(str, size, in) == NULL)
6534418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren		fprintf(stderr, "\nError in reading or end of file.\n");
6544418a2b904805814bbd14b555d6add6a175f49f3Jean Sacren}
655