• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/scripts/kconfig/
1/*
2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
4 */
5
6#include <sys/stat.h>
7#include <ctype.h>
8#include <fcntl.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include <time.h>
13#include <unistd.h>
14
15#define LKC_DIRECT_LINK
16#include "lkc.h"
17
18static void conf_warning(const char *fmt, ...)
19	__attribute__ ((format (printf, 1, 2)));
20
21static const char *conf_filename;
22static int conf_lineno, conf_warnings, conf_unsaved;
23
24const char conf_defname[] = "arch/$ARCH/defconfig";
25
26static void conf_warning(const char *fmt, ...)
27{
28	va_list ap;
29	va_start(ap, fmt);
30	fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
31	vfprintf(stderr, fmt, ap);
32	fprintf(stderr, "\n");
33	va_end(ap);
34	conf_warnings++;
35}
36
37const char *conf_get_configname(void)
38{
39	char *name = getenv("KCONFIG_CONFIG");
40
41	return name ? name : ".config";
42}
43
44const char *conf_get_autoconfig_name(void)
45{
46	char *name = getenv("KCONFIG_AUTOCONFIG");
47
48	return name ? name : "include/config/auto.conf";
49}
50
51static char *conf_expand_value(const char *in)
52{
53	struct symbol *sym;
54	const char *src;
55	static char res_value[SYMBOL_MAXLENGTH];
56	char *dst, name[SYMBOL_MAXLENGTH];
57
58	res_value[0] = 0;
59	dst = name;
60	while ((src = strchr(in, '$'))) {
61		strncat(res_value, in, src - in);
62		src++;
63		dst = name;
64		while (isalnum(*src) || *src == '_')
65			*dst++ = *src++;
66		*dst = 0;
67		sym = sym_lookup(name, 0);
68		sym_calc_value(sym);
69		strcat(res_value, sym_get_string_value(sym));
70		in = src;
71	}
72	strcat(res_value, in);
73
74	return res_value;
75}
76
77char *conf_get_default_confname(void)
78{
79	struct stat buf;
80	static char fullname[PATH_MAX+1];
81	char *env, *name;
82
83	name = conf_expand_value(conf_defname);
84	env = getenv(SRCTREE);
85	if (env) {
86		sprintf(fullname, "%s/%s", env, name);
87		if (!stat(fullname, &buf))
88			return fullname;
89	}
90	return name;
91}
92
93static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
94{
95	char *p2;
96
97	switch (sym->type) {
98	case S_TRISTATE:
99		if (p[0] == 'm') {
100			sym->def[def].tri = mod;
101			sym->flags |= def_flags;
102			break;
103		}
104	case S_BOOLEAN:
105		if (p[0] == 'y') {
106			sym->def[def].tri = yes;
107			sym->flags |= def_flags;
108			break;
109		}
110		if (p[0] == 'n') {
111			sym->def[def].tri = no;
112			sym->flags |= def_flags;
113			break;
114		}
115		conf_warning("symbol value '%s' invalid for %s", p, sym->name);
116		break;
117	case S_OTHER:
118		if (*p != '"') {
119			for (p2 = p; *p2 && !isspace(*p2); p2++)
120				;
121			sym->type = S_STRING;
122			goto done;
123		}
124	case S_STRING:
125		if (*p++ != '"')
126			break;
127		for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
128			if (*p2 == '"') {
129				*p2 = 0;
130				break;
131			}
132			memmove(p2, p2 + 1, strlen(p2));
133		}
134		if (!p2) {
135			conf_warning("invalid string found");
136			return 1;
137		}
138	case S_INT:
139	case S_HEX:
140	done:
141		if (sym_string_valid(sym, p)) {
142			sym->def[def].val = strdup(p);
143			sym->flags |= def_flags;
144		} else {
145			conf_warning("symbol value '%s' invalid for %s", p, sym->name);
146			return 1;
147		}
148		break;
149	default:
150		;
151	}
152	return 0;
153}
154
155int conf_read_simple(const char *name, int def)
156{
157	FILE *in = NULL;
158	char line[1024];
159	char *p, *p2;
160	struct symbol *sym;
161	int i, def_flags;
162
163	if (name) {
164		in = zconf_fopen(name);
165	} else {
166		struct property *prop;
167
168		name = conf_get_configname();
169		in = zconf_fopen(name);
170		if (in)
171			goto load;
172		sym_add_change_count(1);
173		if (!sym_defconfig_list) {
174			if (modules_sym)
175				sym_calc_value(modules_sym);
176			return 1;
177		}
178
179		for_all_defaults(sym_defconfig_list, prop) {
180			if (expr_calc_value(prop->visible.expr) == no ||
181			    prop->expr->type != E_SYMBOL)
182				continue;
183			name = conf_expand_value(prop->expr->left.sym->name);
184			in = zconf_fopen(name);
185			if (in) {
186				printf(_("#\n"
187					 "# using defaults found in %s\n"
188					 "#\n"), name);
189				goto load;
190			}
191		}
192	}
193	if (!in)
194		return 1;
195
196load:
197	conf_filename = name;
198	conf_lineno = 0;
199	conf_warnings = 0;
200	conf_unsaved = 0;
201
202	def_flags = SYMBOL_DEF << def;
203	for_all_symbols(i, sym) {
204		sym->flags |= SYMBOL_CHANGED;
205		sym->flags &= ~(def_flags|SYMBOL_VALID);
206		if (sym_is_choice(sym))
207			sym->flags |= def_flags;
208		switch (sym->type) {
209		case S_INT:
210		case S_HEX:
211		case S_STRING:
212			if (sym->def[def].val)
213				free(sym->def[def].val);
214		default:
215			sym->def[def].val = NULL;
216			sym->def[def].tri = no;
217		}
218	}
219
220	while (fgets(line, sizeof(line), in)) {
221		conf_lineno++;
222		sym = NULL;
223		switch (line[0]) {
224		case '#':
225			if (memcmp(line + 2, "CONFIG_", 7))
226				continue;
227			p = strchr(line + 9, ' ');
228			if (!p)
229				continue;
230			*p++ = 0;
231			if (strncmp(p, "is not set", 10))
232				continue;
233			if (def == S_DEF_USER) {
234				sym = sym_find(line + 9);
235				if (!sym) {
236					sym_add_change_count(1);
237					break;
238				}
239			} else {
240				sym = sym_lookup(line + 9, 0);
241				if (sym->type == S_UNKNOWN)
242					sym->type = S_BOOLEAN;
243			}
244			if (sym->flags & def_flags) {
245				conf_warning("override: reassigning to symbol %s", sym->name);
246			}
247			switch (sym->type) {
248			case S_BOOLEAN:
249			case S_TRISTATE:
250				sym->def[def].tri = no;
251				sym->flags |= def_flags;
252				break;
253			default:
254				;
255			}
256			break;
257		case 'C':
258			if (memcmp(line, "CONFIG_", 7)) {
259				conf_warning("unexpected data");
260				continue;
261			}
262			p = strchr(line + 7, '=');
263			if (!p)
264				continue;
265			*p++ = 0;
266			p2 = strchr(p, '\n');
267			if (p2) {
268				*p2-- = 0;
269				if (*p2 == '\r')
270					*p2 = 0;
271			}
272			if (def == S_DEF_USER) {
273				sym = sym_find(line + 7);
274				if (!sym) {
275					sym_add_change_count(1);
276					break;
277				}
278			} else {
279				sym = sym_lookup(line + 7, 0);
280				if (sym->type == S_UNKNOWN)
281					sym->type = S_OTHER;
282			}
283			if (sym->flags & def_flags) {
284				conf_warning("override: reassigning to symbol %s", sym->name);
285			}
286			if (conf_set_sym_val(sym, def, def_flags, p))
287				continue;
288			break;
289		case '\r':
290		case '\n':
291			break;
292		default:
293			conf_warning("unexpected data");
294			continue;
295		}
296		if (sym && sym_is_choice_value(sym)) {
297			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
298			switch (sym->def[def].tri) {
299			case no:
300				break;
301			case mod:
302				if (cs->def[def].tri == yes) {
303					conf_warning("%s creates inconsistent choice state", sym->name);
304					cs->flags &= ~def_flags;
305				}
306				break;
307			case yes:
308				if (cs->def[def].tri != no)
309					conf_warning("override: %s changes choice state", sym->name);
310				cs->def[def].val = sym;
311				break;
312			}
313			cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
314		}
315	}
316	fclose(in);
317
318	if (modules_sym)
319		sym_calc_value(modules_sym);
320	return 0;
321}
322
323int conf_read(const char *name)
324{
325	struct symbol *sym, *choice_sym;
326	struct property *prop;
327	struct expr *e;
328	int i, flags;
329
330	sym_set_change_count(0);
331
332	if (conf_read_simple(name, S_DEF_USER))
333		return 1;
334
335	for_all_symbols(i, sym) {
336		sym_calc_value(sym);
337		if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
338			goto sym_ok;
339		if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
340			/* check that calculated value agrees with saved value */
341			switch (sym->type) {
342			case S_BOOLEAN:
343			case S_TRISTATE:
344				if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
345					break;
346				if (!sym_is_choice(sym))
347					goto sym_ok;
348			default:
349				if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
350					goto sym_ok;
351				break;
352			}
353		} else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
354			/* no previous value and not saved */
355			goto sym_ok;
356		conf_unsaved++;
357		/* maybe print value in verbose mode... */
358	sym_ok:
359		if (!sym_is_choice(sym))
360			continue;
361		/* The choice symbol only has a set value (and thus is not new)
362		 * if all its visible childs have values.
363		 */
364		prop = sym_get_choice_prop(sym);
365		flags = sym->flags;
366		expr_list_for_each_sym(prop->expr, e, choice_sym)
367			if (choice_sym->visible != no)
368				flags &= choice_sym->flags;
369		sym->flags &= flags | ~SYMBOL_DEF_USER;
370	}
371
372	for_all_symbols(i, sym) {
373		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
374			/* Reset values of generates values, so they'll appear
375			 * as new, if they should become visible, but that
376			 * doesn't quite work if the Kconfig and the saved
377			 * configuration disagree.
378			 */
379			if (sym->visible == no && !conf_unsaved)
380				sym->flags &= ~SYMBOL_DEF_USER;
381			switch (sym->type) {
382			case S_STRING:
383			case S_INT:
384			case S_HEX:
385				/* Reset a string value if it's out of range */
386				if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
387					break;
388				sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
389				conf_unsaved++;
390				break;
391			default:
392				break;
393			}
394		}
395	}
396
397	sym_add_change_count(conf_warnings || conf_unsaved);
398
399	return 0;
400}
401
402/* Write a S_STRING */
403static void conf_write_string(bool headerfile, const char *name,
404                              const char *str, FILE *out)
405{
406	int l;
407	if (headerfile)
408		fprintf(out, "#define CONFIG_%s \"", name);
409	else
410		fprintf(out, "CONFIG_%s=\"", name);
411
412	while (1) {
413		l = strcspn(str, "\"\\");
414		if (l) {
415			xfwrite(str, l, 1, out);
416			str += l;
417		}
418		if (!*str)
419			break;
420		fprintf(out, "\\%c", *str++);
421	}
422	fputs("\"\n", out);
423}
424
425static void conf_write_symbol(struct symbol *sym, enum symbol_type type,
426                              FILE *out, bool write_no)
427{
428	const char *str;
429
430	switch (type) {
431	case S_BOOLEAN:
432	case S_TRISTATE:
433		switch (sym_get_tristate_value(sym)) {
434		case no:
435			if (write_no)
436				fprintf(out, "# CONFIG_%s is not set\n", sym->name);
437			break;
438		case mod:
439			fprintf(out, "CONFIG_%s=m\n", sym->name);
440			break;
441		case yes:
442			fprintf(out, "CONFIG_%s=y\n", sym->name);
443			break;
444		}
445		break;
446	case S_STRING:
447		conf_write_string(false, sym->name, sym_get_string_value(sym), out);
448		break;
449	case S_HEX:
450	case S_INT:
451		str = sym_get_string_value(sym);
452		fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
453		break;
454	case S_OTHER:
455	case S_UNKNOWN:
456		break;
457	}
458}
459
460/*
461 * Write out a minimal config.
462 * All values that has default values are skipped as this is redundant.
463 */
464int conf_write_defconfig(const char *filename)
465{
466	struct symbol *sym;
467	struct menu *menu;
468	FILE *out;
469
470	out = fopen(filename, "w");
471	if (!out)
472		return 1;
473
474	sym_clear_all_valid();
475
476	/* Traverse all menus to find all relevant symbols */
477	menu = rootmenu.list;
478
479	while (menu != NULL)
480	{
481		sym = menu->sym;
482		if (sym == NULL) {
483			if (!menu_is_visible(menu))
484				goto next_menu;
485		} else if (!sym_is_choice(sym)) {
486			sym_calc_value(sym);
487			if (!(sym->flags & SYMBOL_WRITE))
488				goto next_menu;
489			sym->flags &= ~SYMBOL_WRITE;
490			/* If we cannot change the symbol - skip */
491			if (!sym_is_changable(sym))
492				goto next_menu;
493			/* If symbol equals to default value - skip */
494			if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
495				goto next_menu;
496
497			/*
498			 * If symbol is a choice value and equals to the
499			 * default for a choice - skip.
500			 * But only if value is bool and equal to "y" and
501			 * choice is not "optional".
502			 * (If choice is "optional" then all values can be "n")
503			 */
504			if (sym_is_choice_value(sym)) {
505				struct symbol *cs;
506				struct symbol *ds;
507
508				cs = prop_get_symbol(sym_get_choice_prop(sym));
509				ds = sym_choice_default(cs);
510				if (!sym_is_optional(cs) && sym == ds) {
511					if ((sym->type == S_BOOLEAN) &&
512					    sym_get_tristate_value(sym) == yes)
513						goto next_menu;
514				}
515			}
516			conf_write_symbol(sym, sym->type, out, true);
517		}
518next_menu:
519		if (menu->list != NULL) {
520			menu = menu->list;
521		}
522		else if (menu->next != NULL) {
523			menu = menu->next;
524		} else {
525			while ((menu = menu->parent)) {
526				if (menu->next != NULL) {
527					menu = menu->next;
528					break;
529				}
530			}
531		}
532	}
533	fclose(out);
534	return 0;
535}
536
537int conf_write(const char *name)
538{
539	FILE *out;
540	struct symbol *sym;
541	struct menu *menu;
542	const char *basename;
543	const char *str;
544	char dirname[128], tmpname[128], newname[128];
545	enum symbol_type type;
546	time_t now;
547	int use_timestamp = 1;
548	char *env;
549
550	dirname[0] = 0;
551	if (name && name[0]) {
552		struct stat st;
553		char *slash;
554
555		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
556			strcpy(dirname, name);
557			strcat(dirname, "/");
558			basename = conf_get_configname();
559		} else if ((slash = strrchr(name, '/'))) {
560			int size = slash - name + 1;
561			memcpy(dirname, name, size);
562			dirname[size] = 0;
563			if (slash[1])
564				basename = slash + 1;
565			else
566				basename = conf_get_configname();
567		} else
568			basename = name;
569	} else
570		basename = conf_get_configname();
571
572	sprintf(newname, "%s%s", dirname, basename);
573	env = getenv("KCONFIG_OVERWRITECONFIG");
574	if (!env || !*env) {
575		sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
576		out = fopen(tmpname, "w");
577	} else {
578		*tmpname = 0;
579		out = fopen(newname, "w");
580	}
581	if (!out)
582		return 1;
583
584	sym = sym_lookup("KERNELVERSION", 0);
585	sym_calc_value(sym);
586	time(&now);
587	env = getenv("KCONFIG_NOTIMESTAMP");
588	if (env && *env)
589		use_timestamp = 0;
590
591	fprintf(out, _("#\n"
592		       "# Automatically generated make config: don't edit\n"
593		       "# Linux kernel version: %s\n"
594		       "%s%s"
595		       "#\n"),
596		     sym_get_string_value(sym),
597		     use_timestamp ? "# " : "",
598		     use_timestamp ? ctime(&now) : "");
599
600	if (!conf_get_changed())
601		sym_clear_all_valid();
602
603	menu = rootmenu.list;
604	while (menu) {
605		sym = menu->sym;
606		if (!sym) {
607			if (!menu_is_visible(menu))
608				goto next;
609			str = menu_get_prompt(menu);
610			fprintf(out, "\n"
611				     "#\n"
612				     "# %s\n"
613				     "#\n", str);
614		} else if (!(sym->flags & SYMBOL_CHOICE)) {
615			sym_calc_value(sym);
616			if (!(sym->flags & SYMBOL_WRITE))
617				goto next;
618			sym->flags &= ~SYMBOL_WRITE;
619			type = sym->type;
620			if (type == S_TRISTATE) {
621				sym_calc_value(modules_sym);
622				if (modules_sym->curr.tri == no)
623					type = S_BOOLEAN;
624			}
625			/* Write config symbol to file */
626			conf_write_symbol(sym, type, out, true);
627		}
628
629next:
630		if (menu->list) {
631			menu = menu->list;
632			continue;
633		}
634		if (menu->next)
635			menu = menu->next;
636		else while ((menu = menu->parent)) {
637			if (menu->next) {
638				menu = menu->next;
639				break;
640			}
641		}
642	}
643	fclose(out);
644
645	if (*tmpname) {
646		strcat(dirname, basename);
647		strcat(dirname, ".old");
648		rename(newname, dirname);
649		if (rename(tmpname, newname))
650			return 1;
651	}
652
653	printf(_("#\n"
654		 "# configuration written to %s\n"
655		 "#\n"), newname);
656
657	sym_set_change_count(0);
658
659	return 0;
660}
661
662static int conf_split_config(void)
663{
664	const char *name;
665	char path[128];
666	char *s, *d, c;
667	struct symbol *sym;
668	struct stat sb;
669	int res, i, fd;
670
671	name = conf_get_autoconfig_name();
672	conf_read_simple(name, S_DEF_AUTO);
673
674	if (chdir("include/config"))
675		return 1;
676
677	res = 0;
678	for_all_symbols(i, sym) {
679		sym_calc_value(sym);
680		if ((sym->flags & SYMBOL_AUTO) || !sym->name)
681			continue;
682		if (sym->flags & SYMBOL_WRITE) {
683			if (sym->flags & SYMBOL_DEF_AUTO) {
684				/*
685				 * symbol has old and new value,
686				 * so compare them...
687				 */
688				switch (sym->type) {
689				case S_BOOLEAN:
690				case S_TRISTATE:
691					if (sym_get_tristate_value(sym) ==
692					    sym->def[S_DEF_AUTO].tri)
693						continue;
694					break;
695				case S_STRING:
696				case S_HEX:
697				case S_INT:
698					if (!strcmp(sym_get_string_value(sym),
699						    sym->def[S_DEF_AUTO].val))
700						continue;
701					break;
702				default:
703					break;
704				}
705			} else {
706				/*
707				 * If there is no old value, only 'no' (unset)
708				 * is allowed as new value.
709				 */
710				switch (sym->type) {
711				case S_BOOLEAN:
712				case S_TRISTATE:
713					if (sym_get_tristate_value(sym) == no)
714						continue;
715					break;
716				default:
717					break;
718				}
719			}
720		} else if (!(sym->flags & SYMBOL_DEF_AUTO))
721			/* There is neither an old nor a new value. */
722			continue;
723		/* else
724		 *	There is an old value, but no new value ('no' (unset)
725		 *	isn't saved in auto.conf, so the old value is always
726		 *	different from 'no').
727		 */
728
729		/* Replace all '_' and append ".h" */
730		s = sym->name;
731		d = path;
732		while ((c = *s++)) {
733			c = tolower(c);
734			*d++ = (c == '_') ? '/' : c;
735		}
736		strcpy(d, ".h");
737
738		/* Assume directory path already exists. */
739		fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
740		if (fd == -1) {
741			if (errno != ENOENT) {
742				res = 1;
743				break;
744			}
745			/*
746			 * Create directory components,
747			 * unless they exist already.
748			 */
749			d = path;
750			while ((d = strchr(d, '/'))) {
751				*d = 0;
752				if (stat(path, &sb) && mkdir(path, 0755)) {
753					res = 1;
754					goto out;
755				}
756				*d++ = '/';
757			}
758			/* Try it again. */
759			fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
760			if (fd == -1) {
761				res = 1;
762				break;
763			}
764		}
765		close(fd);
766	}
767out:
768	if (chdir("../.."))
769		return 1;
770
771	return res;
772}
773
774int conf_write_autoconf(void)
775{
776	struct symbol *sym;
777	const char *str;
778	const char *name;
779	FILE *out, *tristate, *out_h;
780	time_t now;
781	int i;
782
783	sym_clear_all_valid();
784
785	file_write_dep("include/config/auto.conf.cmd");
786
787	if (conf_split_config())
788		return 1;
789
790	out = fopen(".tmpconfig", "w");
791	if (!out)
792		return 1;
793
794	tristate = fopen(".tmpconfig_tristate", "w");
795	if (!tristate) {
796		fclose(out);
797		return 1;
798	}
799
800	out_h = fopen(".tmpconfig.h", "w");
801	if (!out_h) {
802		fclose(out);
803		fclose(tristate);
804		return 1;
805	}
806
807	sym = sym_lookup("KERNELVERSION", 0);
808	sym_calc_value(sym);
809	time(&now);
810	fprintf(out, "#\n"
811		     "# Automatically generated make config: don't edit\n"
812		     "# Linux kernel version: %s\n"
813		     "# %s"
814		     "#\n",
815		     sym_get_string_value(sym), ctime(&now));
816	fprintf(tristate, "#\n"
817			  "# Automatically generated - do not edit\n"
818			  "\n");
819	fprintf(out_h, "/*\n"
820		       " * Automatically generated C config: don't edit\n"
821		       " * Linux kernel version: %s\n"
822		       " * %s"
823		       " */\n"
824		       "#define AUTOCONF_INCLUDED\n",
825		       sym_get_string_value(sym), ctime(&now));
826
827	for_all_symbols(i, sym) {
828		sym_calc_value(sym);
829		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
830			continue;
831
832		/* write symbol to config file */
833		conf_write_symbol(sym, sym->type, out, false);
834
835		/* update autoconf and tristate files */
836		switch (sym->type) {
837		case S_BOOLEAN:
838		case S_TRISTATE:
839			switch (sym_get_tristate_value(sym)) {
840			case no:
841				break;
842			case mod:
843				fprintf(tristate, "CONFIG_%s=M\n", sym->name);
844				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
845				break;
846			case yes:
847				if (sym->type == S_TRISTATE)
848					fprintf(tristate, "CONFIG_%s=Y\n",
849							sym->name);
850				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
851				break;
852			}
853			break;
854		case S_STRING:
855			conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
856			break;
857		case S_HEX:
858			str = sym_get_string_value(sym);
859			if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
860				fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
861				break;
862			}
863		case S_INT:
864			str = sym_get_string_value(sym);
865			fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
866			break;
867		default:
868			break;
869		}
870	}
871	fclose(out);
872	fclose(tristate);
873	fclose(out_h);
874
875	name = getenv("KCONFIG_AUTOHEADER");
876	if (!name)
877		name = "include/generated/autoconf.h";
878	if (rename(".tmpconfig.h", name))
879		return 1;
880	name = getenv("KCONFIG_TRISTATE");
881	if (!name)
882		name = "include/config/tristate.conf";
883	if (rename(".tmpconfig_tristate", name))
884		return 1;
885	name = conf_get_autoconfig_name();
886	/*
887	 * This must be the last step, kbuild has a dependency on auto.conf
888	 * and this marks the successful completion of the previous steps.
889	 */
890	if (rename(".tmpconfig", name))
891		return 1;
892
893	return 0;
894}
895
896static int sym_change_count;
897static void (*conf_changed_callback)(void);
898
899void sym_set_change_count(int count)
900{
901	int _sym_change_count = sym_change_count;
902	sym_change_count = count;
903	if (conf_changed_callback &&
904	    (bool)_sym_change_count != (bool)count)
905		conf_changed_callback();
906}
907
908void sym_add_change_count(int count)
909{
910	sym_set_change_count(count + sym_change_count);
911}
912
913bool conf_get_changed(void)
914{
915	return sym_change_count;
916}
917
918void conf_set_changed_callback(void (*fn)(void))
919{
920	conf_changed_callback = fn;
921}
922
923static void randomize_choice_values(struct symbol *csym)
924{
925	struct property *prop;
926	struct symbol *sym;
927	struct expr *e;
928	int cnt, def;
929
930	/*
931	 * If choice is mod then we may have more items slected
932	 * and if no then no-one.
933	 * In both cases stop.
934	 */
935	if (csym->curr.tri != yes)
936		return;
937
938	prop = sym_get_choice_prop(csym);
939
940	/* count entries in choice block */
941	cnt = 0;
942	expr_list_for_each_sym(prop->expr, e, sym)
943		cnt++;
944
945	/*
946	 * find a random value and set it to yes,
947	 * set the rest to no so we have only one set
948	 */
949	def = (rand() % cnt);
950
951	cnt = 0;
952	expr_list_for_each_sym(prop->expr, e, sym) {
953		if (def == cnt++) {
954			sym->def[S_DEF_USER].tri = yes;
955			csym->def[S_DEF_USER].val = sym;
956		}
957		else {
958			sym->def[S_DEF_USER].tri = no;
959		}
960	}
961	csym->flags |= SYMBOL_DEF_USER;
962	/* clear VALID to get value calculated */
963	csym->flags &= ~(SYMBOL_VALID);
964}
965
966static void set_all_choice_values(struct symbol *csym)
967{
968	struct property *prop;
969	struct symbol *sym;
970	struct expr *e;
971
972	prop = sym_get_choice_prop(csym);
973
974	/*
975	 * Set all non-assinged choice values to no
976	 */
977	expr_list_for_each_sym(prop->expr, e, sym) {
978		if (!sym_has_value(sym))
979			sym->def[S_DEF_USER].tri = no;
980	}
981	csym->flags |= SYMBOL_DEF_USER;
982	/* clear VALID to get value calculated */
983	csym->flags &= ~(SYMBOL_VALID);
984}
985
986void conf_set_all_new_symbols(enum conf_def_mode mode)
987{
988	struct symbol *sym, *csym;
989	int i, cnt;
990
991	for_all_symbols(i, sym) {
992		if (sym_has_value(sym))
993			continue;
994		switch (sym_get_type(sym)) {
995		case S_BOOLEAN:
996		case S_TRISTATE:
997			switch (mode) {
998			case def_yes:
999				sym->def[S_DEF_USER].tri = yes;
1000				break;
1001			case def_mod:
1002				sym->def[S_DEF_USER].tri = mod;
1003				break;
1004			case def_no:
1005				sym->def[S_DEF_USER].tri = no;
1006				break;
1007			case def_random:
1008				cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
1009				sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
1010				break;
1011			default:
1012				continue;
1013			}
1014			if (!(sym_is_choice(sym) && mode == def_random))
1015				sym->flags |= SYMBOL_DEF_USER;
1016			break;
1017		default:
1018			break;
1019		}
1020
1021	}
1022
1023	sym_clear_all_valid();
1024
1025	/*
1026	 * We have different type of choice blocks.
1027	 * If curr.tri equal to mod then we can select several
1028	 * choice symbols in one block.
1029	 * In this case we do nothing.
1030	 * If curr.tri equal yes then only one symbol can be
1031	 * selected in a choice block and we set it to yes,
1032	 * and the rest to no.
1033	 */
1034	for_all_symbols(i, csym) {
1035		if (sym_has_value(csym) || !sym_is_choice(csym))
1036			continue;
1037
1038		sym_calc_value(csym);
1039		if (mode == def_random)
1040			randomize_choice_values(csym);
1041		else
1042			set_all_choice_values(csym);
1043	}
1044}
1045