2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
15 #define LKC_DIRECT_LINK
18 static void conf(struct menu
*menu
);
19 static void check_conf(struct menu
*menu
);
30 } input_mode
= ask_all
;
33 static int indent
= 1;
34 static int valid_stdin
= 1;
35 static int sync_kconfig
;
37 static char line
[128];
38 static struct menu
*rootEntry
;
40 static char nohelp_text
[] = N_("Sorry, no help available for this option yet.\n");
42 static const char *get_help(struct menu
*menu
)
44 if (menu_has_help(menu
))
45 return _(menu_get_help(menu
));
50 static void strip(char *str
)
59 memmove(str
, p
, l
+ 1);
67 static void check_stdin(void)
70 printf(_("aborted!\n\n"));
71 printf(_("Console input/output is redirected. "));
72 printf(_("Run 'make oldconfig' to update configuration.\n\n"));
77 static int conf_askvalue(struct symbol
*sym
, const char *def
)
79 enum symbol_type type
= sym_get_type(sym
);
81 if (!sym_has_value(sym
))
87 if (!sym_is_changable(sym
)) {
97 if (sym_has_value(sym
)) {
104 fgets(line
, 128, stdin
);
123 int conf_string(struct menu
*menu
)
125 struct symbol
*sym
= menu
->sym
;
129 printf("%*s%s ", indent
- 1, "", _(menu
->prompt
->text
));
130 printf("(%s) ", sym
->name
);
131 def
= sym_get_string_value(sym
);
132 if (sym_get_string_value(sym
))
133 printf("[%s] ", def
);
134 if (!conf_askvalue(sym
, def
))
141 if (line
[1] == '\n') {
142 printf("\n%s\n", get_help(menu
));
147 line
[strlen(line
)-1] = 0;
150 if (def
&& sym_set_string_value(sym
, def
))
155 static int conf_sym(struct menu
*menu
)
157 struct symbol
*sym
= menu
->sym
;
159 tristate oldval
, newval
;
162 printf("%*s%s ", indent
- 1, "", _(menu
->prompt
->text
));
164 printf("(%s) ", sym
->name
);
165 type
= sym_get_type(sym
);
167 oldval
= sym_get_tristate_value(sym
);
179 if (oldval
!= no
&& sym_tristate_within_range(sym
, no
))
181 if (oldval
!= mod
&& sym_tristate_within_range(sym
, mod
))
183 if (oldval
!= yes
&& sym_tristate_within_range(sym
, yes
))
185 if (menu_has_help(menu
))
188 if (!conf_askvalue(sym
, sym_get_string_value(sym
)))
196 if (!line
[1] || !strcmp(&line
[1], "o"))
208 if (!line
[1] || !strcmp(&line
[1], "es"))
219 if (sym_set_tristate_value(sym
, newval
))
222 printf("\n%s\n", get_help(menu
));
226 static int conf_choice(struct menu
*menu
)
228 struct symbol
*sym
, *def_sym
;
234 type
= sym_get_type(sym
);
235 is_new
= !sym_has_value(sym
);
236 if (sym_is_changable(sym
)) {
239 switch (sym_get_tristate_value(sym
)) {
248 switch (sym_get_tristate_value(sym
)) {
252 printf("%*s%s\n", indent
- 1, "", _(menu_get_prompt(menu
)));
262 printf("%*s%s\n", indent
- 1, "", _(menu_get_prompt(menu
)));
263 def_sym
= sym_get_choice_value(sym
);
266 for (child
= menu
->list
; child
; child
= child
->next
) {
267 if (!menu_is_visible(child
))
270 printf("%*c %s\n", indent
, '*', _(menu_get_prompt(child
)));
274 if (child
->sym
== def_sym
) {
276 printf("%*c", indent
, '>');
278 printf("%*c", indent
, ' ');
279 printf(" %d. %s", cnt
, _(menu_get_prompt(child
)));
280 if (child
->sym
->name
)
281 printf(" (%s)", child
->sym
->name
);
282 if (!sym_has_value(child
->sym
))
286 printf(_("%*schoice"), indent
- 1, "");
291 printf("[1-%d", cnt
);
292 if (menu_has_help(menu
))
295 switch (input_mode
) {
306 fgets(line
, 128, stdin
);
308 if (line
[0] == '?') {
309 printf("\n%s\n", get_help(menu
));
314 else if (isdigit(line
[0]))
324 for (child
= menu
->list
; child
; child
= child
->next
) {
325 if (!child
->sym
|| !menu_is_visible(child
))
332 if (line
[strlen(line
) - 1] == '?') {
333 printf("\n%s\n", get_help(child
));
336 sym_set_choice_value(sym
, child
->sym
);
337 for (child
= child
->list
; child
; child
= child
->next
) {
346 static void conf(struct menu
*menu
)
349 struct property
*prop
;
352 if (!menu_is_visible(menu
))
360 switch (prop
->type
) {
362 if (input_mode
== ask_silent
&& rootEntry
!= menu
) {
367 prompt
= menu_get_prompt(menu
);
369 printf("%*c\n%*c %s\n%*c\n",
371 indent
, '*', _(prompt
),
381 if (sym_is_choice(sym
)) {
383 if (sym
->curr
.tri
!= mod
)
402 for (child
= menu
->list
; child
; child
= child
->next
)
408 static void check_conf(struct menu
*menu
)
413 if (!menu_is_visible(menu
))
417 if (sym
&& !sym_has_value(sym
)) {
418 if (sym_is_changable(sym
) ||
419 (sym_is_choice(sym
) && sym_get_tristate_value(sym
) == yes
)) {
421 printf(_("*\n* Restart config...\n*\n"));
422 rootEntry
= menu_get_parent_menu(menu
);
427 for (child
= menu
->list
; child
; child
= child
->next
)
431 int main(int ac
, char **av
)
437 setlocale(LC_ALL
, "");
438 bindtextdomain(PACKAGE
, LOCALEDIR
);
441 while ((opt
= getopt(ac
, av
, "osdD:nmyrh")) != -1) {
444 input_mode
= ask_silent
;
447 input_mode
= ask_silent
;
451 input_mode
= set_default
;
454 input_mode
= set_default
;
455 defconfig_file
= optarg
;
461 input_mode
= set_mod
;
464 input_mode
= set_yes
;
467 input_mode
= set_random
;
471 printf(_("See README for usage info\n"));
475 fprintf(stderr
, _("See README for usage info\n"));
480 printf(_("%s: Kconfig file missing\n"), av
[0]);
487 if (stat(".config", &tmpstat
)) {
488 fprintf(stderr
, _("***\n"
489 "*** You have not yet configured your kernel!\n"
490 "*** (missing kernel .config file)\n"
492 "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
493 "*** \"make menuconfig\" or \"make xconfig\").\n"
499 switch (input_mode
) {
502 defconfig_file
= conf_get_default_confname();
503 if (conf_read(defconfig_file
)) {
505 "*** Can't find default configuration \"%s\"!\n"
506 "***\n"), defconfig_file
);
519 name
= getenv("KCONFIG_ALLCONFIG");
520 if (name
&& !stat(name
, &tmpstat
)) {
521 conf_read_simple(name
, S_DEF_USER
);
524 switch (input_mode
) {
525 case set_no
: name
= "allno.config"; break;
526 case set_mod
: name
= "allmod.config"; break;
527 case set_yes
: name
= "allyes.config"; break;
528 case set_random
: name
= "allrandom.config"; break;
531 if (!stat(name
, &tmpstat
))
532 conf_read_simple(name
, S_DEF_USER
);
533 else if (!stat("all.config", &tmpstat
))
534 conf_read_simple("all.config", S_DEF_USER
);
541 if (conf_get_changed()) {
542 name
= getenv("KCONFIG_NOSILENTUPDATE");
545 _("\n*** Kernel configuration requires explicit update.\n\n"));
549 valid_stdin
= isatty(0) && isatty(1) && isatty(2);
552 switch (input_mode
) {
554 conf_set_all_new_symbols(def_no
);
557 conf_set_all_new_symbols(def_yes
);
560 conf_set_all_new_symbols(def_mod
);
563 conf_set_all_new_symbols(def_random
);
566 conf_set_all_new_symbols(def_default
);
570 rootEntry
= &rootmenu
;
572 input_mode
= ask_silent
;
575 /* Update until a loop caused no more changes */
578 check_conf(&rootmenu
);
584 /* silentoldconfig is used during the build so we shall update autoconf.
585 * All other commands are only used to generate a config.
587 if (conf_get_changed() && conf_write(NULL
)) {
588 fprintf(stderr
, _("\n*** Error during writing of the kernel configuration.\n\n"));
591 if (conf_write_autoconf()) {
592 fprintf(stderr
, _("\n*** Error during update of the kernel configuration.\n\n"));
596 if (conf_write(NULL
)) {
597 fprintf(stderr
, _("\n*** Error during writing of the kernel configuration.\n\n"));