15257cf54a5810105bc4a75703a06740d756d8e8landley/* 25257cf54a5810105bc4a75703a06740d756d8e8landley * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 35257cf54a5810105bc4a75703a06740d756d8e8landley * Released under the terms of the GNU GPL v2.0. 45257cf54a5810105bc4a75703a06740d756d8e8landley */ 55257cf54a5810105bc4a75703a06740d756d8e8landley 65257cf54a5810105bc4a75703a06740d756d8e8landley#include <ctype.h> 75257cf54a5810105bc4a75703a06740d756d8e8landley#include <stdlib.h> 85257cf54a5810105bc4a75703a06740d756d8e8landley#include <stdio.h> 95257cf54a5810105bc4a75703a06740d756d8e8landley#include <string.h> 105257cf54a5810105bc4a75703a06740d756d8e8landley#include <unistd.h> 115257cf54a5810105bc4a75703a06740d756d8e8landley#include <time.h> 125257cf54a5810105bc4a75703a06740d756d8e8landley#include <sys/stat.h> 135257cf54a5810105bc4a75703a06740d756d8e8landley 145257cf54a5810105bc4a75703a06740d756d8e8landley#define LKC_DIRECT_LINK 155257cf54a5810105bc4a75703a06740d756d8e8landley#include "lkc.h" 165257cf54a5810105bc4a75703a06740d756d8e8landley 175257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf(struct menu *menu); 185257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_conf(struct menu *menu); 195257cf54a5810105bc4a75703a06740d756d8e8landley 205257cf54a5810105bc4a75703a06740d756d8e8landleyenum { 215257cf54a5810105bc4a75703a06740d756d8e8landley ask_all, 225257cf54a5810105bc4a75703a06740d756d8e8landley ask_new, 235257cf54a5810105bc4a75703a06740d756d8e8landley ask_silent, 245257cf54a5810105bc4a75703a06740d756d8e8landley set_default, 255257cf54a5810105bc4a75703a06740d756d8e8landley set_yes, 265257cf54a5810105bc4a75703a06740d756d8e8landley set_mod, 275257cf54a5810105bc4a75703a06740d756d8e8landley set_no, 285257cf54a5810105bc4a75703a06740d756d8e8landley set_random 295257cf54a5810105bc4a75703a06740d756d8e8landley} input_mode = ask_all; 305257cf54a5810105bc4a75703a06740d756d8e8landleychar *defconfig_file; 315257cf54a5810105bc4a75703a06740d756d8e8landley 325257cf54a5810105bc4a75703a06740d756d8e8landleystatic int indent = 1; 335257cf54a5810105bc4a75703a06740d756d8e8landleystatic int valid_stdin = 1; 345257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_cnt; 355257cf54a5810105bc4a75703a06740d756d8e8landleystatic char line[128]; 365257cf54a5810105bc4a75703a06740d756d8e8landleystatic struct menu *rootEntry; 375257cf54a5810105bc4a75703a06740d756d8e8landley 385257cf54a5810105bc4a75703a06740d756d8e8landleystatic char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); 395257cf54a5810105bc4a75703a06740d756d8e8landley 405257cf54a5810105bc4a75703a06740d756d8e8landleystatic void strip(char *str) 415257cf54a5810105bc4a75703a06740d756d8e8landley{ 425257cf54a5810105bc4a75703a06740d756d8e8landley char *p = str; 435257cf54a5810105bc4a75703a06740d756d8e8landley int l; 445257cf54a5810105bc4a75703a06740d756d8e8landley 455257cf54a5810105bc4a75703a06740d756d8e8landley while ((isspace(*p))) 465257cf54a5810105bc4a75703a06740d756d8e8landley p++; 475257cf54a5810105bc4a75703a06740d756d8e8landley l = strlen(p); 485257cf54a5810105bc4a75703a06740d756d8e8landley if (p != str) 495257cf54a5810105bc4a75703a06740d756d8e8landley memmove(str, p, l + 1); 505257cf54a5810105bc4a75703a06740d756d8e8landley if (!l) 515257cf54a5810105bc4a75703a06740d756d8e8landley return; 525257cf54a5810105bc4a75703a06740d756d8e8landley p = str + l - 1; 535257cf54a5810105bc4a75703a06740d756d8e8landley while ((isspace(*p))) 545257cf54a5810105bc4a75703a06740d756d8e8landley *p-- = 0; 555257cf54a5810105bc4a75703a06740d756d8e8landley} 565257cf54a5810105bc4a75703a06740d756d8e8landley 575257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_stdin(void) 585257cf54a5810105bc4a75703a06740d756d8e8landley{ 595257cf54a5810105bc4a75703a06740d756d8e8landley if (!valid_stdin && input_mode == ask_silent) { 605257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("aborted!\n\n")); 615257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("Console input/output is redirected. ")); 625257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("Run 'make oldconfig' to update configuration.\n\n")); 635257cf54a5810105bc4a75703a06740d756d8e8landley exit(1); 645257cf54a5810105bc4a75703a06740d756d8e8landley } 655257cf54a5810105bc4a75703a06740d756d8e8landley} 665257cf54a5810105bc4a75703a06740d756d8e8landley 675257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf_askvalue(struct symbol *sym, const char *def) 685257cf54a5810105bc4a75703a06740d756d8e8landley{ 695257cf54a5810105bc4a75703a06740d756d8e8landley enum symbol_type type = sym_get_type(sym); 705257cf54a5810105bc4a75703a06740d756d8e8landley tristate val; 715257cf54a5810105bc4a75703a06740d756d8e8landley 725257cf54a5810105bc4a75703a06740d756d8e8landley if (!sym_has_value(sym)) 735257cf54a5810105bc4a75703a06740d756d8e8landley printf("(NEW) "); 745257cf54a5810105bc4a75703a06740d756d8e8landley 755257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = '\n'; 765257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = 0; 775257cf54a5810105bc4a75703a06740d756d8e8landley 785257cf54a5810105bc4a75703a06740d756d8e8landley if (!sym_is_changable(sym)) { 795257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s\n", def); 805257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = '\n'; 815257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = 0; 825257cf54a5810105bc4a75703a06740d756d8e8landley return; 835257cf54a5810105bc4a75703a06740d756d8e8landley } 845257cf54a5810105bc4a75703a06740d756d8e8landley 855257cf54a5810105bc4a75703a06740d756d8e8landley switch (input_mode) { 865257cf54a5810105bc4a75703a06740d756d8e8landley case set_no: 875257cf54a5810105bc4a75703a06740d756d8e8landley case set_mod: 885257cf54a5810105bc4a75703a06740d756d8e8landley case set_yes: 895257cf54a5810105bc4a75703a06740d756d8e8landley case set_random: 905257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_has_value(sym)) { 915257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s\n", def); 925257cf54a5810105bc4a75703a06740d756d8e8landley return; 935257cf54a5810105bc4a75703a06740d756d8e8landley } 945257cf54a5810105bc4a75703a06740d756d8e8landley break; 955257cf54a5810105bc4a75703a06740d756d8e8landley case ask_new: 965257cf54a5810105bc4a75703a06740d756d8e8landley case ask_silent: 975257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_has_value(sym)) { 985257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s\n", def); 995257cf54a5810105bc4a75703a06740d756d8e8landley return; 1005257cf54a5810105bc4a75703a06740d756d8e8landley } 1015257cf54a5810105bc4a75703a06740d756d8e8landley check_stdin(); 1025257cf54a5810105bc4a75703a06740d756d8e8landley case ask_all: 1035257cf54a5810105bc4a75703a06740d756d8e8landley fflush(stdout); 1045257cf54a5810105bc4a75703a06740d756d8e8landley fgets(line, 128, stdin); 1055257cf54a5810105bc4a75703a06740d756d8e8landley return; 1065257cf54a5810105bc4a75703a06740d756d8e8landley case set_default: 1075257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s\n", def); 1085257cf54a5810105bc4a75703a06740d756d8e8landley return; 1095257cf54a5810105bc4a75703a06740d756d8e8landley default: 1105257cf54a5810105bc4a75703a06740d756d8e8landley break; 1115257cf54a5810105bc4a75703a06740d756d8e8landley } 1125257cf54a5810105bc4a75703a06740d756d8e8landley 1135257cf54a5810105bc4a75703a06740d756d8e8landley switch (type) { 1145257cf54a5810105bc4a75703a06740d756d8e8landley case S_INT: 1155257cf54a5810105bc4a75703a06740d756d8e8landley case S_HEX: 1165257cf54a5810105bc4a75703a06740d756d8e8landley case S_STRING: 1175257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s\n", def); 1185257cf54a5810105bc4a75703a06740d756d8e8landley return; 1195257cf54a5810105bc4a75703a06740d756d8e8landley default: 1205257cf54a5810105bc4a75703a06740d756d8e8landley ; 1215257cf54a5810105bc4a75703a06740d756d8e8landley } 1225257cf54a5810105bc4a75703a06740d756d8e8landley switch (input_mode) { 1235257cf54a5810105bc4a75703a06740d756d8e8landley case set_yes: 1245257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_tristate_within_range(sym, yes)) { 1255257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = 'y'; 1265257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = '\n'; 1275257cf54a5810105bc4a75703a06740d756d8e8landley line[2] = 0; 1285257cf54a5810105bc4a75703a06740d756d8e8landley break; 1295257cf54a5810105bc4a75703a06740d756d8e8landley } 1305257cf54a5810105bc4a75703a06740d756d8e8landley case set_mod: 1315257cf54a5810105bc4a75703a06740d756d8e8landley if (type == S_TRISTATE) { 1325257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_tristate_within_range(sym, mod)) { 1335257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = 'm'; 1345257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = '\n'; 1355257cf54a5810105bc4a75703a06740d756d8e8landley line[2] = 0; 1365257cf54a5810105bc4a75703a06740d756d8e8landley break; 1375257cf54a5810105bc4a75703a06740d756d8e8landley } 1385257cf54a5810105bc4a75703a06740d756d8e8landley } else { 1395257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_tristate_within_range(sym, yes)) { 1405257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = 'y'; 1415257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = '\n'; 1425257cf54a5810105bc4a75703a06740d756d8e8landley line[2] = 0; 1435257cf54a5810105bc4a75703a06740d756d8e8landley break; 1445257cf54a5810105bc4a75703a06740d756d8e8landley } 1455257cf54a5810105bc4a75703a06740d756d8e8landley } 1465257cf54a5810105bc4a75703a06740d756d8e8landley case set_no: 1475257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_tristate_within_range(sym, no)) { 1485257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = 'n'; 1495257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = '\n'; 1505257cf54a5810105bc4a75703a06740d756d8e8landley line[2] = 0; 1515257cf54a5810105bc4a75703a06740d756d8e8landley break; 1525257cf54a5810105bc4a75703a06740d756d8e8landley } 1535257cf54a5810105bc4a75703a06740d756d8e8landley case set_random: 1545257cf54a5810105bc4a75703a06740d756d8e8landley do { 1555257cf54a5810105bc4a75703a06740d756d8e8landley val = (tristate)(random() % 3); 1565257cf54a5810105bc4a75703a06740d756d8e8landley } while (!sym_tristate_within_range(sym, val)); 1575257cf54a5810105bc4a75703a06740d756d8e8landley switch (val) { 1585257cf54a5810105bc4a75703a06740d756d8e8landley case no: line[0] = 'n'; break; 1595257cf54a5810105bc4a75703a06740d756d8e8landley case mod: line[0] = 'm'; break; 1605257cf54a5810105bc4a75703a06740d756d8e8landley case yes: line[0] = 'y'; break; 1615257cf54a5810105bc4a75703a06740d756d8e8landley } 1625257cf54a5810105bc4a75703a06740d756d8e8landley line[1] = '\n'; 1635257cf54a5810105bc4a75703a06740d756d8e8landley line[2] = 0; 1645257cf54a5810105bc4a75703a06740d756d8e8landley break; 1655257cf54a5810105bc4a75703a06740d756d8e8landley default: 1665257cf54a5810105bc4a75703a06740d756d8e8landley break; 1675257cf54a5810105bc4a75703a06740d756d8e8landley } 1685257cf54a5810105bc4a75703a06740d756d8e8landley printf("%s", line); 1695257cf54a5810105bc4a75703a06740d756d8e8landley} 1705257cf54a5810105bc4a75703a06740d756d8e8landley 1715257cf54a5810105bc4a75703a06740d756d8e8landleyint conf_string(struct menu *menu) 1725257cf54a5810105bc4a75703a06740d756d8e8landley{ 1735257cf54a5810105bc4a75703a06740d756d8e8landley struct symbol *sym = menu->sym; 1745257cf54a5810105bc4a75703a06740d756d8e8landley const char *def, *help; 1755257cf54a5810105bc4a75703a06740d756d8e8landley 1765257cf54a5810105bc4a75703a06740d756d8e8landley while (1) { 1775257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*s%s ", indent - 1, "", menu->prompt->text); 1785257cf54a5810105bc4a75703a06740d756d8e8landley printf("(%s) ", sym->name); 1795257cf54a5810105bc4a75703a06740d756d8e8landley def = sym_get_string_value(sym); 1805257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_get_string_value(sym)) 1815257cf54a5810105bc4a75703a06740d756d8e8landley printf("[%s] ", def); 1825257cf54a5810105bc4a75703a06740d756d8e8landley conf_askvalue(sym, def); 1835257cf54a5810105bc4a75703a06740d756d8e8landley switch (line[0]) { 1845257cf54a5810105bc4a75703a06740d756d8e8landley case '\n': 1855257cf54a5810105bc4a75703a06740d756d8e8landley break; 1865257cf54a5810105bc4a75703a06740d756d8e8landley case '?': 1875257cf54a5810105bc4a75703a06740d756d8e8landley /* print help */ 1885257cf54a5810105bc4a75703a06740d756d8e8landley if (line[1] == '\n') { 1895257cf54a5810105bc4a75703a06740d756d8e8landley help = nohelp_text; 1905257cf54a5810105bc4a75703a06740d756d8e8landley if (menu->sym->help) 1915257cf54a5810105bc4a75703a06740d756d8e8landley help = menu->sym->help; 1925257cf54a5810105bc4a75703a06740d756d8e8landley printf("\n%s\n", menu->sym->help); 1935257cf54a5810105bc4a75703a06740d756d8e8landley def = NULL; 1945257cf54a5810105bc4a75703a06740d756d8e8landley break; 1955257cf54a5810105bc4a75703a06740d756d8e8landley } 1965257cf54a5810105bc4a75703a06740d756d8e8landley default: 1975257cf54a5810105bc4a75703a06740d756d8e8landley line[strlen(line)-1] = 0; 1985257cf54a5810105bc4a75703a06740d756d8e8landley def = line; 1995257cf54a5810105bc4a75703a06740d756d8e8landley } 2005257cf54a5810105bc4a75703a06740d756d8e8landley if (def && sym_set_string_value(sym, def)) 2015257cf54a5810105bc4a75703a06740d756d8e8landley return 0; 2025257cf54a5810105bc4a75703a06740d756d8e8landley } 2035257cf54a5810105bc4a75703a06740d756d8e8landley} 2045257cf54a5810105bc4a75703a06740d756d8e8landley 2055257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_sym(struct menu *menu) 2065257cf54a5810105bc4a75703a06740d756d8e8landley{ 2075257cf54a5810105bc4a75703a06740d756d8e8landley struct symbol *sym = menu->sym; 2085257cf54a5810105bc4a75703a06740d756d8e8landley int type; 2095257cf54a5810105bc4a75703a06740d756d8e8landley tristate oldval, newval; 2105257cf54a5810105bc4a75703a06740d756d8e8landley const char *help; 2115257cf54a5810105bc4a75703a06740d756d8e8landley 2125257cf54a5810105bc4a75703a06740d756d8e8landley while (1) { 2135257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*s%s ", indent - 1, "", menu->prompt->text); 2145257cf54a5810105bc4a75703a06740d756d8e8landley if (sym->name) 2155257cf54a5810105bc4a75703a06740d756d8e8landley printf("(%s) ", sym->name); 2165257cf54a5810105bc4a75703a06740d756d8e8landley type = sym_get_type(sym); 2175257cf54a5810105bc4a75703a06740d756d8e8landley putchar('['); 2185257cf54a5810105bc4a75703a06740d756d8e8landley oldval = sym_get_tristate_value(sym); 2195257cf54a5810105bc4a75703a06740d756d8e8landley switch (oldval) { 2205257cf54a5810105bc4a75703a06740d756d8e8landley case no: 2215257cf54a5810105bc4a75703a06740d756d8e8landley putchar('N'); 2225257cf54a5810105bc4a75703a06740d756d8e8landley break; 2235257cf54a5810105bc4a75703a06740d756d8e8landley case mod: 2245257cf54a5810105bc4a75703a06740d756d8e8landley putchar('M'); 2255257cf54a5810105bc4a75703a06740d756d8e8landley break; 2265257cf54a5810105bc4a75703a06740d756d8e8landley case yes: 2275257cf54a5810105bc4a75703a06740d756d8e8landley putchar('Y'); 2285257cf54a5810105bc4a75703a06740d756d8e8landley break; 2295257cf54a5810105bc4a75703a06740d756d8e8landley } 2305257cf54a5810105bc4a75703a06740d756d8e8landley if (oldval != no && sym_tristate_within_range(sym, no)) 2315257cf54a5810105bc4a75703a06740d756d8e8landley printf("/n"); 2325257cf54a5810105bc4a75703a06740d756d8e8landley if (oldval != mod && sym_tristate_within_range(sym, mod)) 2335257cf54a5810105bc4a75703a06740d756d8e8landley printf("/m"); 2345257cf54a5810105bc4a75703a06740d756d8e8landley if (oldval != yes && sym_tristate_within_range(sym, yes)) 2355257cf54a5810105bc4a75703a06740d756d8e8landley printf("/y"); 2365257cf54a5810105bc4a75703a06740d756d8e8landley if (sym->help) 2375257cf54a5810105bc4a75703a06740d756d8e8landley printf("/?"); 2385257cf54a5810105bc4a75703a06740d756d8e8landley printf("] "); 2395257cf54a5810105bc4a75703a06740d756d8e8landley conf_askvalue(sym, sym_get_string_value(sym)); 2405257cf54a5810105bc4a75703a06740d756d8e8landley strip(line); 2415257cf54a5810105bc4a75703a06740d756d8e8landley 2425257cf54a5810105bc4a75703a06740d756d8e8landley switch (line[0]) { 2435257cf54a5810105bc4a75703a06740d756d8e8landley case 'n': 2445257cf54a5810105bc4a75703a06740d756d8e8landley case 'N': 2455257cf54a5810105bc4a75703a06740d756d8e8landley newval = no; 2465257cf54a5810105bc4a75703a06740d756d8e8landley if (!line[1] || !strcmp(&line[1], "o")) 2475257cf54a5810105bc4a75703a06740d756d8e8landley break; 2485257cf54a5810105bc4a75703a06740d756d8e8landley continue; 2495257cf54a5810105bc4a75703a06740d756d8e8landley case 'm': 2505257cf54a5810105bc4a75703a06740d756d8e8landley case 'M': 2515257cf54a5810105bc4a75703a06740d756d8e8landley newval = mod; 2525257cf54a5810105bc4a75703a06740d756d8e8landley if (!line[1]) 2535257cf54a5810105bc4a75703a06740d756d8e8landley break; 2545257cf54a5810105bc4a75703a06740d756d8e8landley continue; 2555257cf54a5810105bc4a75703a06740d756d8e8landley case 'y': 2565257cf54a5810105bc4a75703a06740d756d8e8landley case 'Y': 2575257cf54a5810105bc4a75703a06740d756d8e8landley newval = yes; 2585257cf54a5810105bc4a75703a06740d756d8e8landley if (!line[1] || !strcmp(&line[1], "es")) 2595257cf54a5810105bc4a75703a06740d756d8e8landley break; 2605257cf54a5810105bc4a75703a06740d756d8e8landley continue; 2615257cf54a5810105bc4a75703a06740d756d8e8landley case 0: 2625257cf54a5810105bc4a75703a06740d756d8e8landley newval = oldval; 2635257cf54a5810105bc4a75703a06740d756d8e8landley break; 2645257cf54a5810105bc4a75703a06740d756d8e8landley case '?': 2655257cf54a5810105bc4a75703a06740d756d8e8landley goto help; 2665257cf54a5810105bc4a75703a06740d756d8e8landley default: 2675257cf54a5810105bc4a75703a06740d756d8e8landley continue; 2685257cf54a5810105bc4a75703a06740d756d8e8landley } 2695257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_set_tristate_value(sym, newval)) 2705257cf54a5810105bc4a75703a06740d756d8e8landley return 0; 2715257cf54a5810105bc4a75703a06740d756d8e8landleyhelp: 2725257cf54a5810105bc4a75703a06740d756d8e8landley help = nohelp_text; 2735257cf54a5810105bc4a75703a06740d756d8e8landley if (sym->help) 2745257cf54a5810105bc4a75703a06740d756d8e8landley help = sym->help; 2755257cf54a5810105bc4a75703a06740d756d8e8landley printf("\n%s\n", help); 2765257cf54a5810105bc4a75703a06740d756d8e8landley } 2775257cf54a5810105bc4a75703a06740d756d8e8landley} 2785257cf54a5810105bc4a75703a06740d756d8e8landley 2795257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_choice(struct menu *menu) 2805257cf54a5810105bc4a75703a06740d756d8e8landley{ 2815257cf54a5810105bc4a75703a06740d756d8e8landley struct symbol *sym, *def_sym; 2825257cf54a5810105bc4a75703a06740d756d8e8landley struct menu *child; 2835257cf54a5810105bc4a75703a06740d756d8e8landley int type; 2845257cf54a5810105bc4a75703a06740d756d8e8landley bool is_new; 2855257cf54a5810105bc4a75703a06740d756d8e8landley 2865257cf54a5810105bc4a75703a06740d756d8e8landley sym = menu->sym; 2875257cf54a5810105bc4a75703a06740d756d8e8landley type = sym_get_type(sym); 2885257cf54a5810105bc4a75703a06740d756d8e8landley is_new = !sym_has_value(sym); 2895257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_is_changable(sym)) { 2905257cf54a5810105bc4a75703a06740d756d8e8landley conf_sym(menu); 2915257cf54a5810105bc4a75703a06740d756d8e8landley sym_calc_value(sym); 2925257cf54a5810105bc4a75703a06740d756d8e8landley switch (sym_get_tristate_value(sym)) { 2935257cf54a5810105bc4a75703a06740d756d8e8landley case no: 2945257cf54a5810105bc4a75703a06740d756d8e8landley return 1; 2955257cf54a5810105bc4a75703a06740d756d8e8landley case mod: 2965257cf54a5810105bc4a75703a06740d756d8e8landley return 0; 2975257cf54a5810105bc4a75703a06740d756d8e8landley case yes: 2985257cf54a5810105bc4a75703a06740d756d8e8landley break; 2995257cf54a5810105bc4a75703a06740d756d8e8landley } 3005257cf54a5810105bc4a75703a06740d756d8e8landley } else { 3015257cf54a5810105bc4a75703a06740d756d8e8landley switch (sym_get_tristate_value(sym)) { 3025257cf54a5810105bc4a75703a06740d756d8e8landley case no: 3035257cf54a5810105bc4a75703a06740d756d8e8landley return 1; 3045257cf54a5810105bc4a75703a06740d756d8e8landley case mod: 3055257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); 3065257cf54a5810105bc4a75703a06740d756d8e8landley return 0; 3075257cf54a5810105bc4a75703a06740d756d8e8landley case yes: 3085257cf54a5810105bc4a75703a06740d756d8e8landley break; 3095257cf54a5810105bc4a75703a06740d756d8e8landley } 3105257cf54a5810105bc4a75703a06740d756d8e8landley } 3115257cf54a5810105bc4a75703a06740d756d8e8landley 3125257cf54a5810105bc4a75703a06740d756d8e8landley while (1) { 3135257cf54a5810105bc4a75703a06740d756d8e8landley int cnt, def; 3145257cf54a5810105bc4a75703a06740d756d8e8landley 3155257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); 3165257cf54a5810105bc4a75703a06740d756d8e8landley def_sym = sym_get_choice_value(sym); 3175257cf54a5810105bc4a75703a06740d756d8e8landley cnt = def = 0; 3185257cf54a5810105bc4a75703a06740d756d8e8landley line[0] = 0; 3195257cf54a5810105bc4a75703a06740d756d8e8landley for (child = menu->list; child; child = child->next) { 3205257cf54a5810105bc4a75703a06740d756d8e8landley if (!menu_is_visible(child)) 3215257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3225257cf54a5810105bc4a75703a06740d756d8e8landley if (!child->sym) { 3235257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*c %s\n", indent, '*', menu_get_prompt(child)); 3245257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3255257cf54a5810105bc4a75703a06740d756d8e8landley } 3265257cf54a5810105bc4a75703a06740d756d8e8landley cnt++; 3275257cf54a5810105bc4a75703a06740d756d8e8landley if (child->sym == def_sym) { 3285257cf54a5810105bc4a75703a06740d756d8e8landley def = cnt; 3295257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*c", indent, '>'); 3305257cf54a5810105bc4a75703a06740d756d8e8landley } else 3315257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*c", indent, ' '); 3325257cf54a5810105bc4a75703a06740d756d8e8landley printf(" %d. %s", cnt, menu_get_prompt(child)); 3335257cf54a5810105bc4a75703a06740d756d8e8landley if (child->sym->name) 3345257cf54a5810105bc4a75703a06740d756d8e8landley printf(" (%s)", child->sym->name); 3355257cf54a5810105bc4a75703a06740d756d8e8landley if (!sym_has_value(child->sym)) 3365257cf54a5810105bc4a75703a06740d756d8e8landley printf(" (NEW)"); 3375257cf54a5810105bc4a75703a06740d756d8e8landley printf("\n"); 3385257cf54a5810105bc4a75703a06740d756d8e8landley } 3395257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*schoice", indent - 1, ""); 3405257cf54a5810105bc4a75703a06740d756d8e8landley if (cnt == 1) { 3415257cf54a5810105bc4a75703a06740d756d8e8landley printf("[1]: 1\n"); 3425257cf54a5810105bc4a75703a06740d756d8e8landley goto conf_childs; 3435257cf54a5810105bc4a75703a06740d756d8e8landley } 3445257cf54a5810105bc4a75703a06740d756d8e8landley printf("[1-%d", cnt); 3455257cf54a5810105bc4a75703a06740d756d8e8landley if (sym->help) 3465257cf54a5810105bc4a75703a06740d756d8e8landley printf("?"); 3475257cf54a5810105bc4a75703a06740d756d8e8landley printf("]: "); 3485257cf54a5810105bc4a75703a06740d756d8e8landley switch (input_mode) { 3495257cf54a5810105bc4a75703a06740d756d8e8landley case ask_new: 3505257cf54a5810105bc4a75703a06740d756d8e8landley case ask_silent: 3515257cf54a5810105bc4a75703a06740d756d8e8landley if (!is_new) { 3525257cf54a5810105bc4a75703a06740d756d8e8landley cnt = def; 3535257cf54a5810105bc4a75703a06740d756d8e8landley printf("%d\n", cnt); 3545257cf54a5810105bc4a75703a06740d756d8e8landley break; 3555257cf54a5810105bc4a75703a06740d756d8e8landley } 3565257cf54a5810105bc4a75703a06740d756d8e8landley check_stdin(); 3575257cf54a5810105bc4a75703a06740d756d8e8landley case ask_all: 3585257cf54a5810105bc4a75703a06740d756d8e8landley fflush(stdout); 3595257cf54a5810105bc4a75703a06740d756d8e8landley fgets(line, 128, stdin); 3605257cf54a5810105bc4a75703a06740d756d8e8landley strip(line); 3615257cf54a5810105bc4a75703a06740d756d8e8landley if (line[0] == '?') { 3625257cf54a5810105bc4a75703a06740d756d8e8landley printf("\n%s\n", menu->sym->help ? 3635257cf54a5810105bc4a75703a06740d756d8e8landley menu->sym->help : nohelp_text); 3645257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3655257cf54a5810105bc4a75703a06740d756d8e8landley } 3665257cf54a5810105bc4a75703a06740d756d8e8landley if (!line[0]) 3675257cf54a5810105bc4a75703a06740d756d8e8landley cnt = def; 3685257cf54a5810105bc4a75703a06740d756d8e8landley else if (isdigit(line[0])) 3695257cf54a5810105bc4a75703a06740d756d8e8landley cnt = atoi(line); 3705257cf54a5810105bc4a75703a06740d756d8e8landley else 3715257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3725257cf54a5810105bc4a75703a06740d756d8e8landley break; 3735257cf54a5810105bc4a75703a06740d756d8e8landley case set_random: 3745257cf54a5810105bc4a75703a06740d756d8e8landley def = (random() % cnt) + 1; 3755257cf54a5810105bc4a75703a06740d756d8e8landley case set_default: 3765257cf54a5810105bc4a75703a06740d756d8e8landley case set_yes: 3775257cf54a5810105bc4a75703a06740d756d8e8landley case set_mod: 3785257cf54a5810105bc4a75703a06740d756d8e8landley case set_no: 3795257cf54a5810105bc4a75703a06740d756d8e8landley cnt = def; 3805257cf54a5810105bc4a75703a06740d756d8e8landley printf("%d\n", cnt); 3815257cf54a5810105bc4a75703a06740d756d8e8landley break; 3825257cf54a5810105bc4a75703a06740d756d8e8landley } 3835257cf54a5810105bc4a75703a06740d756d8e8landley 3845257cf54a5810105bc4a75703a06740d756d8e8landley conf_childs: 3855257cf54a5810105bc4a75703a06740d756d8e8landley for (child = menu->list; child; child = child->next) { 3865257cf54a5810105bc4a75703a06740d756d8e8landley if (!child->sym || !menu_is_visible(child)) 3875257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3885257cf54a5810105bc4a75703a06740d756d8e8landley if (!--cnt) 3895257cf54a5810105bc4a75703a06740d756d8e8landley break; 3905257cf54a5810105bc4a75703a06740d756d8e8landley } 3915257cf54a5810105bc4a75703a06740d756d8e8landley if (!child) 3925257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3935257cf54a5810105bc4a75703a06740d756d8e8landley if (line[strlen(line) - 1] == '?') { 3945257cf54a5810105bc4a75703a06740d756d8e8landley printf("\n%s\n", child->sym->help ? 3955257cf54a5810105bc4a75703a06740d756d8e8landley child->sym->help : nohelp_text); 3965257cf54a5810105bc4a75703a06740d756d8e8landley continue; 3975257cf54a5810105bc4a75703a06740d756d8e8landley } 3985257cf54a5810105bc4a75703a06740d756d8e8landley sym_set_choice_value(sym, child->sym); 3995257cf54a5810105bc4a75703a06740d756d8e8landley if (child->list) { 4005257cf54a5810105bc4a75703a06740d756d8e8landley indent += 2; 4015257cf54a5810105bc4a75703a06740d756d8e8landley conf(child->list); 4025257cf54a5810105bc4a75703a06740d756d8e8landley indent -= 2; 4035257cf54a5810105bc4a75703a06740d756d8e8landley } 4045257cf54a5810105bc4a75703a06740d756d8e8landley return 1; 4055257cf54a5810105bc4a75703a06740d756d8e8landley } 4065257cf54a5810105bc4a75703a06740d756d8e8landley} 4075257cf54a5810105bc4a75703a06740d756d8e8landley 4085257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf(struct menu *menu) 4095257cf54a5810105bc4a75703a06740d756d8e8landley{ 4105257cf54a5810105bc4a75703a06740d756d8e8landley struct symbol *sym; 4115257cf54a5810105bc4a75703a06740d756d8e8landley struct property *prop; 4125257cf54a5810105bc4a75703a06740d756d8e8landley struct menu *child; 4135257cf54a5810105bc4a75703a06740d756d8e8landley 4145257cf54a5810105bc4a75703a06740d756d8e8landley if (!menu_is_visible(menu)) 4155257cf54a5810105bc4a75703a06740d756d8e8landley return; 4165257cf54a5810105bc4a75703a06740d756d8e8landley 4175257cf54a5810105bc4a75703a06740d756d8e8landley sym = menu->sym; 4185257cf54a5810105bc4a75703a06740d756d8e8landley prop = menu->prompt; 4195257cf54a5810105bc4a75703a06740d756d8e8landley if (prop) { 4205257cf54a5810105bc4a75703a06740d756d8e8landley const char *prompt; 4215257cf54a5810105bc4a75703a06740d756d8e8landley 4225257cf54a5810105bc4a75703a06740d756d8e8landley switch (prop->type) { 4235257cf54a5810105bc4a75703a06740d756d8e8landley case P_MENU: 4245257cf54a5810105bc4a75703a06740d756d8e8landley if (input_mode == ask_silent && rootEntry != menu) { 4255257cf54a5810105bc4a75703a06740d756d8e8landley check_conf(menu); 4265257cf54a5810105bc4a75703a06740d756d8e8landley return; 4275257cf54a5810105bc4a75703a06740d756d8e8landley } 4285257cf54a5810105bc4a75703a06740d756d8e8landley case P_COMMENT: 4295257cf54a5810105bc4a75703a06740d756d8e8landley prompt = menu_get_prompt(menu); 4305257cf54a5810105bc4a75703a06740d756d8e8landley if (prompt) 4315257cf54a5810105bc4a75703a06740d756d8e8landley printf("%*c\n%*c %s\n%*c\n", 4325257cf54a5810105bc4a75703a06740d756d8e8landley indent, '*', 4335257cf54a5810105bc4a75703a06740d756d8e8landley indent, '*', prompt, 4345257cf54a5810105bc4a75703a06740d756d8e8landley indent, '*'); 4355257cf54a5810105bc4a75703a06740d756d8e8landley default: 4365257cf54a5810105bc4a75703a06740d756d8e8landley ; 4375257cf54a5810105bc4a75703a06740d756d8e8landley } 4385257cf54a5810105bc4a75703a06740d756d8e8landley } 4395257cf54a5810105bc4a75703a06740d756d8e8landley 4405257cf54a5810105bc4a75703a06740d756d8e8landley if (!sym) 4415257cf54a5810105bc4a75703a06740d756d8e8landley goto conf_childs; 4425257cf54a5810105bc4a75703a06740d756d8e8landley 4435257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_is_choice(sym)) { 4445257cf54a5810105bc4a75703a06740d756d8e8landley conf_choice(menu); 4455257cf54a5810105bc4a75703a06740d756d8e8landley if (sym->curr.tri != mod) 4465257cf54a5810105bc4a75703a06740d756d8e8landley return; 4475257cf54a5810105bc4a75703a06740d756d8e8landley goto conf_childs; 4485257cf54a5810105bc4a75703a06740d756d8e8landley } 4495257cf54a5810105bc4a75703a06740d756d8e8landley 4505257cf54a5810105bc4a75703a06740d756d8e8landley switch (sym->type) { 4515257cf54a5810105bc4a75703a06740d756d8e8landley case S_INT: 4525257cf54a5810105bc4a75703a06740d756d8e8landley case S_HEX: 4535257cf54a5810105bc4a75703a06740d756d8e8landley case S_STRING: 4545257cf54a5810105bc4a75703a06740d756d8e8landley conf_string(menu); 4555257cf54a5810105bc4a75703a06740d756d8e8landley break; 4565257cf54a5810105bc4a75703a06740d756d8e8landley default: 4575257cf54a5810105bc4a75703a06740d756d8e8landley conf_sym(menu); 4585257cf54a5810105bc4a75703a06740d756d8e8landley break; 4595257cf54a5810105bc4a75703a06740d756d8e8landley } 4605257cf54a5810105bc4a75703a06740d756d8e8landley 4615257cf54a5810105bc4a75703a06740d756d8e8landleyconf_childs: 4625257cf54a5810105bc4a75703a06740d756d8e8landley if (sym) 4635257cf54a5810105bc4a75703a06740d756d8e8landley indent += 2; 4645257cf54a5810105bc4a75703a06740d756d8e8landley for (child = menu->list; child; child = child->next) 4655257cf54a5810105bc4a75703a06740d756d8e8landley conf(child); 4665257cf54a5810105bc4a75703a06740d756d8e8landley if (sym) 4675257cf54a5810105bc4a75703a06740d756d8e8landley indent -= 2; 4685257cf54a5810105bc4a75703a06740d756d8e8landley} 4695257cf54a5810105bc4a75703a06740d756d8e8landley 4705257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_conf(struct menu *menu) 4715257cf54a5810105bc4a75703a06740d756d8e8landley{ 4725257cf54a5810105bc4a75703a06740d756d8e8landley struct symbol *sym; 4735257cf54a5810105bc4a75703a06740d756d8e8landley struct menu *child; 4745257cf54a5810105bc4a75703a06740d756d8e8landley 4755257cf54a5810105bc4a75703a06740d756d8e8landley if (!menu_is_visible(menu)) 4765257cf54a5810105bc4a75703a06740d756d8e8landley return; 4775257cf54a5810105bc4a75703a06740d756d8e8landley 4785257cf54a5810105bc4a75703a06740d756d8e8landley sym = menu->sym; 4795257cf54a5810105bc4a75703a06740d756d8e8landley if (sym && !sym_has_value(sym)) { 4805257cf54a5810105bc4a75703a06740d756d8e8landley if (sym_is_changable(sym) || 4815257cf54a5810105bc4a75703a06740d756d8e8landley (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { 4825257cf54a5810105bc4a75703a06740d756d8e8landley if (!conf_cnt++) 4835257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("*\n* Restart config...\n*\n")); 4845257cf54a5810105bc4a75703a06740d756d8e8landley rootEntry = menu_get_parent_menu(menu); 4855257cf54a5810105bc4a75703a06740d756d8e8landley conf(rootEntry); 4865257cf54a5810105bc4a75703a06740d756d8e8landley } 4875257cf54a5810105bc4a75703a06740d756d8e8landley } 4885257cf54a5810105bc4a75703a06740d756d8e8landley 4895257cf54a5810105bc4a75703a06740d756d8e8landley for (child = menu->list; child; child = child->next) 4905257cf54a5810105bc4a75703a06740d756d8e8landley check_conf(child); 4915257cf54a5810105bc4a75703a06740d756d8e8landley} 4925257cf54a5810105bc4a75703a06740d756d8e8landley 4935257cf54a5810105bc4a75703a06740d756d8e8landleyint main(int ac, char **av) 4945257cf54a5810105bc4a75703a06740d756d8e8landley{ 4955257cf54a5810105bc4a75703a06740d756d8e8landley int i = 1; 4965257cf54a5810105bc4a75703a06740d756d8e8landley const char *name; 4975257cf54a5810105bc4a75703a06740d756d8e8landley struct stat tmpstat; 4985257cf54a5810105bc4a75703a06740d756d8e8landley 4995257cf54a5810105bc4a75703a06740d756d8e8landley if (ac > i && av[i][0] == '-') { 5005257cf54a5810105bc4a75703a06740d756d8e8landley switch (av[i++][1]) { 5015257cf54a5810105bc4a75703a06740d756d8e8landley case 'o': 5025257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = ask_new; 5035257cf54a5810105bc4a75703a06740d756d8e8landley break; 5045257cf54a5810105bc4a75703a06740d756d8e8landley case 's': 5055257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = ask_silent; 5065257cf54a5810105bc4a75703a06740d756d8e8landley valid_stdin = isatty(0) && isatty(1) && isatty(2); 5075257cf54a5810105bc4a75703a06740d756d8e8landley break; 5085257cf54a5810105bc4a75703a06740d756d8e8landley case 'd': 5095257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_default; 5105257cf54a5810105bc4a75703a06740d756d8e8landley break; 5115257cf54a5810105bc4a75703a06740d756d8e8landley case 'D': 5125257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_default; 5135257cf54a5810105bc4a75703a06740d756d8e8landley defconfig_file = av[i++]; 5145257cf54a5810105bc4a75703a06740d756d8e8landley if (!defconfig_file) { 5155257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("%s: No default config file specified\n"), 5165257cf54a5810105bc4a75703a06740d756d8e8landley av[0]); 5175257cf54a5810105bc4a75703a06740d756d8e8landley exit(1); 5185257cf54a5810105bc4a75703a06740d756d8e8landley } 5195257cf54a5810105bc4a75703a06740d756d8e8landley break; 5205257cf54a5810105bc4a75703a06740d756d8e8landley case 'n': 5215257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_no; 5225257cf54a5810105bc4a75703a06740d756d8e8landley break; 5235257cf54a5810105bc4a75703a06740d756d8e8landley case 'm': 5245257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_mod; 5255257cf54a5810105bc4a75703a06740d756d8e8landley break; 5265257cf54a5810105bc4a75703a06740d756d8e8landley case 'y': 5275257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_yes; 5285257cf54a5810105bc4a75703a06740d756d8e8landley break; 5295257cf54a5810105bc4a75703a06740d756d8e8landley case 'r': 5305257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = set_random; 5315257cf54a5810105bc4a75703a06740d756d8e8landley srandom(time(NULL)); 5325257cf54a5810105bc4a75703a06740d756d8e8landley break; 5335257cf54a5810105bc4a75703a06740d756d8e8landley case 'h': 5345257cf54a5810105bc4a75703a06740d756d8e8landley case '?': 5355257cf54a5810105bc4a75703a06740d756d8e8landley fprintf(stderr, "See README for usage info\n"); 5365257cf54a5810105bc4a75703a06740d756d8e8landley exit(0); 5375257cf54a5810105bc4a75703a06740d756d8e8landley } 5385257cf54a5810105bc4a75703a06740d756d8e8landley } 5395257cf54a5810105bc4a75703a06740d756d8e8landley name = av[i]; 5405257cf54a5810105bc4a75703a06740d756d8e8landley if (!name) { 5415257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("%s: Kconfig file missing\n"), av[0]); 5425257cf54a5810105bc4a75703a06740d756d8e8landley exit(1); 5435257cf54a5810105bc4a75703a06740d756d8e8landley } 5445257cf54a5810105bc4a75703a06740d756d8e8landley conf_parse(name); 5455257cf54a5810105bc4a75703a06740d756d8e8landley //zconfdump(stdout); 5465257cf54a5810105bc4a75703a06740d756d8e8landley switch (input_mode) { 5475257cf54a5810105bc4a75703a06740d756d8e8landley case set_default: 5485257cf54a5810105bc4a75703a06740d756d8e8landley if (!defconfig_file) 5495257cf54a5810105bc4a75703a06740d756d8e8landley defconfig_file = conf_get_default_confname(); 5505257cf54a5810105bc4a75703a06740d756d8e8landley if (conf_read(defconfig_file)) { 5515257cf54a5810105bc4a75703a06740d756d8e8landley printf("***\n" 5525257cf54a5810105bc4a75703a06740d756d8e8landley "*** Can't find default configuration \"%s\"!\n" 5535257cf54a5810105bc4a75703a06740d756d8e8landley "***\n", defconfig_file); 5545257cf54a5810105bc4a75703a06740d756d8e8landley exit(1); 5555257cf54a5810105bc4a75703a06740d756d8e8landley } 5565257cf54a5810105bc4a75703a06740d756d8e8landley break; 5575257cf54a5810105bc4a75703a06740d756d8e8landley case ask_silent: 5585257cf54a5810105bc4a75703a06740d756d8e8landley if (stat(".config", &tmpstat)) { 5595257cf54a5810105bc4a75703a06740d756d8e8landley printf(_("***\n" 5605257cf54a5810105bc4a75703a06740d756d8e8landley "*** You have not yet configured your "PROJECT_NAME"!\n" 5615257cf54a5810105bc4a75703a06740d756d8e8landley "***\n" 5625257cf54a5810105bc4a75703a06740d756d8e8landley "*** Please run some configurator (e.g. \"make oldconfig\" or\n" 5635257cf54a5810105bc4a75703a06740d756d8e8landley "*** \"make menuconfig\" or \"make xconfig\").\n" 5645257cf54a5810105bc4a75703a06740d756d8e8landley "***\n")); 5655257cf54a5810105bc4a75703a06740d756d8e8landley exit(1); 5665257cf54a5810105bc4a75703a06740d756d8e8landley } 5675257cf54a5810105bc4a75703a06740d756d8e8landley case ask_all: 5685257cf54a5810105bc4a75703a06740d756d8e8landley case ask_new: 5695257cf54a5810105bc4a75703a06740d756d8e8landley conf_read(NULL); 5705257cf54a5810105bc4a75703a06740d756d8e8landley break; 5715257cf54a5810105bc4a75703a06740d756d8e8landley case set_no: 5725257cf54a5810105bc4a75703a06740d756d8e8landley case set_mod: 5735257cf54a5810105bc4a75703a06740d756d8e8landley case set_yes: 5745257cf54a5810105bc4a75703a06740d756d8e8landley case set_random: 5755257cf54a5810105bc4a75703a06740d756d8e8landley name = getenv("KCONFIG_ALLCONFIG"); 5765257cf54a5810105bc4a75703a06740d756d8e8landley if (name && !stat(name, &tmpstat)) { 5775257cf54a5810105bc4a75703a06740d756d8e8landley conf_read_simple(name, S_DEF_USER); 5785257cf54a5810105bc4a75703a06740d756d8e8landley break; 5795257cf54a5810105bc4a75703a06740d756d8e8landley } 5805257cf54a5810105bc4a75703a06740d756d8e8landley switch (input_mode) { 5815257cf54a5810105bc4a75703a06740d756d8e8landley case set_no: name = "allno.config"; break; 5825257cf54a5810105bc4a75703a06740d756d8e8landley case set_mod: name = "allmod.config"; break; 5835257cf54a5810105bc4a75703a06740d756d8e8landley case set_yes: name = "allyes.config"; break; 5845257cf54a5810105bc4a75703a06740d756d8e8landley case set_random: name = "allrandom.config"; break; 5855257cf54a5810105bc4a75703a06740d756d8e8landley default: break; 5865257cf54a5810105bc4a75703a06740d756d8e8landley } 5875257cf54a5810105bc4a75703a06740d756d8e8landley if (!stat(name, &tmpstat)) 5885257cf54a5810105bc4a75703a06740d756d8e8landley conf_read_simple(name, S_DEF_USER); 5895257cf54a5810105bc4a75703a06740d756d8e8landley else if (!stat("all.config", &tmpstat)) 5905257cf54a5810105bc4a75703a06740d756d8e8landley conf_read_simple("all.config", S_DEF_USER); 5915257cf54a5810105bc4a75703a06740d756d8e8landley break; 5925257cf54a5810105bc4a75703a06740d756d8e8landley default: 5935257cf54a5810105bc4a75703a06740d756d8e8landley break; 5945257cf54a5810105bc4a75703a06740d756d8e8landley } 5955257cf54a5810105bc4a75703a06740d756d8e8landley 5965257cf54a5810105bc4a75703a06740d756d8e8landley if (input_mode != ask_silent) { 5975257cf54a5810105bc4a75703a06740d756d8e8landley rootEntry = &rootmenu; 5985257cf54a5810105bc4a75703a06740d756d8e8landley conf(&rootmenu); 5995257cf54a5810105bc4a75703a06740d756d8e8landley if (input_mode == ask_all) { 6005257cf54a5810105bc4a75703a06740d756d8e8landley input_mode = ask_silent; 6015257cf54a5810105bc4a75703a06740d756d8e8landley valid_stdin = 1; 6025257cf54a5810105bc4a75703a06740d756d8e8landley } 6035257cf54a5810105bc4a75703a06740d756d8e8landley } else if (sym_change_count) { 6045257cf54a5810105bc4a75703a06740d756d8e8landley name = getenv("KCONFIG_NOSILENTUPDATE"); 6055257cf54a5810105bc4a75703a06740d756d8e8landley if (name && *name) { 6065257cf54a5810105bc4a75703a06740d756d8e8landley fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n")); 6075257cf54a5810105bc4a75703a06740d756d8e8landley return 1; 6085257cf54a5810105bc4a75703a06740d756d8e8landley } 6095257cf54a5810105bc4a75703a06740d756d8e8landley } else 6105257cf54a5810105bc4a75703a06740d756d8e8landley goto skip_check; 6115257cf54a5810105bc4a75703a06740d756d8e8landley 6125257cf54a5810105bc4a75703a06740d756d8e8landley do { 6135257cf54a5810105bc4a75703a06740d756d8e8landley conf_cnt = 0; 6145257cf54a5810105bc4a75703a06740d756d8e8landley check_conf(&rootmenu); 6155257cf54a5810105bc4a75703a06740d756d8e8landley } while (conf_cnt); 6165257cf54a5810105bc4a75703a06740d756d8e8landley 6175257cf54a5810105bc4a75703a06740d756d8e8landley if (!conf_write(NULL)) { 6185257cf54a5810105bc4a75703a06740d756d8e8landleyskip_check: 6195257cf54a5810105bc4a75703a06740d756d8e8landley if (!(input_mode == ask_silent && conf_write_autoconf())) 6205257cf54a5810105bc4a75703a06740d756d8e8landley return 0; 6215257cf54a5810105bc4a75703a06740d756d8e8landley } 6225257cf54a5810105bc4a75703a06740d756d8e8landley fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n")); 6235257cf54a5810105bc4a75703a06740d756d8e8landley return 1; 6245257cf54a5810105bc4a75703a06740d756d8e8landley} 625