confdata.c revision 2e3646e51b2d6415549b310655df63e7e0d7a080
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_def_filename[] = ".config";
25
26const char conf_defname[] = "arch/$ARCH/defconfig";
27
28const char *conf_confnames[] = {
29	".config",
30	"/lib/modules/$UNAME_RELEASE/.config",
31	"/etc/kernel-config",
32	"/boot/config-$UNAME_RELEASE",
33	conf_defname,
34	NULL,
35};
36
37static void conf_warning(const char *fmt, ...)
38{
39	va_list ap;
40	va_start(ap, fmt);
41	fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
42	vfprintf(stderr, fmt, ap);
43	fprintf(stderr, "\n");
44	va_end(ap);
45	conf_warnings++;
46}
47
48static char *conf_expand_value(const char *in)
49{
50	struct symbol *sym;
51	const char *src;
52	static char res_value[SYMBOL_MAXLENGTH];
53	char *dst, name[SYMBOL_MAXLENGTH];
54
55	res_value[0] = 0;
56	dst = name;
57	while ((src = strchr(in, '$'))) {
58		strncat(res_value, in, src - in);
59		src++;
60		dst = name;
61		while (isalnum(*src) || *src == '_')
62			*dst++ = *src++;
63		*dst = 0;
64		sym = sym_lookup(name, 0);
65		sym_calc_value(sym);
66		strcat(res_value, sym_get_string_value(sym));
67		in = src;
68	}
69	strcat(res_value, in);
70
71	return res_value;
72}
73
74char *conf_get_default_confname(void)
75{
76	struct stat buf;
77	static char fullname[PATH_MAX+1];
78	char *env, *name;
79
80	name = conf_expand_value(conf_defname);
81	env = getenv(SRCTREE);
82	if (env) {
83		sprintf(fullname, "%s/%s", env, name);
84		if (!stat(fullname, &buf))
85			return fullname;
86	}
87	return name;
88}
89
90int conf_read_simple(const char *name, int def)
91{
92	FILE *in = NULL;
93	char line[1024];
94	char *p, *p2;
95	struct symbol *sym;
96	int i, def_flags;
97
98	if (name) {
99		in = zconf_fopen(name);
100	} else {
101		const char **names = conf_confnames;
102		name = *names++;
103		if (!name)
104			return 1;
105		in = zconf_fopen(name);
106		if (in)
107			goto load;
108		sym_change_count++;
109		while ((name = *names++)) {
110			name = conf_expand_value(name);
111			in = zconf_fopen(name);
112			if (in) {
113				printf(_("#\n"
114					 "# using defaults found in %s\n"
115					 "#\n"), name);
116				goto load;
117			}
118		}
119	}
120	if (!in)
121		return 1;
122
123load:
124	conf_filename = name;
125	conf_lineno = 0;
126	conf_warnings = 0;
127	conf_unsaved = 0;
128
129	def_flags = SYMBOL_DEF << def;
130	for_all_symbols(i, sym) {
131		sym->flags |= SYMBOL_CHANGED;
132		sym->flags &= ~(def_flags|SYMBOL_VALID);
133		if (sym_is_choice(sym))
134			sym->flags |= def_flags;
135		switch (sym->type) {
136		case S_INT:
137		case S_HEX:
138		case S_STRING:
139			if (sym->def[def].val)
140				free(sym->def[def].val);
141		default:
142			sym->def[def].val = NULL;
143			sym->def[def].tri = no;
144		}
145	}
146
147	while (fgets(line, sizeof(line), in)) {
148		conf_lineno++;
149		sym = NULL;
150		switch (line[0]) {
151		case '#':
152			if (memcmp(line + 2, "CONFIG_", 7))
153				continue;
154			p = strchr(line + 9, ' ');
155			if (!p)
156				continue;
157			*p++ = 0;
158			if (strncmp(p, "is not set", 10))
159				continue;
160			if (def == S_DEF_USER) {
161				sym = sym_find(line + 9);
162				if (!sym) {
163					conf_warning("trying to assign nonexistent symbol %s", line + 9);
164					break;
165				}
166			} else {
167				sym = sym_lookup(line + 9, 0);
168				if (sym->type == S_UNKNOWN)
169					sym->type = S_BOOLEAN;
170			}
171			if (sym->flags & def_flags) {
172				conf_warning("trying to reassign symbol %s", sym->name);
173				break;
174			}
175			switch (sym->type) {
176			case S_BOOLEAN:
177			case S_TRISTATE:
178				sym->def[def].tri = no;
179				sym->flags |= def_flags;
180				break;
181			default:
182				;
183			}
184			break;
185		case 'C':
186			if (memcmp(line, "CONFIG_", 7)) {
187				conf_warning("unexpected data");
188				continue;
189			}
190			p = strchr(line + 7, '=');
191			if (!p)
192				continue;
193			*p++ = 0;
194			p2 = strchr(p, '\n');
195			if (p2)
196				*p2 = 0;
197			if (def == S_DEF_USER) {
198				sym = sym_find(line + 7);
199				if (!sym) {
200					conf_warning("trying to assign nonexistent symbol %s", line + 7);
201					break;
202				}
203			} else {
204				sym = sym_lookup(line + 7, 0);
205				if (sym->type == S_UNKNOWN)
206					sym->type = S_OTHER;
207			}
208			if (sym->flags & def_flags) {
209				conf_warning("trying to reassign symbol %s", sym->name);
210				break;
211			}
212			switch (sym->type) {
213			case S_TRISTATE:
214				if (p[0] == 'm') {
215					sym->def[def].tri = mod;
216					sym->flags |= def_flags;
217					break;
218				}
219			case S_BOOLEAN:
220				if (p[0] == 'y') {
221					sym->def[def].tri = yes;
222					sym->flags |= def_flags;
223					break;
224				}
225				if (p[0] == 'n') {
226					sym->def[def].tri = no;
227					sym->flags |= def_flags;
228					break;
229				}
230				conf_warning("symbol value '%s' invalid for %s", p, sym->name);
231				break;
232			case S_OTHER:
233				if (*p != '"') {
234					for (p2 = p; *p2 && !isspace(*p2); p2++)
235						;
236					sym->type = S_STRING;
237					goto done;
238				}
239			case S_STRING:
240				if (*p++ != '"')
241					break;
242				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
243					if (*p2 == '"') {
244						*p2 = 0;
245						break;
246					}
247					memmove(p2, p2 + 1, strlen(p2));
248				}
249				if (!p2) {
250					conf_warning("invalid string found");
251					continue;
252				}
253			case S_INT:
254			case S_HEX:
255			done:
256				if (sym_string_valid(sym, p)) {
257					sym->def[def].val = strdup(p);
258					sym->flags |= def_flags;
259				} else {
260					conf_warning("symbol value '%s' invalid for %s", p, sym->name);
261					continue;
262				}
263				break;
264			default:
265				;
266			}
267			break;
268		case '\n':
269			break;
270		default:
271			conf_warning("unexpected data");
272			continue;
273		}
274		if (sym && sym_is_choice_value(sym)) {
275			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
276			switch (sym->def[def].tri) {
277			case no:
278				break;
279			case mod:
280				if (cs->def[def].tri == yes) {
281					conf_warning("%s creates inconsistent choice state", sym->name);
282					cs->flags &= ~def_flags;
283				}
284				break;
285			case yes:
286				if (cs->def[def].tri != no) {
287					conf_warning("%s creates inconsistent choice state", sym->name);
288					cs->flags &= ~def_flags;
289				} else
290					cs->def[def].val = sym;
291				break;
292			}
293			cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri);
294		}
295	}
296	fclose(in);
297
298	if (modules_sym)
299		sym_calc_value(modules_sym);
300	return 0;
301}
302
303int conf_read(const char *name)
304{
305	struct symbol *sym;
306	struct property *prop;
307	struct expr *e;
308	int i, flags;
309
310	sym_change_count = 0;
311
312	if (conf_read_simple(name, S_DEF_USER))
313		return 1;
314
315	for_all_symbols(i, sym) {
316		sym_calc_value(sym);
317		if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
318			goto sym_ok;
319		if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
320			/* check that calculated value agrees with saved value */
321			switch (sym->type) {
322			case S_BOOLEAN:
323			case S_TRISTATE:
324				if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
325					break;
326				if (!sym_is_choice(sym))
327					goto sym_ok;
328			default:
329				if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
330					goto sym_ok;
331				break;
332			}
333		} else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
334			/* no previous value and not saved */
335			goto sym_ok;
336		conf_unsaved++;
337		/* maybe print value in verbose mode... */
338	sym_ok:
339		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
340			if (sym->visible == no)
341				sym->flags &= ~SYMBOL_DEF_USER;
342			switch (sym->type) {
343			case S_STRING:
344			case S_INT:
345			case S_HEX:
346				if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val))
347					sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
348			default:
349				break;
350			}
351		}
352		if (!sym_is_choice(sym))
353			continue;
354		prop = sym_get_choice_prop(sym);
355		flags = sym->flags;
356		for (e = prop->expr; e; e = e->left.expr)
357			if (e->right.sym->visible != no)
358				flags &= e->right.sym->flags;
359		sym->flags |= flags & SYMBOL_DEF_USER;
360	}
361
362	sym_change_count += conf_warnings || conf_unsaved;
363
364	return 0;
365}
366
367int conf_write(const char *name)
368{
369	FILE *out;
370	struct symbol *sym;
371	struct menu *menu;
372	const char *basename;
373	char dirname[128], tmpname[128], newname[128];
374	int type, l;
375	const char *str;
376	time_t now;
377	int use_timestamp = 1;
378	char *env;
379
380	dirname[0] = 0;
381	if (name && name[0]) {
382		struct stat st;
383		char *slash;
384
385		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
386			strcpy(dirname, name);
387			strcat(dirname, "/");
388			basename = conf_def_filename;
389		} else if ((slash = strrchr(name, '/'))) {
390			int size = slash - name + 1;
391			memcpy(dirname, name, size);
392			dirname[size] = 0;
393			if (slash[1])
394				basename = slash + 1;
395			else
396				basename = conf_def_filename;
397		} else
398			basename = name;
399	} else
400		basename = conf_def_filename;
401
402	sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
403	out = fopen(newname, "w");
404	if (!out)
405		return 1;
406	sym = sym_lookup("KERNELVERSION", 0);
407	sym_calc_value(sym);
408	time(&now);
409	env = getenv("KCONFIG_NOTIMESTAMP");
410	if (env && *env)
411		use_timestamp = 0;
412
413	fprintf(out, _("#\n"
414		       "# Automatically generated make config: don't edit\n"
415		       "# Linux kernel version: %s\n"
416		       "%s%s"
417		       "#\n"),
418		     sym_get_string_value(sym),
419		     use_timestamp ? "# " : "",
420		     use_timestamp ? ctime(&now) : "");
421
422	if (!sym_change_count)
423		sym_clear_all_valid();
424
425	menu = rootmenu.list;
426	while (menu) {
427		sym = menu->sym;
428		if (!sym) {
429			if (!menu_is_visible(menu))
430				goto next;
431			str = menu_get_prompt(menu);
432			fprintf(out, "\n"
433				     "#\n"
434				     "# %s\n"
435				     "#\n", str);
436		} else if (!(sym->flags & SYMBOL_CHOICE)) {
437			sym_calc_value(sym);
438			if (!(sym->flags & SYMBOL_WRITE))
439				goto next;
440			sym->flags &= ~SYMBOL_WRITE;
441			type = sym->type;
442			if (type == S_TRISTATE) {
443				sym_calc_value(modules_sym);
444				if (modules_sym->curr.tri == no)
445					type = S_BOOLEAN;
446			}
447			switch (type) {
448			case S_BOOLEAN:
449			case S_TRISTATE:
450				switch (sym_get_tristate_value(sym)) {
451				case no:
452					fprintf(out, "# CONFIG_%s is not set\n", sym->name);
453					break;
454				case mod:
455					fprintf(out, "CONFIG_%s=m\n", sym->name);
456					break;
457				case yes:
458					fprintf(out, "CONFIG_%s=y\n", sym->name);
459					break;
460				}
461				break;
462			case S_STRING:
463				str = sym_get_string_value(sym);
464				fprintf(out, "CONFIG_%s=\"", sym->name);
465				while (1) {
466					l = strcspn(str, "\"\\");
467					if (l) {
468						fwrite(str, l, 1, out);
469						str += l;
470					}
471					if (!*str)
472						break;
473					fprintf(out, "\\%c", *str++);
474				}
475				fputs("\"\n", out);
476				break;
477			case S_HEX:
478				str = sym_get_string_value(sym);
479				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
480					fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
481					break;
482				}
483			case S_INT:
484				str = sym_get_string_value(sym);
485				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
486				break;
487			}
488		}
489
490	next:
491		if (menu->list) {
492			menu = menu->list;
493			continue;
494		}
495		if (menu->next)
496			menu = menu->next;
497		else while ((menu = menu->parent)) {
498			if (menu->next) {
499				menu = menu->next;
500				break;
501			}
502		}
503	}
504	fclose(out);
505	if (!name || basename != conf_def_filename) {
506		if (!name)
507			name = conf_def_filename;
508		sprintf(tmpname, "%s.old", name);
509		rename(name, tmpname);
510	}
511	sprintf(tmpname, "%s%s", dirname, basename);
512	if (rename(newname, tmpname))
513		return 1;
514
515	printf(_("#\n"
516		 "# configuration written to %s\n"
517		 "#\n"), tmpname);
518
519	sym_change_count = 0;
520
521	return 0;
522}
523
524int conf_split_config(void)
525{
526	char *name, path[128];
527	char *s, *d, c;
528	struct symbol *sym;
529	struct stat sb;
530	int res, i, fd;
531
532	name = getenv("KCONFIG_AUTOCONFIG");
533	if (!name)
534		name = "include/config/auto.conf";
535	conf_read_simple(name, S_DEF_AUTO);
536
537	if (chdir("include/config"))
538		return 1;
539
540	res = 0;
541	for_all_symbols(i, sym) {
542		sym_calc_value(sym);
543		if ((sym->flags & SYMBOL_AUTO) || !sym->name)
544			continue;
545		if (sym->flags & SYMBOL_WRITE) {
546			if (sym->flags & SYMBOL_DEF_AUTO) {
547				/*
548				 * symbol has old and new value,
549				 * so compare them...
550				 */
551				switch (sym->type) {
552				case S_BOOLEAN:
553				case S_TRISTATE:
554					if (sym_get_tristate_value(sym) ==
555					    sym->def[S_DEF_AUTO].tri)
556						continue;
557					break;
558				case S_STRING:
559				case S_HEX:
560				case S_INT:
561					if (!strcmp(sym_get_string_value(sym),
562						    sym->def[S_DEF_AUTO].val))
563						continue;
564					break;
565				default:
566					break;
567				}
568			} else {
569				/*
570				 * If there is no old value, only 'no' (unset)
571				 * is allowed as new value.
572				 */
573				switch (sym->type) {
574				case S_BOOLEAN:
575				case S_TRISTATE:
576					if (sym_get_tristate_value(sym) == no)
577						continue;
578					break;
579				default:
580					break;
581				}
582			}
583		} else if (!(sym->flags & SYMBOL_DEF_AUTO))
584			/* There is neither an old nor a new value. */
585			continue;
586		/* else
587		 *	There is an old value, but no new value ('no' (unset)
588		 *	isn't saved in auto.conf, so the old value is always
589		 *	different from 'no').
590		 */
591
592		/* Replace all '_' and append ".h" */
593		s = sym->name;
594		d = path;
595		while ((c = *s++)) {
596			c = tolower(c);
597			*d++ = (c == '_') ? '/' : c;
598		}
599		strcpy(d, ".h");
600
601		/* Assume directory path already exists. */
602		fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
603		if (fd == -1) {
604			if (errno != ENOENT) {
605				res = 1;
606				break;
607			}
608			/*
609			 * Create directory components,
610			 * unless they exist already.
611			 */
612			d = path;
613			while ((d = strchr(d, '/'))) {
614				*d = 0;
615				if (stat(path, &sb) && mkdir(path, 0755)) {
616					res = 1;
617					goto out;
618				}
619				*d++ = '/';
620			}
621			/* Try it again. */
622			fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
623			if (fd == -1) {
624				res = 1;
625				break;
626			}
627		}
628		close(fd);
629	}
630out:
631	if (chdir("../.."))
632		return 1;
633
634	return res;
635}
636
637int conf_write_autoconf(void)
638{
639	struct symbol *sym;
640	const char *str;
641	char *name;
642	FILE *out, *out_h;
643	time_t now;
644	int i, l;
645
646	sym_clear_all_valid();
647
648	file_write_dep("include/config/auto.conf.cmd");
649
650	if (conf_split_config())
651		return 1;
652
653	out = fopen(".tmpconfig", "w");
654	if (!out)
655		return 1;
656
657	out_h = fopen(".tmpconfig.h", "w");
658	if (!out_h) {
659		fclose(out);
660		return 1;
661	}
662
663	sym = sym_lookup("KERNELVERSION", 0);
664	sym_calc_value(sym);
665	time(&now);
666	fprintf(out, "#\n"
667		     "# Automatically generated make config: don't edit\n"
668		     "# Linux kernel version: %s\n"
669		     "# %s"
670		     "#\n",
671		     sym_get_string_value(sym), ctime(&now));
672	fprintf(out_h, "/*\n"
673		       " * Automatically generated C config: don't edit\n"
674		       " * Linux kernel version: %s\n"
675		       " * %s"
676		       " */\n"
677		       "#define AUTOCONF_INCLUDED\n",
678		       sym_get_string_value(sym), ctime(&now));
679
680	for_all_symbols(i, sym) {
681		sym_calc_value(sym);
682		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
683			continue;
684		switch (sym->type) {
685		case S_BOOLEAN:
686		case S_TRISTATE:
687			switch (sym_get_tristate_value(sym)) {
688			case no:
689				break;
690			case mod:
691				fprintf(out, "CONFIG_%s=m\n", sym->name);
692				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
693				break;
694			case yes:
695				fprintf(out, "CONFIG_%s=y\n", sym->name);
696				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
697				break;
698			}
699			break;
700		case S_STRING:
701			str = sym_get_string_value(sym);
702			fprintf(out, "CONFIG_%s=\"", sym->name);
703			fprintf(out_h, "#define CONFIG_%s \"", sym->name);
704			while (1) {
705				l = strcspn(str, "\"\\");
706				if (l) {
707					fwrite(str, l, 1, out);
708					fwrite(str, l, 1, out_h);
709					str += l;
710				}
711				if (!*str)
712					break;
713				fprintf(out, "\\%c", *str);
714				fprintf(out_h, "\\%c", *str);
715				str++;
716			}
717			fputs("\"\n", out);
718			fputs("\"\n", out_h);
719			break;
720		case S_HEX:
721			str = sym_get_string_value(sym);
722			if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
723				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
724				fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
725				break;
726			}
727		case S_INT:
728			str = sym_get_string_value(sym);
729			fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
730			fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
731			break;
732		default:
733			break;
734		}
735	}
736	fclose(out);
737	fclose(out_h);
738
739	name = getenv("KCONFIG_AUTOHEADER");
740	if (!name)
741		name = "include/linux/autoconf.h";
742	if (rename(".tmpconfig.h", name))
743		return 1;
744	name = getenv("KCONFIG_AUTOCONFIG");
745	if (!name)
746		name = "include/config/auto.conf";
747	/*
748	 * This must be the last step, kbuild has a dependency on auto.conf
749	 * and this marks the successful completion of the previous steps.
750	 */
751	if (rename(".tmpconfig", name))
752		return 1;
753
754	return 0;
755}
756