conf.c 15.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
 * Released under the terms of the GNU GPL v2.0.
 */

E
EGRY Gabor 已提交
6
#include <locale.h>
L
Linus Torvalds 已提交
7
#include <ctype.h>
8
#include <stdio.h>
9
#include <stdlib.h>
L
Linus Torvalds 已提交
10 11
#include <string.h>
#include <time.h>
12
#include <unistd.h>
S
Sam Ravnborg 已提交
13
#include <getopt.h>
L
Linus Torvalds 已提交
14
#include <sys/stat.h>
15
#include <sys/time.h>
L
Linus Torvalds 已提交
16 17 18 19 20

#include "lkc.h"

static void conf(struct menu *menu);
static void check_conf(struct menu *menu);
21
static void xfgets(char *str, int size, FILE *in);
L
Linus Torvalds 已提交
22

S
Sam Ravnborg 已提交
23 24 25 26 27 28 29
enum input_mode {
	oldaskconfig,
	silentoldconfig,
	oldconfig,
	allnoconfig,
	allyesconfig,
	allmodconfig,
S
Sam Ravnborg 已提交
30
	alldefconfig,
S
Sam Ravnborg 已提交
31 32
	randconfig,
	defconfig,
S
Sam Ravnborg 已提交
33
	savedefconfig,
34
	listnewconfig,
35
	olddefconfig,
S
Sam Ravnborg 已提交
36 37
} input_mode = oldaskconfig;

L
Linus Torvalds 已提交
38 39
static int indent = 1;
static int valid_stdin = 1;
40
static int sync_kconfig;
L
Linus Torvalds 已提交
41
static int conf_cnt;
J
J.A. Magallon 已提交
42
static char line[128];
L
Linus Torvalds 已提交
43 44
static struct menu *rootEntry;

45
static void print_help(struct menu *menu)
46
{
47 48 49 50 51 52
	struct gstr help = str_new();

	menu_get_ext_help(menu, &help);

	printf("\n%s\n", str_get(&help));
	str_free(&help);
53 54
}

J
J.A. Magallon 已提交
55
static void strip(char *str)
L
Linus Torvalds 已提交
56
{
J
J.A. Magallon 已提交
57
	char *p = str;
L
Linus Torvalds 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
	int l;

	while ((isspace(*p)))
		p++;
	l = strlen(p);
	if (p != str)
		memmove(str, p, l + 1);
	if (!l)
		return;
	p = str + l - 1;
	while ((isspace(*p)))
		*p-- = 0;
}

static void check_stdin(void)
{
74
	if (!valid_stdin) {
75 76 77
		printf(_("aborted!\n\n"));
		printf(_("Console input/output is redirected. "));
		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
L
Linus Torvalds 已提交
78 79 80 81
		exit(1);
	}
}

82
static int conf_askvalue(struct symbol *sym, const char *def)
L
Linus Torvalds 已提交
83 84 85 86
{
	enum symbol_type type = sym_get_type(sym);

	if (!sym_has_value(sym))
E
EGRY Gabor 已提交
87
		printf(_("(NEW) "));
L
Linus Torvalds 已提交
88 89 90 91 92 93 94 95

	line[0] = '\n';
	line[1] = 0;

	if (!sym_is_changable(sym)) {
		printf("%s\n", def);
		line[0] = '\n';
		line[1] = 0;
96
		return 0;
L
Linus Torvalds 已提交
97 98 99
	}

	switch (input_mode) {
S
Sam Ravnborg 已提交
100 101
	case oldconfig:
	case silentoldconfig:
L
Linus Torvalds 已提交
102 103
		if (sym_has_value(sym)) {
			printf("%s\n", def);
104
			return 0;
L
Linus Torvalds 已提交
105 106
		}
		check_stdin();
107
		/* fall through */
S
Sam Ravnborg 已提交
108
	case oldaskconfig:
L
Linus Torvalds 已提交
109
		fflush(stdout);
110
		xfgets(line, 128, stdin);
111
		return 1;
L
Linus Torvalds 已提交
112 113 114 115 116 117 118 119 120
	default:
		break;
	}

	switch (type) {
	case S_INT:
	case S_HEX:
	case S_STRING:
		printf("%s\n", def);
121
		return 1;
L
Linus Torvalds 已提交
122 123 124 125
	default:
		;
	}
	printf("%s", line);
126
	return 1;
L
Linus Torvalds 已提交
127 128
}

T
Trevor Keith 已提交
129
static int conf_string(struct menu *menu)
L
Linus Torvalds 已提交
130 131
{
	struct symbol *sym = menu->sym;
132
	const char *def;
L
Linus Torvalds 已提交
133 134

	while (1) {
E
EGRY Gabor 已提交
135
		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
L
Linus Torvalds 已提交
136 137 138 139
		printf("(%s) ", sym->name);
		def = sym_get_string_value(sym);
		if (sym_get_string_value(sym))
			printf("[%s] ", def);
140 141
		if (!conf_askvalue(sym, def))
			return 0;
L
Linus Torvalds 已提交
142 143 144 145 146 147
		switch (line[0]) {
		case '\n':
			break;
		case '?':
			/* print help */
			if (line[1] == '\n') {
148
				print_help(menu);
L
Linus Torvalds 已提交
149 150 151
				def = NULL;
				break;
			}
152
			/* fall through */
L
Linus Torvalds 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
		default:
			line[strlen(line)-1] = 0;
			def = line;
		}
		if (def && sym_set_string_value(sym, def))
			return 0;
	}
}

static int conf_sym(struct menu *menu)
{
	struct symbol *sym = menu->sym;
	tristate oldval, newval;

	while (1) {
E
EGRY Gabor 已提交
168
		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
L
Linus Torvalds 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
		if (sym->name)
			printf("(%s) ", sym->name);
		putchar('[');
		oldval = sym_get_tristate_value(sym);
		switch (oldval) {
		case no:
			putchar('N');
			break;
		case mod:
			putchar('M');
			break;
		case yes:
			putchar('Y');
			break;
		}
		if (oldval != no && sym_tristate_within_range(sym, no))
			printf("/n");
		if (oldval != mod && sym_tristate_within_range(sym, mod))
			printf("/m");
		if (oldval != yes && sym_tristate_within_range(sym, yes))
			printf("/y");
190
		if (menu_has_help(menu))
L
Linus Torvalds 已提交
191 192
			printf("/?");
		printf("] ");
193 194
		if (!conf_askvalue(sym, sym_get_string_value(sym)))
			return 0;
L
Linus Torvalds 已提交
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
		strip(line);

		switch (line[0]) {
		case 'n':
		case 'N':
			newval = no;
			if (!line[1] || !strcmp(&line[1], "o"))
				break;
			continue;
		case 'm':
		case 'M':
			newval = mod;
			if (!line[1])
				break;
			continue;
		case 'y':
		case 'Y':
			newval = yes;
			if (!line[1] || !strcmp(&line[1], "es"))
				break;
			continue;
		case 0:
			newval = oldval;
			break;
		case '?':
			goto help;
		default:
			continue;
		}
		if (sym_set_tristate_value(sym, newval))
			return 0;
help:
227
		print_help(menu);
L
Linus Torvalds 已提交
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
	}
}

static int conf_choice(struct menu *menu)
{
	struct symbol *sym, *def_sym;
	struct menu *child;
	bool is_new;

	sym = menu->sym;
	is_new = !sym_has_value(sym);
	if (sym_is_changable(sym)) {
		conf_sym(menu);
		sym_calc_value(sym);
		switch (sym_get_tristate_value(sym)) {
		case no:
			return 1;
		case mod:
			return 0;
		case yes:
			break;
		}
	} else {
		switch (sym_get_tristate_value(sym)) {
		case no:
			return 1;
		case mod:
E
EGRY Gabor 已提交
255
			printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
L
Linus Torvalds 已提交
256 257 258 259 260 261 262 263 264
			return 0;
		case yes:
			break;
		}
	}

	while (1) {
		int cnt, def;

E
EGRY Gabor 已提交
265
		printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
L
Linus Torvalds 已提交
266 267
		def_sym = sym_get_choice_value(sym);
		cnt = def = 0;
268
		line[0] = 0;
L
Linus Torvalds 已提交
269 270 271 272
		for (child = menu->list; child; child = child->next) {
			if (!menu_is_visible(child))
				continue;
			if (!child->sym) {
E
EGRY Gabor 已提交
273
				printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
L
Linus Torvalds 已提交
274 275 276 277 278 279 280 281
				continue;
			}
			cnt++;
			if (child->sym == def_sym) {
				def = cnt;
				printf("%*c", indent, '>');
			} else
				printf("%*c", indent, ' ');
E
EGRY Gabor 已提交
282
			printf(" %d. %s", cnt, _(menu_get_prompt(child)));
L
Linus Torvalds 已提交
283 284 285
			if (child->sym->name)
				printf(" (%s)", child->sym->name);
			if (!sym_has_value(child->sym))
E
EGRY Gabor 已提交
286
				printf(_(" (NEW)"));
L
Linus Torvalds 已提交
287 288
			printf("\n");
		}
E
EGRY Gabor 已提交
289
		printf(_("%*schoice"), indent - 1, "");
L
Linus Torvalds 已提交
290 291 292 293 294
		if (cnt == 1) {
			printf("[1]: 1\n");
			goto conf_childs;
		}
		printf("[1-%d", cnt);
295
		if (menu_has_help(menu))
L
Linus Torvalds 已提交
296 297 298
			printf("?");
		printf("]: ");
		switch (input_mode) {
S
Sam Ravnborg 已提交
299 300
		case oldconfig:
		case silentoldconfig:
L
Linus Torvalds 已提交
301 302 303 304 305 306
			if (!is_new) {
				cnt = def;
				printf("%d\n", cnt);
				break;
			}
			check_stdin();
307
			/* fall through */
S
Sam Ravnborg 已提交
308
		case oldaskconfig:
L
Linus Torvalds 已提交
309
			fflush(stdout);
310
			xfgets(line, 128, stdin);
L
Linus Torvalds 已提交
311 312
			strip(line);
			if (line[0] == '?') {
313
				print_help(menu);
L
Linus Torvalds 已提交
314 315 316 317 318 319 320 321 322
				continue;
			}
			if (!line[0])
				cnt = def;
			else if (isdigit(line[0]))
				cnt = atoi(line);
			else
				continue;
			break;
323 324
		default:
			break;
L
Linus Torvalds 已提交
325 326 327 328 329 330 331 332 333 334 335
		}

	conf_childs:
		for (child = menu->list; child; child = child->next) {
			if (!child->sym || !menu_is_visible(child))
				continue;
			if (!--cnt)
				break;
		}
		if (!child)
			continue;
336
		if (line[0] && line[strlen(line) - 1] == '?') {
337
			print_help(child);
L
Linus Torvalds 已提交
338 339 340
			continue;
		}
		sym_set_choice_value(sym, child->sym);
341
		for (child = child->list; child; child = child->next) {
L
Linus Torvalds 已提交
342
			indent += 2;
343
			conf(child);
L
Linus Torvalds 已提交
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
			indent -= 2;
		}
		return 1;
	}
}

static void conf(struct menu *menu)
{
	struct symbol *sym;
	struct property *prop;
	struct menu *child;

	if (!menu_is_visible(menu))
		return;

	sym = menu->sym;
	prop = menu->prompt;
	if (prop) {
		const char *prompt;

		switch (prop->type) {
		case P_MENU:
S
Sam Ravnborg 已提交
366
			if ((input_mode == silentoldconfig ||
367
			     input_mode == listnewconfig ||
368
			     input_mode == olddefconfig) &&
369
			    rootEntry != menu) {
L
Linus Torvalds 已提交
370 371 372
				check_conf(menu);
				return;
			}
373
			/* fall through */
L
Linus Torvalds 已提交
374 375 376 377 378
		case P_COMMENT:
			prompt = menu_get_prompt(menu);
			if (prompt)
				printf("%*c\n%*c %s\n%*c\n",
					indent, '*',
E
EGRY Gabor 已提交
379
					indent, '*', _(prompt),
L
Linus Torvalds 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
					indent, '*');
		default:
			;
		}
	}

	if (!sym)
		goto conf_childs;

	if (sym_is_choice(sym)) {
		conf_choice(menu);
		if (sym->curr.tri != mod)
			return;
		goto conf_childs;
	}

	switch (sym->type) {
	case S_INT:
	case S_HEX:
	case S_STRING:
		conf_string(menu);
		break;
	default:
		conf_sym(menu);
		break;
	}

conf_childs:
	if (sym)
		indent += 2;
	for (child = menu->list; child; child = child->next)
		conf(child);
	if (sym)
		indent -= 2;
}

static void check_conf(struct menu *menu)
{
	struct symbol *sym;
	struct menu *child;

	if (!menu_is_visible(menu))
		return;

	sym = menu->sym;
425 426 427
	if (sym && !sym_has_value(sym)) {
		if (sym_is_changable(sym) ||
		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
428 429
			if (input_mode == listnewconfig) {
				if (sym->name && !sym_is_choice_value(sym)) {
430
					printf("%s%s\n", CONFIG_, sym->name);
431
				}
432
			} else if (input_mode != olddefconfig) {
433 434 435 436 437
				if (!conf_cnt++)
					printf(_("*\n* Restart config...\n*\n"));
				rootEntry = menu_get_parent_menu(menu);
				conf(rootEntry);
			}
L
Linus Torvalds 已提交
438 439 440 441 442 443 444
		}
	}

	for (child = menu->list; child; child = child->next)
		check_conf(child);
}

S
Sam Ravnborg 已提交
445 446 447 448 449
static struct option long_opts[] = {
	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
	{"oldconfig",       no_argument,       NULL, oldconfig},
	{"silentoldconfig", no_argument,       NULL, silentoldconfig},
	{"defconfig",       optional_argument, NULL, defconfig},
S
Sam Ravnborg 已提交
450
	{"savedefconfig",   required_argument, NULL, savedefconfig},
S
Sam Ravnborg 已提交
451 452 453
	{"allnoconfig",     no_argument,       NULL, allnoconfig},
	{"allyesconfig",    no_argument,       NULL, allyesconfig},
	{"allmodconfig",    no_argument,       NULL, allmodconfig},
S
Sam Ravnborg 已提交
454
	{"alldefconfig",    no_argument,       NULL, alldefconfig},
S
Sam Ravnborg 已提交
455
	{"randconfig",      no_argument,       NULL, randconfig},
456
	{"listnewconfig",   no_argument,       NULL, listnewconfig},
457 458 459 460 461 462 463
	{"olddefconfig",    no_argument,       NULL, olddefconfig},
	/*
	 * oldnoconfig is an alias of olddefconfig, because people already
	 * are dependent on its behavior(sets new symbols to their default
	 * value but not 'n') with the counter-intuitive name.
	 */
	{"oldnoconfig",     no_argument,       NULL, olddefconfig},
S
Sam Ravnborg 已提交
464 465 466
	{NULL, 0, NULL, 0}
};

467 468 469 470 471 472 473 474 475
static void conf_usage(const char *progname)
{

	printf("Usage: %s [option] <kconfig-file>\n", progname);
	printf("[option] is _one_ of the following:\n");
	printf("  --listnewconfig         List new options\n");
	printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n");
	printf("  --oldconfig             Update a configuration using a provided .config as base\n");
	printf("  --silentoldconfig       Same as oldconfig, but quietly, additionally update deps\n");
476 477
	printf("  --olddefconfig          Same as silentoldconfig but sets new symbols to their default value\n");
	printf("  --oldnoconfig           An alias of olddefconfig\n");
478 479 480 481 482 483 484 485 486
	printf("  --defconfig <file>      New config with default defined in <file>\n");
	printf("  --savedefconfig <file>  Save the minimal current configuration to <file>\n");
	printf("  --allnoconfig           New config where all options are answered with no\n");
	printf("  --allyesconfig          New config where all options are answered with yes\n");
	printf("  --allmodconfig          New config where all options are answered with mod\n");
	printf("  --alldefconfig          New config with all symbols set to default\n");
	printf("  --randconfig            New config with random answer to all options\n");
}

L
Linus Torvalds 已提交
487 488
int main(int ac, char **av)
{
489
	const char *progname = av[0];
490
	int opt;
491
	const char *name, *defconfig_file = NULL /* gcc uninit */;
L
Linus Torvalds 已提交
492 493
	struct stat tmpstat;

E
EGRY Gabor 已提交
494 495 496 497
	setlocale(LC_ALL, "");
	bindtextdomain(PACKAGE, LOCALEDIR);
	textdomain(PACKAGE);

498
	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
S
Sam Ravnborg 已提交
499
		input_mode = (enum input_mode)opt;
500
		switch (opt) {
S
Sam Ravnborg 已提交
501
		case silentoldconfig:
502
			sync_kconfig = 1;
L
Linus Torvalds 已提交
503
			break;
S
Sam Ravnborg 已提交
504
		case defconfig:
S
Sam Ravnborg 已提交
505
		case savedefconfig:
506
			defconfig_file = optarg;
L
Linus Torvalds 已提交
507
			break;
S
Sam Ravnborg 已提交
508
		case randconfig:
509 510 511 512 513 514 515 516 517 518 519 520
		{
			struct timeval now;
			unsigned int seed;

			/*
			 * Use microseconds derived seed,
			 * compensate for systems where it may be zero
			 */
			gettimeofday(&now, NULL);

			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
			srand(seed);
L
Linus Torvalds 已提交
521
			break;
522
		}
523 524 525 526 527 528 529
		case oldaskconfig:
		case oldconfig:
		case allnoconfig:
		case allyesconfig:
		case allmodconfig:
		case alldefconfig:
		case listnewconfig:
530
		case olddefconfig:
531
			break;
S
Sam Ravnborg 已提交
532
		case '?':
533
			conf_usage(progname);
534
			exit(1);
S
Sam Ravnborg 已提交
535
			break;
L
Linus Torvalds 已提交
536 537
		}
	}
538
	if (ac == optind) {
539
		printf(_("%s: Kconfig file missing\n"), av[0]);
540
		conf_usage(progname);
541
		exit(1);
L
Linus Torvalds 已提交
542
	}
543
	name = av[optind];
L
Linus Torvalds 已提交
544 545
	conf_parse(name);
	//zconfdump(stdout);
546
	if (sync_kconfig) {
547 548
		name = conf_get_configname();
		if (stat(name, &tmpstat)) {
549
			fprintf(stderr, _("***\n"
550
				"*** Configuration file \"%s\" not found!\n"
551 552 553
				"***\n"
				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
				"*** \"make menuconfig\" or \"make xconfig\").\n"
554
				"***\n"), name);
555 556 557 558
			exit(1);
		}
	}

L
Linus Torvalds 已提交
559
	switch (input_mode) {
S
Sam Ravnborg 已提交
560
	case defconfig:
L
Linus Torvalds 已提交
561 562 563
		if (!defconfig_file)
			defconfig_file = conf_get_default_confname();
		if (conf_read(defconfig_file)) {
E
EGRY Gabor 已提交
564
			printf(_("***\n"
L
Linus Torvalds 已提交
565
				"*** Can't find default configuration \"%s\"!\n"
E
EGRY Gabor 已提交
566
				"***\n"), defconfig_file);
L
Linus Torvalds 已提交
567 568 569
			exit(1);
		}
		break;
S
Sam Ravnborg 已提交
570
	case savedefconfig:
S
Sam Ravnborg 已提交
571 572 573
	case silentoldconfig:
	case oldaskconfig:
	case oldconfig:
574
	case listnewconfig:
575
	case olddefconfig:
L
Linus Torvalds 已提交
576 577
		conf_read(NULL);
		break;
S
Sam Ravnborg 已提交
578 579 580
	case allnoconfig:
	case allyesconfig:
	case allmodconfig:
S
Sam Ravnborg 已提交
581
	case alldefconfig:
S
Sam Ravnborg 已提交
582
	case randconfig:
583
		name = getenv("KCONFIG_ALLCONFIG");
584 585 586
		if (!name)
			break;
		if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
587 588 589 590 591 592
			if (conf_read_simple(name, S_DEF_USER)) {
				fprintf(stderr,
					_("*** Can't read seed configuration \"%s\"!\n"),
					name);
				exit(1);
			}
593 594 595
			break;
		}
		switch (input_mode) {
S
Sam Ravnborg 已提交
596 597 598
		case allnoconfig:	name = "allno.config"; break;
		case allyesconfig:	name = "allyes.config"; break;
		case allmodconfig:	name = "allmod.config"; break;
S
Sam Ravnborg 已提交
599
		case alldefconfig:	name = "alldef.config"; break;
S
Sam Ravnborg 已提交
600
		case randconfig:	name = "allrandom.config"; break;
601 602
		default: break;
		}
603 604 605 606 607 608 609
		if (conf_read_simple(name, S_DEF_USER) &&
		    conf_read_simple("all.config", S_DEF_USER)) {
			fprintf(stderr,
				_("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
				name);
			exit(1);
		}
610
		break;
L
Linus Torvalds 已提交
611 612 613
	default:
		break;
	}
614 615 616 617 618 619

	if (sync_kconfig) {
		if (conf_get_changed()) {
			name = getenv("KCONFIG_NOSILENTUPDATE");
			if (name && *name) {
				fprintf(stderr,
620
					_("\n*** The configuration requires explicit update.\n\n"));
621 622 623 624 625 626
				return 1;
			}
		}
		valid_stdin = isatty(0) && isatty(1) && isatty(2);
	}

627
	switch (input_mode) {
S
Sam Ravnborg 已提交
628
	case allnoconfig:
629 630
		conf_set_all_new_symbols(def_no);
		break;
S
Sam Ravnborg 已提交
631
	case allyesconfig:
632 633
		conf_set_all_new_symbols(def_yes);
		break;
S
Sam Ravnborg 已提交
634
	case allmodconfig:
635 636
		conf_set_all_new_symbols(def_mod);
		break;
S
Sam Ravnborg 已提交
637 638 639
	case alldefconfig:
		conf_set_all_new_symbols(def_default);
		break;
S
Sam Ravnborg 已提交
640
	case randconfig:
641 642
		conf_set_all_new_symbols(def_random);
		break;
S
Sam Ravnborg 已提交
643
	case defconfig:
644 645
		conf_set_all_new_symbols(def_default);
		break;
S
Sam Ravnborg 已提交
646 647
	case savedefconfig:
		break;
S
Sam Ravnborg 已提交
648
	case oldaskconfig:
649 650
		rootEntry = &rootmenu;
		conf(&rootmenu);
S
Sam Ravnborg 已提交
651
		input_mode = silentoldconfig;
652
		/* fall through */
S
Sam Ravnborg 已提交
653
	case oldconfig:
654
	case listnewconfig:
655
	case olddefconfig:
S
Sam Ravnborg 已提交
656
	case silentoldconfig:
657 658 659 660
		/* Update until a loop caused no more changes */
		do {
			conf_cnt = 0;
			check_conf(&rootmenu);
661
		} while (conf_cnt &&
662
			 (input_mode != listnewconfig &&
663
			  input_mode != olddefconfig));
664 665
		break;
	}
L
Linus Torvalds 已提交
666

667 668 669 670 671
	if (sync_kconfig) {
		/* silentoldconfig is used during the build so we shall update autoconf.
		 * All other commands are only used to generate a config.
		 */
		if (conf_get_changed() && conf_write(NULL)) {
672
			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
673 674 675
			exit(1);
		}
		if (conf_write_autoconf()) {
676
			fprintf(stderr, _("\n*** Error during update of the configuration.\n\n"));
677 678
			return 1;
		}
S
Sam Ravnborg 已提交
679 680 681 682 683 684
	} else if (input_mode == savedefconfig) {
		if (conf_write_defconfig(defconfig_file)) {
			fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
			        defconfig_file);
			return 1;
		}
685
	} else if (input_mode != listnewconfig) {
686
		if (conf_write(NULL)) {
687
			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
688 689
			exit(1);
		}
R
Roman Zippel 已提交
690
	}
691
	return 0;
L
Linus Torvalds 已提交
692
}
693

694 695 696
/*
 * Helper function to facilitate fgets() by Jean Sacren.
 */
697
void xfgets(char *str, int size, FILE *in)
698 699 700 701
{
	if (fgets(str, size, in) == NULL)
		fprintf(stderr, "\nError in reading or end of file.\n");
}