xref: /linux/scripts/kconfig/conf.c (revision 8c00e580)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
4  */
5 
6 #include <ctype.h>
7 #include <limits.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <time.h>
12 #include <unistd.h>
13 #include <getopt.h>
14 #include <sys/time.h>
15 #include <errno.h>
16 
17 #include "internal.h"
18 #include "lkc.h"
19 
20 static void conf(struct menu *menu);
21 static void check_conf(struct menu *menu);
22 
23 enum input_mode {
24 	oldaskconfig,
25 	syncconfig,
26 	oldconfig,
27 	allnoconfig,
28 	allyesconfig,
29 	allmodconfig,
30 	alldefconfig,
31 	randconfig,
32 	defconfig,
33 	savedefconfig,
34 	listnewconfig,
35 	helpnewconfig,
36 	olddefconfig,
37 	yes2modconfig,
38 	mod2yesconfig,
39 	mod2noconfig,
40 };
41 static enum input_mode input_mode = oldaskconfig;
42 static int input_mode_opt;
43 static int indent = 1;
44 static int tty_stdio;
45 static int sync_kconfig;
46 static int conf_cnt;
47 static char line[PATH_MAX];
48 static struct menu *rootEntry;
49 
print_help(struct menu * menu)50 static void print_help(struct menu *menu)
51 {
52 	struct gstr help = str_new();
53 
54 	menu_get_ext_help(menu, &help);
55 
56 	printf("\n%s\n", str_get(&help));
57 	str_free(&help);
58 }
59 
strip(char * str)60 static void strip(char *str)
61 {
62 	char *p = str;
63 	int l;
64 
65 	while ((isspace(*p)))
66 		p++;
67 	l = strlen(p);
68 	if (p != str)
69 		memmove(str, p, l + 1);
70 	if (!l)
71 		return;
72 	p = str + l - 1;
73 	while ((isspace(*p)))
74 		*p-- = 0;
75 }
76 
77 /* Helper function to facilitate fgets() by Jean Sacren. */
xfgets(char * str,int size,FILE * in)78 static void xfgets(char *str, int size, FILE *in)
79 {
80 	if (!fgets(str, size, in))
81 		fprintf(stderr, "\nError in reading or end of file.\n");
82 
83 	if (!tty_stdio)
84 		printf("%s", str);
85 }
86 
set_randconfig_seed(void)87 static void set_randconfig_seed(void)
88 {
89 	unsigned int seed;
90 	char *env;
91 	bool seed_set = false;
92 
93 	env = getenv("KCONFIG_SEED");
94 	if (env && *env) {
95 		char *endp;
96 
97 		seed = strtol(env, &endp, 0);
98 		if (*endp == '\0')
99 			seed_set = true;
100 	}
101 
102 	if (!seed_set) {
103 		struct timeval now;
104 
105 		/*
106 		 * Use microseconds derived seed, compensate for systems where it may
107 		 * be zero.
108 		 */
109 		gettimeofday(&now, NULL);
110 		seed = (now.tv_sec + 1) * (now.tv_usec + 1);
111 	}
112 
113 	printf("KCONFIG_SEED=0x%X\n", seed);
114 	srand(seed);
115 }
116 
randomize_choice_values(struct symbol * csym)117 static bool randomize_choice_values(struct symbol *csym)
118 {
119 	struct property *prop;
120 	struct symbol *sym;
121 	struct expr *e;
122 	int cnt, def;
123 
124 	/*
125 	 * If choice is mod then we may have more items selected
126 	 * and if no then no-one.
127 	 * In both cases stop.
128 	 */
129 	if (csym->curr.tri != yes)
130 		return false;
131 
132 	prop = sym_get_choice_prop(csym);
133 
134 	/* count entries in choice block */
135 	cnt = 0;
136 	expr_list_for_each_sym(prop->expr, e, sym)
137 		cnt++;
138 
139 	/*
140 	 * find a random value and set it to yes,
141 	 * set the rest to no so we have only one set
142 	 */
143 	def = rand() % cnt;
144 
145 	cnt = 0;
146 	expr_list_for_each_sym(prop->expr, e, sym) {
147 		if (def == cnt++) {
148 			sym->def[S_DEF_USER].tri = yes;
149 			csym->def[S_DEF_USER].val = sym;
150 		} else {
151 			sym->def[S_DEF_USER].tri = no;
152 		}
153 		sym->flags |= SYMBOL_DEF_USER;
154 		/* clear VALID to get value calculated */
155 		sym->flags &= ~SYMBOL_VALID;
156 	}
157 	csym->flags |= SYMBOL_DEF_USER;
158 	/* clear VALID to get value calculated */
159 	csym->flags &= ~SYMBOL_VALID;
160 
161 	return true;
162 }
163 
164 enum conf_def_mode {
165 	def_default,
166 	def_yes,
167 	def_mod,
168 	def_no,
169 	def_random
170 };
171 
conf_set_all_new_symbols(enum conf_def_mode mode)172 static bool conf_set_all_new_symbols(enum conf_def_mode mode)
173 {
174 	struct symbol *sym, *csym;
175 	int cnt;
176 	/*
177 	 * can't go as the default in switch-case below, otherwise gcc whines
178 	 * about -Wmaybe-uninitialized
179 	 */
180 	int pby = 50; /* probability of bool     = y */
181 	int pty = 33; /* probability of tristate = y */
182 	int ptm = 33; /* probability of tristate = m */
183 	bool has_changed = false;
184 
185 	if (mode == def_random) {
186 		int n, p[3];
187 		char *env = getenv("KCONFIG_PROBABILITY");
188 
189 		n = 0;
190 		while (env && *env) {
191 			char *endp;
192 			int tmp = strtol(env, &endp, 10);
193 
194 			if (tmp >= 0 && tmp <= 100) {
195 				p[n++] = tmp;
196 			} else {
197 				errno = ERANGE;
198 				perror("KCONFIG_PROBABILITY");
199 				exit(1);
200 			}
201 			env = (*endp == ':') ? endp + 1 : endp;
202 			if (n >= 3)
203 				break;
204 		}
205 		switch (n) {
206 		case 1:
207 			pby = p[0];
208 			ptm = pby / 2;
209 			pty = pby - ptm;
210 			break;
211 		case 2:
212 			pty = p[0];
213 			ptm = p[1];
214 			pby = pty + ptm;
215 			break;
216 		case 3:
217 			pby = p[0];
218 			pty = p[1];
219 			ptm = p[2];
220 			break;
221 		}
222 
223 		if (pty + ptm > 100) {
224 			errno = ERANGE;
225 			perror("KCONFIG_PROBABILITY");
226 			exit(1);
227 		}
228 	}
229 
230 	for_all_symbols(sym) {
231 		if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
232 			continue;
233 		switch (sym_get_type(sym)) {
234 		case S_BOOLEAN:
235 		case S_TRISTATE:
236 			has_changed = true;
237 			switch (mode) {
238 			case def_yes:
239 				sym->def[S_DEF_USER].tri = yes;
240 				break;
241 			case def_mod:
242 				sym->def[S_DEF_USER].tri = mod;
243 				break;
244 			case def_no:
245 				sym->def[S_DEF_USER].tri = no;
246 				break;
247 			case def_random:
248 				sym->def[S_DEF_USER].tri = no;
249 				cnt = rand() % 100;
250 				if (sym->type == S_TRISTATE) {
251 					if (cnt < pty)
252 						sym->def[S_DEF_USER].tri = yes;
253 					else if (cnt < pty + ptm)
254 						sym->def[S_DEF_USER].tri = mod;
255 				} else if (cnt < pby)
256 					sym->def[S_DEF_USER].tri = yes;
257 				break;
258 			default:
259 				continue;
260 			}
261 			if (!(sym_is_choice(sym) && mode == def_random))
262 				sym->flags |= SYMBOL_DEF_USER;
263 			break;
264 		default:
265 			break;
266 		}
267 
268 	}
269 
270 	sym_clear_all_valid();
271 
272 	/*
273 	 * We have different type of choice blocks.
274 	 * If curr.tri equals to mod then we can select several
275 	 * choice symbols in one block.
276 	 * In this case we do nothing.
277 	 * If curr.tri equals yes then only one symbol can be
278 	 * selected in a choice block and we set it to yes,
279 	 * and the rest to no.
280 	 */
281 	if (mode != def_random) {
282 		for_all_symbols(csym) {
283 			if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
284 			    sym_is_choice_value(csym))
285 				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
286 		}
287 	}
288 
289 	for_all_symbols(csym) {
290 		if (sym_has_value(csym) || !sym_is_choice(csym))
291 			continue;
292 
293 		sym_calc_value(csym);
294 		if (mode == def_random)
295 			has_changed |= randomize_choice_values(csym);
296 		else {
297 			set_all_choice_values(csym);
298 			has_changed = true;
299 		}
300 	}
301 
302 	return has_changed;
303 }
304 
conf_rewrite_tristates(tristate old_val,tristate new_val)305 static void conf_rewrite_tristates(tristate old_val, tristate new_val)
306 {
307 	struct symbol *sym;
308 
309 	for_all_symbols(sym) {
310 		if (sym_get_type(sym) == S_TRISTATE &&
311 		    sym->def[S_DEF_USER].tri == old_val)
312 			sym->def[S_DEF_USER].tri = new_val;
313 	}
314 	sym_clear_all_valid();
315 }
316 
conf_askvalue(struct symbol * sym,const char * def)317 static int conf_askvalue(struct symbol *sym, const char *def)
318 {
319 	if (!sym_has_value(sym))
320 		printf("(NEW) ");
321 
322 	line[0] = '\n';
323 	line[1] = 0;
324 
325 	if (!sym_is_changeable(sym)) {
326 		printf("%s\n", def);
327 		line[0] = '\n';
328 		line[1] = 0;
329 		return 0;
330 	}
331 
332 	switch (input_mode) {
333 	case oldconfig:
334 	case syncconfig:
335 		if (sym_has_value(sym)) {
336 			printf("%s\n", def);
337 			return 0;
338 		}
339 		/* fall through */
340 	default:
341 		fflush(stdout);
342 		xfgets(line, sizeof(line), stdin);
343 		break;
344 	}
345 
346 	return 1;
347 }
348 
conf_string(struct menu * menu)349 static int conf_string(struct menu *menu)
350 {
351 	struct symbol *sym = menu->sym;
352 	const char *def;
353 
354 	while (1) {
355 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
356 		printf("(%s) ", sym->name);
357 		def = sym_get_string_value(sym);
358 		if (def)
359 			printf("[%s] ", def);
360 		if (!conf_askvalue(sym, def))
361 			return 0;
362 		switch (line[0]) {
363 		case '\n':
364 			break;
365 		case '?':
366 			/* print help */
367 			if (line[1] == '\n') {
368 				print_help(menu);
369 				def = NULL;
370 				break;
371 			}
372 			/* fall through */
373 		default:
374 			line[strlen(line)-1] = 0;
375 			def = line;
376 		}
377 		if (def && sym_set_string_value(sym, def))
378 			return 0;
379 	}
380 }
381 
conf_sym(struct menu * menu)382 static int conf_sym(struct menu *menu)
383 {
384 	struct symbol *sym = menu->sym;
385 	tristate oldval, newval;
386 
387 	while (1) {
388 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
389 		if (sym->name)
390 			printf("(%s) ", sym->name);
391 		putchar('[');
392 		oldval = sym_get_tristate_value(sym);
393 		switch (oldval) {
394 		case no:
395 			putchar('N');
396 			break;
397 		case mod:
398 			putchar('M');
399 			break;
400 		case yes:
401 			putchar('Y');
402 			break;
403 		}
404 		if (oldval != no && sym_tristate_within_range(sym, no))
405 			printf("/n");
406 		if (oldval != mod && sym_tristate_within_range(sym, mod))
407 			printf("/m");
408 		if (oldval != yes && sym_tristate_within_range(sym, yes))
409 			printf("/y");
410 		printf("/?] ");
411 		if (!conf_askvalue(sym, sym_get_string_value(sym)))
412 			return 0;
413 		strip(line);
414 
415 		switch (line[0]) {
416 		case 'n':
417 		case 'N':
418 			newval = no;
419 			if (!line[1] || !strcmp(&line[1], "o"))
420 				break;
421 			continue;
422 		case 'm':
423 		case 'M':
424 			newval = mod;
425 			if (!line[1])
426 				break;
427 			continue;
428 		case 'y':
429 		case 'Y':
430 			newval = yes;
431 			if (!line[1] || !strcmp(&line[1], "es"))
432 				break;
433 			continue;
434 		case 0:
435 			newval = oldval;
436 			break;
437 		case '?':
438 			goto help;
439 		default:
440 			continue;
441 		}
442 		if (sym_set_tristate_value(sym, newval))
443 			return 0;
444 help:
445 		print_help(menu);
446 	}
447 }
448 
conf_choice(struct menu * menu)449 static void conf_choice(struct menu *menu)
450 {
451 	struct symbol *sym, *def_sym;
452 	struct menu *child;
453 	bool is_new;
454 
455 	sym = menu->sym;
456 	is_new = !sym_has_value(sym);
457 	if (sym_is_changeable(sym)) {
458 		conf_sym(menu);
459 		sym_calc_value(sym);
460 		switch (sym_get_tristate_value(sym)) {
461 		case no:
462 		case mod:
463 			return;
464 		case yes:
465 			break;
466 		}
467 	} else {
468 		switch (sym_get_tristate_value(sym)) {
469 		case no:
470 			return;
471 		case mod:
472 			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
473 			return;
474 		case yes:
475 			break;
476 		}
477 	}
478 
479 	while (1) {
480 		int cnt, def;
481 
482 		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
483 		def_sym = sym_get_choice_value(sym);
484 		cnt = def = 0;
485 		line[0] = 0;
486 		for (child = menu->list; child; child = child->next) {
487 			if (!menu_is_visible(child))
488 				continue;
489 			if (!child->sym) {
490 				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
491 				continue;
492 			}
493 			cnt++;
494 			if (child->sym == def_sym) {
495 				def = cnt;
496 				printf("%*c", indent, '>');
497 			} else
498 				printf("%*c", indent, ' ');
499 			printf(" %d. %s (%s)", cnt, menu_get_prompt(child),
500 			       child->sym->name);
501 			if (!sym_has_value(child->sym))
502 				printf(" (NEW)");
503 			printf("\n");
504 		}
505 		printf("%*schoice", indent - 1, "");
506 		if (cnt == 1) {
507 			printf("[1]: 1\n");
508 			goto conf_childs;
509 		}
510 		printf("[1-%d?]: ", cnt);
511 		switch (input_mode) {
512 		case oldconfig:
513 		case syncconfig:
514 			if (!is_new) {
515 				cnt = def;
516 				printf("%d\n", cnt);
517 				break;
518 			}
519 			/* fall through */
520 		case oldaskconfig:
521 			fflush(stdout);
522 			xfgets(line, sizeof(line), stdin);
523 			strip(line);
524 			if (line[0] == '?') {
525 				print_help(menu);
526 				continue;
527 			}
528 			if (!line[0])
529 				cnt = def;
530 			else if (isdigit(line[0]))
531 				cnt = atoi(line);
532 			else
533 				continue;
534 			break;
535 		default:
536 			break;
537 		}
538 
539 	conf_childs:
540 		for (child = menu->list; child; child = child->next) {
541 			if (!child->sym || !menu_is_visible(child))
542 				continue;
543 			if (!--cnt)
544 				break;
545 		}
546 		if (!child)
547 			continue;
548 		if (line[0] && line[strlen(line) - 1] == '?') {
549 			print_help(child);
550 			continue;
551 		}
552 		sym_set_tristate_value(child->sym, yes);
553 		return;
554 	}
555 }
556 
conf(struct menu * menu)557 static void conf(struct menu *menu)
558 {
559 	struct symbol *sym;
560 	struct property *prop;
561 	struct menu *child;
562 
563 	if (!menu_is_visible(menu))
564 		return;
565 
566 	sym = menu->sym;
567 	prop = menu->prompt;
568 	if (prop) {
569 		const char *prompt;
570 
571 		switch (prop->type) {
572 		case P_MENU:
573 			/*
574 			 * Except in oldaskconfig mode, we show only menus that
575 			 * contain new symbols.
576 			 */
577 			if (input_mode != oldaskconfig && rootEntry != menu) {
578 				check_conf(menu);
579 				return;
580 			}
581 			/* fall through */
582 		case P_COMMENT:
583 			prompt = menu_get_prompt(menu);
584 			if (prompt)
585 				printf("%*c\n%*c %s\n%*c\n",
586 					indent, '*',
587 					indent, '*', prompt,
588 					indent, '*');
589 		default:
590 			;
591 		}
592 	}
593 
594 	if (!sym)
595 		goto conf_childs;
596 
597 	if (sym_is_choice(sym)) {
598 		conf_choice(menu);
599 		if (sym->curr.tri != mod)
600 			return;
601 		goto conf_childs;
602 	}
603 
604 	switch (sym->type) {
605 	case S_INT:
606 	case S_HEX:
607 	case S_STRING:
608 		conf_string(menu);
609 		break;
610 	default:
611 		conf_sym(menu);
612 		break;
613 	}
614 
615 conf_childs:
616 	if (sym)
617 		indent += 2;
618 	for (child = menu->list; child; child = child->next)
619 		conf(child);
620 	if (sym)
621 		indent -= 2;
622 }
623 
check_conf(struct menu * menu)624 static void check_conf(struct menu *menu)
625 {
626 	struct symbol *sym;
627 	struct menu *child;
628 
629 	if (!menu_is_visible(menu))
630 		return;
631 
632 	sym = menu->sym;
633 	if (sym && !sym_has_value(sym) &&
634 	    (sym_is_changeable(sym) ||
635 	     (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes))) {
636 
637 		switch (input_mode) {
638 		case listnewconfig:
639 			if (sym->name)
640 				print_symbol_for_listconfig(sym);
641 			break;
642 		case helpnewconfig:
643 			printf("-----\n");
644 			print_help(menu);
645 			printf("-----\n");
646 			break;
647 		default:
648 			if (!conf_cnt++)
649 				printf("*\n* Restart config...\n*\n");
650 			rootEntry = menu_get_parent_menu(menu);
651 			conf(rootEntry);
652 			break;
653 		}
654 	}
655 
656 	for (child = menu->list; child; child = child->next)
657 		check_conf(child);
658 }
659 
660 static const struct option long_opts[] = {
661 	{"help",          no_argument,       NULL,            'h'},
662 	{"silent",        no_argument,       NULL,            's'},
663 	{"oldaskconfig",  no_argument,       &input_mode_opt, oldaskconfig},
664 	{"oldconfig",     no_argument,       &input_mode_opt, oldconfig},
665 	{"syncconfig",    no_argument,       &input_mode_opt, syncconfig},
666 	{"defconfig",     required_argument, &input_mode_opt, defconfig},
667 	{"savedefconfig", required_argument, &input_mode_opt, savedefconfig},
668 	{"allnoconfig",   no_argument,       &input_mode_opt, allnoconfig},
669 	{"allyesconfig",  no_argument,       &input_mode_opt, allyesconfig},
670 	{"allmodconfig",  no_argument,       &input_mode_opt, allmodconfig},
671 	{"alldefconfig",  no_argument,       &input_mode_opt, alldefconfig},
672 	{"randconfig",    no_argument,       &input_mode_opt, randconfig},
673 	{"listnewconfig", no_argument,       &input_mode_opt, listnewconfig},
674 	{"helpnewconfig", no_argument,       &input_mode_opt, helpnewconfig},
675 	{"olddefconfig",  no_argument,       &input_mode_opt, olddefconfig},
676 	{"yes2modconfig", no_argument,       &input_mode_opt, yes2modconfig},
677 	{"mod2yesconfig", no_argument,       &input_mode_opt, mod2yesconfig},
678 	{"mod2noconfig",  no_argument,       &input_mode_opt, mod2noconfig},
679 	{NULL, 0, NULL, 0}
680 };
681 
conf_usage(const char * progname)682 static void conf_usage(const char *progname)
683 {
684 	printf("Usage: %s [options] <kconfig-file>\n", progname);
685 	printf("\n");
686 	printf("Generic options:\n");
687 	printf("  -h, --help              Print this message and exit.\n");
688 	printf("  -s, --silent            Do not print log.\n");
689 	printf("\n");
690 	printf("Mode options:\n");
691 	printf("  --listnewconfig         List new options\n");
692 	printf("  --helpnewconfig         List new options and help text\n");
693 	printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n");
694 	printf("  --oldconfig             Update a configuration using a provided .config as base\n");
695 	printf("  --syncconfig            Similar to oldconfig but generates configuration in\n"
696 	       "                          include/{generated/,config/}\n");
697 	printf("  --olddefconfig          Same as oldconfig but sets new symbols to their default value\n");
698 	printf("  --defconfig <file>      New config with default defined in <file>\n");
699 	printf("  --savedefconfig <file>  Save the minimal current configuration to <file>\n");
700 	printf("  --allnoconfig           New config where all options are answered with no\n");
701 	printf("  --allyesconfig          New config where all options are answered with yes\n");
702 	printf("  --allmodconfig          New config where all options are answered with mod\n");
703 	printf("  --alldefconfig          New config with all symbols set to default\n");
704 	printf("  --randconfig            New config with random answer to all options\n");
705 	printf("  --yes2modconfig         Change answers from yes to mod if possible\n");
706 	printf("  --mod2yesconfig         Change answers from mod to yes if possible\n");
707 	printf("  --mod2noconfig          Change answers from mod to no if possible\n");
708 	printf("  (If none of the above is given, --oldaskconfig is the default)\n");
709 }
710 
main(int ac,char ** av)711 int main(int ac, char **av)
712 {
713 	const char *progname = av[0];
714 	int opt;
715 	const char *name, *defconfig_file = NULL /* gcc uninit */;
716 	int no_conf_write = 0;
717 
718 	tty_stdio = isatty(0) && isatty(1);
719 
720 	while ((opt = getopt_long(ac, av, "hs", long_opts, NULL)) != -1) {
721 		switch (opt) {
722 		case 'h':
723 			conf_usage(progname);
724 			exit(1);
725 			break;
726 		case 's':
727 			conf_set_message_callback(NULL);
728 			break;
729 		case 0:
730 			input_mode = input_mode_opt;
731 			switch (input_mode) {
732 			case syncconfig:
733 				/*
734 				 * syncconfig is invoked during the build stage.
735 				 * Suppress distracting
736 				 *   "configuration written to ..."
737 				 */
738 				conf_set_message_callback(NULL);
739 				sync_kconfig = 1;
740 				break;
741 			case defconfig:
742 			case savedefconfig:
743 				defconfig_file = optarg;
744 				break;
745 			case randconfig:
746 				set_randconfig_seed();
747 				break;
748 			default:
749 				break;
750 			}
751 		default:
752 			break;
753 		}
754 	}
755 	if (ac == optind) {
756 		fprintf(stderr, "%s: Kconfig file missing\n", av[0]);
757 		conf_usage(progname);
758 		exit(1);
759 	}
760 	conf_parse(av[optind]);
761 	//zconfdump(stdout);
762 
763 	switch (input_mode) {
764 	case defconfig:
765 		if (conf_read(defconfig_file)) {
766 			fprintf(stderr,
767 				"***\n"
768 				  "*** Can't find default configuration \"%s\"!\n"
769 				  "***\n",
770 				defconfig_file);
771 			exit(1);
772 		}
773 		break;
774 	case savedefconfig:
775 	case syncconfig:
776 	case oldaskconfig:
777 	case oldconfig:
778 	case listnewconfig:
779 	case helpnewconfig:
780 	case olddefconfig:
781 	case yes2modconfig:
782 	case mod2yesconfig:
783 	case mod2noconfig:
784 		conf_read(NULL);
785 		break;
786 	case allnoconfig:
787 	case allyesconfig:
788 	case allmodconfig:
789 	case alldefconfig:
790 	case randconfig:
791 		name = getenv("KCONFIG_ALLCONFIG");
792 		if (!name)
793 			break;
794 		if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
795 			if (conf_read_simple(name, S_DEF_USER)) {
796 				fprintf(stderr,
797 					"*** Can't read seed configuration \"%s\"!\n",
798 					name);
799 				exit(1);
800 			}
801 			break;
802 		}
803 		switch (input_mode) {
804 		case allnoconfig:	name = "allno.config"; break;
805 		case allyesconfig:	name = "allyes.config"; break;
806 		case allmodconfig:	name = "allmod.config"; break;
807 		case alldefconfig:	name = "alldef.config"; break;
808 		case randconfig:	name = "allrandom.config"; break;
809 		default: break;
810 		}
811 		if (conf_read_simple(name, S_DEF_USER) &&
812 		    conf_read_simple("all.config", S_DEF_USER)) {
813 			fprintf(stderr,
814 				"*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n",
815 				name);
816 			exit(1);
817 		}
818 		break;
819 	default:
820 		break;
821 	}
822 
823 	if (conf_errors())
824 		exit(1);
825 
826 	if (sync_kconfig) {
827 		name = getenv("KCONFIG_NOSILENTUPDATE");
828 		if (name && *name) {
829 			if (conf_get_changed()) {
830 				fprintf(stderr,
831 					"\n*** The configuration requires explicit update.\n\n");
832 				return 1;
833 			}
834 			no_conf_write = 1;
835 		}
836 	}
837 
838 	switch (input_mode) {
839 	case allnoconfig:
840 		conf_set_all_new_symbols(def_no);
841 		break;
842 	case allyesconfig:
843 		conf_set_all_new_symbols(def_yes);
844 		break;
845 	case allmodconfig:
846 		conf_set_all_new_symbols(def_mod);
847 		break;
848 	case alldefconfig:
849 		conf_set_all_new_symbols(def_default);
850 		break;
851 	case randconfig:
852 		/* Really nothing to do in this loop */
853 		while (conf_set_all_new_symbols(def_random)) ;
854 		break;
855 	case defconfig:
856 		conf_set_all_new_symbols(def_default);
857 		break;
858 	case savedefconfig:
859 		break;
860 	case yes2modconfig:
861 		conf_rewrite_tristates(yes, mod);
862 		break;
863 	case mod2yesconfig:
864 		conf_rewrite_tristates(mod, yes);
865 		break;
866 	case mod2noconfig:
867 		conf_rewrite_tristates(mod, no);
868 		break;
869 	case oldaskconfig:
870 		rootEntry = &rootmenu;
871 		conf(&rootmenu);
872 		input_mode = oldconfig;
873 		/* fall through */
874 	case oldconfig:
875 	case listnewconfig:
876 	case helpnewconfig:
877 	case syncconfig:
878 		/* Update until a loop caused no more changes */
879 		do {
880 			conf_cnt = 0;
881 			check_conf(&rootmenu);
882 		} while (conf_cnt);
883 		break;
884 	case olddefconfig:
885 	default:
886 		break;
887 	}
888 
889 	if (sym_dep_errors())
890 		exit(1);
891 
892 	if (input_mode == savedefconfig) {
893 		if (conf_write_defconfig(defconfig_file)) {
894 			fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n",
895 				defconfig_file);
896 			return 1;
897 		}
898 	} else if (input_mode != listnewconfig && input_mode != helpnewconfig) {
899 		if (!no_conf_write && conf_write(NULL)) {
900 			fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
901 			exit(1);
902 		}
903 
904 		/*
905 		 * Create auto.conf if it does not exist.
906 		 * This prevents GNU Make 4.1 or older from emitting
907 		 * "include/config/auto.conf: No such file or directory"
908 		 * in the top-level Makefile
909 		 *
910 		 * syncconfig always creates or updates auto.conf because it is
911 		 * used during the build.
912 		 */
913 		if (conf_write_autoconf(sync_kconfig) && sync_kconfig) {
914 			fprintf(stderr,
915 				"\n*** Error during sync of the configuration.\n\n");
916 			return 1;
917 		}
918 	}
919 	return 0;
920 }
921