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