kconfig/conf.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Aug 07 13:35:11 2008 +0000 (2008-08-07)
changeset 764 ff368787f62b
parent 39 af42eec9d383
child 860 3ff8038f904c
permissions -rw-r--r--
When reporting bugs, TO is ymorin, CC is crossgcc ML, not the other way around.

/trunk/README | 4 2 2 0 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
yann@1
     1
/*
yann@1
     2
 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
yann@1
     3
 * Released under the terms of the GNU GPL v2.0.
yann@1
     4
 */
yann@1
     5
yann@1
     6
#include <ctype.h>
yann@1
     7
#include <stdlib.h>
yann@1
     8
#include <stdio.h>
yann@1
     9
#include <string.h>
yann@1
    10
#include <unistd.h>
yann@1
    11
#include <time.h>
yann@1
    12
#include <sys/stat.h>
yann@1
    13
yann@1
    14
#define LKC_DIRECT_LINK
yann@1
    15
#include "lkc.h"
yann@1
    16
yann@1
    17
static void conf(struct menu *menu);
yann@1
    18
static void check_conf(struct menu *menu);
yann@1
    19
yann@1
    20
enum {
yann@1
    21
	ask_all,
yann@1
    22
	ask_new,
yann@1
    23
	ask_silent,
yann@1
    24
	set_default,
yann@1
    25
	set_yes,
yann@1
    26
	set_mod,
yann@1
    27
	set_no,
yann@1
    28
	set_random
yann@1
    29
} input_mode = ask_all;
yann@1
    30
char *defconfig_file;
yann@1
    31
yann@1
    32
static int indent = 1;
yann@1
    33
static int valid_stdin = 1;
yann@1
    34
static int conf_cnt;
yann@1
    35
static char line[128];
yann@1
    36
static struct menu *rootEntry;
yann@1
    37
yann@1
    38
static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
yann@1
    39
yann@1
    40
static void strip(char *str)
yann@1
    41
{
yann@1
    42
	char *p = str;
yann@1
    43
	int l;
yann@1
    44
yann@1
    45
	while ((isspace(*p)))
yann@1
    46
		p++;
yann@1
    47
	l = strlen(p);
yann@1
    48
	if (p != str)
yann@1
    49
		memmove(str, p, l + 1);
yann@1
    50
	if (!l)
yann@1
    51
		return;
yann@1
    52
	p = str + l - 1;
yann@1
    53
	while ((isspace(*p)))
yann@1
    54
		*p-- = 0;
yann@1
    55
}
yann@1
    56
yann@1
    57
static void check_stdin(void)
yann@1
    58
{
yann@1
    59
	if (!valid_stdin && input_mode == ask_silent) {
yann@1
    60
		printf(_("aborted!\n\n"));
yann@1
    61
		printf(_("Console input/output is redirected. "));
yann@1
    62
		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
yann@1
    63
		exit(1);
yann@1
    64
	}
yann@1
    65
}
yann@1
    66
yann@1
    67
static void conf_askvalue(struct symbol *sym, const char *def)
yann@1
    68
{
yann@1
    69
	enum symbol_type type = sym_get_type(sym);
yann@1
    70
	tristate val;
yann@1
    71
yann@1
    72
	if (!sym_has_value(sym))
yann@1
    73
		printf("(NEW) ");
yann@1
    74
yann@1
    75
	line[0] = '\n';
yann@1
    76
	line[1] = 0;
yann@1
    77
yann@1
    78
	if (!sym_is_changable(sym)) {
yann@1
    79
		printf("%s\n", def);
yann@1
    80
		line[0] = '\n';
yann@1
    81
		line[1] = 0;
yann@1
    82
		return;
yann@1
    83
	}
yann@1
    84
yann@1
    85
	switch (input_mode) {
yann@1
    86
	case set_no:
yann@1
    87
	case set_mod:
yann@1
    88
	case set_yes:
yann@1
    89
	case set_random:
yann@1
    90
		if (sym_has_value(sym)) {
yann@1
    91
			printf("%s\n", def);
yann@1
    92
			return;
yann@1
    93
		}
yann@1
    94
		break;
yann@1
    95
	case ask_new:
yann@1
    96
	case ask_silent:
yann@1
    97
		if (sym_has_value(sym)) {
yann@1
    98
			printf("%s\n", def);
yann@1
    99
			return;
yann@1
   100
		}
yann@1
   101
		check_stdin();
yann@1
   102
	case ask_all:
yann@1
   103
		fflush(stdout);
yann@1
   104
		fgets(line, 128, stdin);
yann@1
   105
		return;
yann@1
   106
	case set_default:
yann@1
   107
		printf("%s\n", def);
yann@1
   108
		return;
yann@1
   109
	default:
yann@1
   110
		break;
yann@1
   111
	}
yann@1
   112
yann@1
   113
	switch (type) {
yann@1
   114
	case S_INT:
yann@1
   115
	case S_HEX:
yann@1
   116
	case S_STRING:
yann@1
   117
		printf("%s\n", def);
yann@1
   118
		return;
yann@1
   119
	default:
yann@1
   120
		;
yann@1
   121
	}
yann@1
   122
	switch (input_mode) {
yann@1
   123
	case set_yes:
yann@1
   124
		if (sym_tristate_within_range(sym, yes)) {
yann@1
   125
			line[0] = 'y';
yann@1
   126
			line[1] = '\n';
yann@1
   127
			line[2] = 0;
yann@1
   128
			break;
yann@1
   129
		}
yann@1
   130
	case set_mod:
yann@1
   131
		if (type == S_TRISTATE) {
yann@1
   132
			if (sym_tristate_within_range(sym, mod)) {
yann@1
   133
				line[0] = 'm';
yann@1
   134
				line[1] = '\n';
yann@1
   135
				line[2] = 0;
yann@1
   136
				break;
yann@1
   137
			}
yann@1
   138
		} else {
yann@1
   139
			if (sym_tristate_within_range(sym, yes)) {
yann@1
   140
				line[0] = 'y';
yann@1
   141
				line[1] = '\n';
yann@1
   142
				line[2] = 0;
yann@1
   143
				break;
yann@1
   144
			}
yann@1
   145
		}
yann@1
   146
	case set_no:
yann@1
   147
		if (sym_tristate_within_range(sym, no)) {
yann@1
   148
			line[0] = 'n';
yann@1
   149
			line[1] = '\n';
yann@1
   150
			line[2] = 0;
yann@1
   151
			break;
yann@1
   152
		}
yann@1
   153
	case set_random:
yann@1
   154
		do {
yann@1
   155
			val = (tristate)(random() % 3);
yann@1
   156
		} while (!sym_tristate_within_range(sym, val));
yann@1
   157
		switch (val) {
yann@1
   158
		case no: line[0] = 'n'; break;
yann@1
   159
		case mod: line[0] = 'm'; break;
yann@1
   160
		case yes: line[0] = 'y'; break;
yann@1
   161
		}
yann@1
   162
		line[1] = '\n';
yann@1
   163
		line[2] = 0;
yann@1
   164
		break;
yann@1
   165
	default:
yann@1
   166
		break;
yann@1
   167
	}
yann@1
   168
	printf("%s", line);
yann@1
   169
}
yann@1
   170
yann@1
   171
int conf_string(struct menu *menu)
yann@1
   172
{
yann@1
   173
	struct symbol *sym = menu->sym;
yann@1
   174
	const char *def, *help;
yann@1
   175
yann@1
   176
	while (1) {
yann@1
   177
		printf("%*s%s ", indent - 1, "", menu->prompt->text);
yann@1
   178
		printf("(%s) ", sym->name);
yann@1
   179
		def = sym_get_string_value(sym);
yann@1
   180
		if (sym_get_string_value(sym))
yann@1
   181
			printf("[%s] ", def);
yann@1
   182
		conf_askvalue(sym, def);
yann@1
   183
		switch (line[0]) {
yann@1
   184
		case '\n':
yann@1
   185
			break;
yann@1
   186
		case '?':
yann@1
   187
			/* print help */
yann@1
   188
			if (line[1] == '\n') {
yann@1
   189
				help = nohelp_text;
yann@1
   190
				if (menu->sym->help)
yann@1
   191
					help = menu->sym->help;
yann@1
   192
				printf("\n%s\n", menu->sym->help);
yann@1
   193
				def = NULL;
yann@1
   194
				break;
yann@1
   195
			}
yann@1
   196
		default:
yann@1
   197
			line[strlen(line)-1] = 0;
yann@1
   198
			def = line;
yann@1
   199
		}
yann@1
   200
		if (def && sym_set_string_value(sym, def))
yann@1
   201
			return 0;
yann@1
   202
	}
yann@1
   203
}
yann@1
   204
yann@1
   205
static int conf_sym(struct menu *menu)
yann@1
   206
{
yann@1
   207
	struct symbol *sym = menu->sym;
yann@1
   208
	int type;
yann@1
   209
	tristate oldval, newval;
yann@1
   210
	const char *help;
yann@1
   211
yann@1
   212
	while (1) {
yann@1
   213
		printf("%*s%s ", indent - 1, "", menu->prompt->text);
yann@1
   214
		if (sym->name)
yann@1
   215
			printf("(%s) ", sym->name);
yann@1
   216
		type = sym_get_type(sym);
yann@1
   217
		putchar('[');
yann@1
   218
		oldval = sym_get_tristate_value(sym);
yann@1
   219
		switch (oldval) {
yann@1
   220
		case no:
yann@1
   221
			putchar('N');
yann@1
   222
			break;
yann@1
   223
		case mod:
yann@1
   224
			putchar('M');
yann@1
   225
			break;
yann@1
   226
		case yes:
yann@1
   227
			putchar('Y');
yann@1
   228
			break;
yann@1
   229
		}
yann@1
   230
		if (oldval != no && sym_tristate_within_range(sym, no))
yann@1
   231
			printf("/n");
yann@1
   232
		if (oldval != mod && sym_tristate_within_range(sym, mod))
yann@1
   233
			printf("/m");
yann@1
   234
		if (oldval != yes && sym_tristate_within_range(sym, yes))
yann@1
   235
			printf("/y");
yann@1
   236
		if (sym->help)
yann@1
   237
			printf("/?");
yann@1
   238
		printf("] ");
yann@1
   239
		conf_askvalue(sym, sym_get_string_value(sym));
yann@1
   240
		strip(line);
yann@1
   241
yann@1
   242
		switch (line[0]) {
yann@1
   243
		case 'n':
yann@1
   244
		case 'N':
yann@1
   245
			newval = no;
yann@1
   246
			if (!line[1] || !strcmp(&line[1], "o"))
yann@1
   247
				break;
yann@1
   248
			continue;
yann@1
   249
		case 'm':
yann@1
   250
		case 'M':
yann@1
   251
			newval = mod;
yann@1
   252
			if (!line[1])
yann@1
   253
				break;
yann@1
   254
			continue;
yann@1
   255
		case 'y':
yann@1
   256
		case 'Y':
yann@1
   257
			newval = yes;
yann@1
   258
			if (!line[1] || !strcmp(&line[1], "es"))
yann@1
   259
				break;
yann@1
   260
			continue;
yann@1
   261
		case 0:
yann@1
   262
			newval = oldval;
yann@1
   263
			break;
yann@1
   264
		case '?':
yann@1
   265
			goto help;
yann@1
   266
		default:
yann@1
   267
			continue;
yann@1
   268
		}
yann@1
   269
		if (sym_set_tristate_value(sym, newval))
yann@1
   270
			return 0;
yann@1
   271
help:
yann@1
   272
		help = nohelp_text;
yann@1
   273
		if (sym->help)
yann@1
   274
			help = sym->help;
yann@1
   275
		printf("\n%s\n", help);
yann@1
   276
	}
yann@1
   277
}
yann@1
   278
yann@1
   279
static int conf_choice(struct menu *menu)
yann@1
   280
{
yann@1
   281
	struct symbol *sym, *def_sym;
yann@1
   282
	struct menu *child;
yann@1
   283
	int type;
yann@1
   284
	bool is_new;
yann@1
   285
yann@1
   286
	sym = menu->sym;
yann@1
   287
	type = sym_get_type(sym);
yann@1
   288
	is_new = !sym_has_value(sym);
yann@1
   289
	if (sym_is_changable(sym)) {
yann@1
   290
		conf_sym(menu);
yann@1
   291
		sym_calc_value(sym);
yann@1
   292
		switch (sym_get_tristate_value(sym)) {
yann@1
   293
		case no:
yann@1
   294
			return 1;
yann@1
   295
		case mod:
yann@1
   296
			return 0;
yann@1
   297
		case yes:
yann@1
   298
			break;
yann@1
   299
		}
yann@1
   300
	} else {
yann@1
   301
		switch (sym_get_tristate_value(sym)) {
yann@1
   302
		case no:
yann@1
   303
			return 1;
yann@1
   304
		case mod:
yann@1
   305
			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
yann@1
   306
			return 0;
yann@1
   307
		case yes:
yann@1
   308
			break;
yann@1
   309
		}
yann@1
   310
	}
yann@1
   311
yann@1
   312
	while (1) {
yann@1
   313
		int cnt, def;
yann@1
   314
yann@1
   315
		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
yann@1
   316
		def_sym = sym_get_choice_value(sym);
yann@1
   317
		cnt = def = 0;
yann@1
   318
		line[0] = 0;
yann@1
   319
		for (child = menu->list; child; child = child->next) {
yann@1
   320
			if (!menu_is_visible(child))
yann@1
   321
				continue;
yann@1
   322
			if (!child->sym) {
yann@1
   323
				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
yann@1
   324
				continue;
yann@1
   325
			}
yann@1
   326
			cnt++;
yann@1
   327
			if (child->sym == def_sym) {
yann@1
   328
				def = cnt;
yann@1
   329
				printf("%*c", indent, '>');
yann@1
   330
			} else
yann@1
   331
				printf("%*c", indent, ' ');
yann@1
   332
			printf(" %d. %s", cnt, menu_get_prompt(child));
yann@1
   333
			if (child->sym->name)
yann@1
   334
				printf(" (%s)", child->sym->name);
yann@1
   335
			if (!sym_has_value(child->sym))
yann@1
   336
				printf(" (NEW)");
yann@1
   337
			printf("\n");
yann@1
   338
		}
yann@1
   339
		printf("%*schoice", indent - 1, "");
yann@1
   340
		if (cnt == 1) {
yann@1
   341
			printf("[1]: 1\n");
yann@1
   342
			goto conf_childs;
yann@1
   343
		}
yann@1
   344
		printf("[1-%d", cnt);
yann@1
   345
		if (sym->help)
yann@1
   346
			printf("?");
yann@1
   347
		printf("]: ");
yann@1
   348
		switch (input_mode) {
yann@1
   349
		case ask_new:
yann@1
   350
		case ask_silent:
yann@1
   351
			if (!is_new) {
yann@1
   352
				cnt = def;
yann@1
   353
				printf("%d\n", cnt);
yann@1
   354
				break;
yann@1
   355
			}
yann@1
   356
			check_stdin();
yann@1
   357
		case ask_all:
yann@1
   358
			fflush(stdout);
yann@1
   359
			fgets(line, 128, stdin);
yann@1
   360
			strip(line);
yann@1
   361
			if (line[0] == '?') {
yann@1
   362
				printf("\n%s\n", menu->sym->help ?
yann@1
   363
					menu->sym->help : nohelp_text);
yann@1
   364
				continue;
yann@1
   365
			}
yann@1
   366
			if (!line[0])
yann@1
   367
				cnt = def;
yann@1
   368
			else if (isdigit(line[0]))
yann@1
   369
				cnt = atoi(line);
yann@1
   370
			else
yann@1
   371
				continue;
yann@1
   372
			break;
yann@1
   373
		case set_random:
yann@1
   374
			def = (random() % cnt) + 1;
yann@1
   375
		case set_default:
yann@1
   376
		case set_yes:
yann@1
   377
		case set_mod:
yann@1
   378
		case set_no:
yann@1
   379
			cnt = def;
yann@1
   380
			printf("%d\n", cnt);
yann@1
   381
			break;
yann@1
   382
		}
yann@1
   383
yann@1
   384
	conf_childs:
yann@1
   385
		for (child = menu->list; child; child = child->next) {
yann@1
   386
			if (!child->sym || !menu_is_visible(child))
yann@1
   387
				continue;
yann@1
   388
			if (!--cnt)
yann@1
   389
				break;
yann@1
   390
		}
yann@1
   391
		if (!child)
yann@1
   392
			continue;
yann@1
   393
		if (line[strlen(line) - 1] == '?') {
yann@1
   394
			printf("\n%s\n", child->sym->help ?
yann@1
   395
				child->sym->help : nohelp_text);
yann@1
   396
			continue;
yann@1
   397
		}
yann@1
   398
		sym_set_choice_value(sym, child->sym);
yann@1
   399
		if (child->list) {
yann@1
   400
			indent += 2;
yann@1
   401
			conf(child->list);
yann@1
   402
			indent -= 2;
yann@1
   403
		}
yann@1
   404
		return 1;
yann@1
   405
	}
yann@1
   406
}
yann@1
   407
yann@1
   408
static void conf(struct menu *menu)
yann@1
   409
{
yann@1
   410
	struct symbol *sym;
yann@1
   411
	struct property *prop;
yann@1
   412
	struct menu *child;
yann@1
   413
yann@1
   414
	if (!menu_is_visible(menu))
yann@1
   415
		return;
yann@1
   416
yann@1
   417
	sym = menu->sym;
yann@1
   418
	prop = menu->prompt;
yann@1
   419
	if (prop) {
yann@1
   420
		const char *prompt;
yann@1
   421
yann@1
   422
		switch (prop->type) {
yann@1
   423
		case P_MENU:
yann@1
   424
			if (input_mode == ask_silent && rootEntry != menu) {
yann@1
   425
				check_conf(menu);
yann@1
   426
				return;
yann@1
   427
			}
yann@1
   428
		case P_COMMENT:
yann@1
   429
			prompt = menu_get_prompt(menu);
yann@1
   430
			if (prompt)
yann@1
   431
				printf("%*c\n%*c %s\n%*c\n",
yann@1
   432
					indent, '*',
yann@1
   433
					indent, '*', prompt,
yann@1
   434
					indent, '*');
yann@1
   435
		default:
yann@1
   436
			;
yann@1
   437
		}
yann@1
   438
	}
yann@1
   439
yann@1
   440
	if (!sym)
yann@1
   441
		goto conf_childs;
yann@1
   442
yann@1
   443
	if (sym_is_choice(sym)) {
yann@1
   444
		conf_choice(menu);
yann@1
   445
		if (sym->curr.tri != mod)
yann@1
   446
			return;
yann@1
   447
		goto conf_childs;
yann@1
   448
	}
yann@1
   449
yann@1
   450
	switch (sym->type) {
yann@1
   451
	case S_INT:
yann@1
   452
	case S_HEX:
yann@1
   453
	case S_STRING:
yann@1
   454
		conf_string(menu);
yann@1
   455
		break;
yann@1
   456
	default:
yann@1
   457
		conf_sym(menu);
yann@1
   458
		break;
yann@1
   459
	}
yann@1
   460
yann@1
   461
conf_childs:
yann@1
   462
	if (sym)
yann@1
   463
		indent += 2;
yann@1
   464
	for (child = menu->list; child; child = child->next)
yann@1
   465
		conf(child);
yann@1
   466
	if (sym)
yann@1
   467
		indent -= 2;
yann@1
   468
}
yann@1
   469
yann@1
   470
static void check_conf(struct menu *menu)
yann@1
   471
{
yann@1
   472
	struct symbol *sym;
yann@1
   473
	struct menu *child;
yann@1
   474
yann@1
   475
	if (!menu_is_visible(menu))
yann@1
   476
		return;
yann@1
   477
yann@1
   478
	sym = menu->sym;
yann@1
   479
	if (sym && !sym_has_value(sym)) {
yann@1
   480
		if (sym_is_changable(sym) ||
yann@1
   481
		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
yann@1
   482
			if (!conf_cnt++)
yann@1
   483
				printf(_("*\n* Restart config...\n*\n"));
yann@1
   484
			rootEntry = menu_get_parent_menu(menu);
yann@1
   485
			conf(rootEntry);
yann@1
   486
		}
yann@1
   487
	}
yann@1
   488
yann@1
   489
	for (child = menu->list; child; child = child->next)
yann@1
   490
		check_conf(child);
yann@1
   491
}
yann@1
   492
yann@1
   493
int main(int ac, char **av)
yann@1
   494
{
yann@1
   495
	int i = 1;
yann@1
   496
	const char *name;
yann@1
   497
	struct stat tmpstat;
yann@1
   498
yann@1
   499
	if (ac > i && av[i][0] == '-') {
yann@1
   500
		switch (av[i++][1]) {
yann@1
   501
		case 'o':
yann@1
   502
			input_mode = ask_new;
yann@1
   503
			break;
yann@1
   504
		case 's':
yann@1
   505
			input_mode = ask_silent;
yann@1
   506
			break;
yann@1
   507
		case 'd':
yann@1
   508
			input_mode = set_default;
yann@1
   509
			break;
yann@1
   510
		case 'D':
yann@1
   511
			input_mode = set_default;
yann@1
   512
			defconfig_file = av[i++];
yann@1
   513
			if (!defconfig_file) {
yann@1
   514
				printf(_("%s: No default config file specified\n"),
yann@1
   515
					av[0]);
yann@1
   516
				exit(1);
yann@1
   517
			}
yann@1
   518
			break;
yann@1
   519
		case 'n':
yann@1
   520
			input_mode = set_no;
yann@1
   521
			break;
yann@1
   522
		case 'm':
yann@1
   523
			input_mode = set_mod;
yann@1
   524
			break;
yann@1
   525
		case 'y':
yann@1
   526
			input_mode = set_yes;
yann@1
   527
			break;
yann@1
   528
		case 'r':
yann@1
   529
			input_mode = set_random;
yann@1
   530
			srandom(time(NULL));
yann@1
   531
			break;
yann@1
   532
		case 'h':
yann@1
   533
		case '?':
yann@1
   534
			fprintf(stderr, "See README for usage info\n");
yann@1
   535
			exit(0);
yann@1
   536
		}
yann@1
   537
	}
yann@1
   538
  	name = av[i];
yann@1
   539
	if (!name) {
yann@1
   540
		printf(_("%s: Kconfig file missing\n"), av[0]);
yann@1
   541
		exit(1);
yann@1
   542
	}
yann@1
   543
	conf_parse(name);
yann@1
   544
	//zconfdump(stdout);
yann@1
   545
	switch (input_mode) {
yann@1
   546
	case set_default:
yann@1
   547
		if (!defconfig_file)
yann@1
   548
			defconfig_file = conf_get_default_confname();
yann@1
   549
		if (conf_read(defconfig_file)) {
yann@1
   550
			printf("***\n"
yann@1
   551
				"*** Can't find default configuration \"%s\"!\n"
yann@1
   552
				"***\n", defconfig_file);
yann@1
   553
			exit(1);
yann@1
   554
		}
yann@1
   555
		break;
yann@1
   556
	case ask_silent:
yann@1
   557
		if (stat(".config", &tmpstat)) {
yann@1
   558
			printf(_("***\n"
yann@39
   559
				"*** You have not yet configured "PROJECT_NAME"!\n"
yann@1
   560
				"***\n"
yann@1
   561
				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
yann@1
   562
				"*** \"make menuconfig\" or \"make xconfig\").\n"
yann@1
   563
				"***\n"));
yann@1
   564
			exit(1);
yann@1
   565
		}
yann@1
   566
	case ask_all:
yann@1
   567
	case ask_new:
yann@1
   568
		conf_read(NULL);
yann@1
   569
		break;
yann@1
   570
	case set_no:
yann@1
   571
	case set_mod:
yann@1
   572
	case set_yes:
yann@1
   573
	case set_random:
yann@1
   574
		name = getenv("KCONFIG_ALLCONFIG");
yann@1
   575
		if (name && !stat(name, &tmpstat)) {
yann@1
   576
			conf_read_simple(name, S_DEF_USER);
yann@1
   577
			break;
yann@1
   578
		}
yann@1
   579
		switch (input_mode) {
yann@1
   580
		case set_no:	 name = "allno.config"; break;
yann@1
   581
		case set_mod:	 name = "allmod.config"; break;
yann@1
   582
		case set_yes:	 name = "allyes.config"; break;
yann@1
   583
		case set_random: name = "allrandom.config"; break;
yann@1
   584
		default: break;
yann@1
   585
		}
yann@1
   586
		if (!stat(name, &tmpstat))
yann@1
   587
			conf_read_simple(name, S_DEF_USER);
yann@1
   588
		else if (!stat("all.config", &tmpstat))
yann@1
   589
			conf_read_simple("all.config", S_DEF_USER);
yann@1
   590
		break;
yann@1
   591
	default:
yann@1
   592
		break;
yann@1
   593
	}
yann@1
   594
yann@1
   595
	if (input_mode != ask_silent) {
yann@1
   596
		rootEntry = &rootmenu;
yann@1
   597
		conf(&rootmenu);
yann@1
   598
		if (input_mode == ask_all) {
yann@1
   599
			input_mode = ask_silent;
yann@1
   600
			valid_stdin = 1;
yann@1
   601
		}
yann@39
   602
	} else if (conf_get_changed()) {
yann@1
   603
		name = getenv("KCONFIG_NOSILENTUPDATE");
yann@1
   604
		if (name && *name) {
yann@1
   605
			fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n"));
yann@1
   606
			return 1;
yann@1
   607
		}
yann@1
   608
	} else
yann@1
   609
		goto skip_check;
yann@1
   610
yann@1
   611
	do {
yann@1
   612
		conf_cnt = 0;
yann@1
   613
		check_conf(&rootmenu);
yann@1
   614
	} while (conf_cnt);
yann@39
   615
	if (conf_write(NULL)) {
yann@39
   616
		fprintf(stderr, _("\n*** Error during writing of "PROJECT_NAME" configuration.\n\n"));
yann@39
   617
		return 1;
yann@39
   618
	}
yann@39
   619
skip_check:
yann@1
   620
yann@39
   621
	return 0;
yann@1
   622
}