⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 confdata.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		struct stat st;		char *slash;		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {			strcpy(dirname, name);			strcat(dirname, "/");			basename = conf_get_configname();		} else if ((slash = strrchr(name, '/'))) {			int size = slash - name + 1;			memcpy(dirname, name, size);			dirname[size] = 0;			if (slash[1])				basename = slash + 1;			else				basename = conf_get_configname();		} else			basename = name;	} else		basename = conf_get_configname();	sprintf(newname, "%s%s", dirname, basename);	env = getenv("KCONFIG_OVERWRITECONFIG");	if (!env || !*env) {		sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());		out = fopen(tmpname, "w");	} else {		*tmpname = 0;		out = fopen(newname, "w");	}	if (!out)		return 1;	sym = sym_lookup("KERNELVERSION", 0);	sym_calc_value(sym);	time(&now);	env = getenv("KCONFIG_NOTIMESTAMP");	if (env && *env)		use_timestamp = 0;	fprintf(out, _("#\n"		       "# Automatically generated make config: don't edit\n"		       "# Linux kernel version: %s\n"		       "%s%s"		       "#\n"),		     sym_get_string_value(sym),		     use_timestamp ? "# " : "",		     use_timestamp ? ctime(&now) : "");	if (!conf_get_changed())		sym_clear_all_valid();	menu = rootmenu.list;	while (menu) {		sym = menu->sym;		if (!sym) {			if (!menu_is_visible(menu))				goto next;			str = menu_get_prompt(menu);			fprintf(out, "\n"				     "#\n"				     "# %s\n"				     "#\n", str);		} else if (!(sym->flags & SYMBOL_CHOICE)) {			sym_calc_value(sym);			if (!(sym->flags & SYMBOL_WRITE))				goto next;			sym->flags &= ~SYMBOL_WRITE;			type = sym->type;			if (type == S_TRISTATE) {				sym_calc_value(modules_sym);				if (modules_sym->curr.tri == no)					type = S_BOOLEAN;			}			switch (type) {			case S_BOOLEAN:			case S_TRISTATE:				switch (sym_get_tristate_value(sym)) {				case no:					fprintf(out, "# CONFIG_%s is not set\n", sym->name);					break;				case mod:					fprintf(out, "CONFIG_%s=m\n", sym->name);					break;				case yes:					fprintf(out, "CONFIG_%s=y\n", sym->name);					break;				}				break;			case S_STRING:				str = sym_get_string_value(sym);				fprintf(out, "CONFIG_%s=\"", sym->name);				while (1) {					l = strcspn(str, "\"\\");					if (l) {						fwrite(str, l, 1, out);						str += l;					}					if (!*str)						break;					fprintf(out, "\\%c", *str++);				}				fputs("\"\n", out);				break;			case S_HEX:				str = sym_get_string_value(sym);				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {					fprintf(out, "CONFIG_%s=%s\n", sym->name, str);					break;				}			case S_INT:				str = sym_get_string_value(sym);				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);				break;			}		}	next:		if (menu->list) {			menu = menu->list;			continue;		}		if (menu->next)			menu = menu->next;		else while ((menu = menu->parent)) {			if (menu->next) {				menu = menu->next;				break;			}		}	}	fclose(out);	if (*tmpname) {		strcat(dirname, basename);		strcat(dirname, ".old");		rename(newname, dirname);		if (rename(tmpname, newname))			return 1;	}	printf(_("#\n"		 "# configuration written to %s\n"		 "#\n"), newname);	sym_set_change_count(0);	return 0;}int conf_split_config(void){	char *name, path[128];	char *s, *d, c;	struct symbol *sym;	struct stat sb;	int res, i, fd;	name = getenv("KCONFIG_AUTOCONFIG");	if (!name)		name = "include/config/auto.conf";	conf_read_simple(name, S_DEF_AUTO);	if (chdir("include/config"))		return 1;	res = 0;	for_all_symbols(i, sym) {		sym_calc_value(sym);		if ((sym->flags & SYMBOL_AUTO) || !sym->name)			continue;		if (sym->flags & SYMBOL_WRITE) {			if (sym->flags & SYMBOL_DEF_AUTO) {				/*				 * symbol has old and new value,				 * so compare them...				 */				switch (sym->type) {				case S_BOOLEAN:				case S_TRISTATE:					if (sym_get_tristate_value(sym) ==					    sym->def[S_DEF_AUTO].tri)						continue;					break;				case S_STRING:				case S_HEX:				case S_INT:					if (!strcmp(sym_get_string_value(sym),						    sym->def[S_DEF_AUTO].val))						continue;					break;				default:					break;				}			} else {				/*				 * If there is no old value, only 'no' (unset)				 * is allowed as new value.				 */				switch (sym->type) {				case S_BOOLEAN:				case S_TRISTATE:					if (sym_get_tristate_value(sym) == no)						continue;					break;				default:					break;				}			}		} else if (!(sym->flags & SYMBOL_DEF_AUTO))			/* There is neither an old nor a new value. */			continue;		/* else		 *	There is an old value, but no new value ('no' (unset)		 *	isn't saved in auto.conf, so the old value is always		 *	different from 'no').		 */		/* Replace all '_' and append ".h" */		s = sym->name;		d = path;		while ((c = *s++)) {			c = tolower(c);			*d++ = (c == '_') ? '/' : c;		}		strcpy(d, ".h");		/* Assume directory path already exists. */		fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);		if (fd == -1) {			if (errno != ENOENT) {				res = 1;				break;			}			/*			 * Create directory components,			 * unless they exist already.			 */			d = path;			while ((d = strchr(d, '/'))) {				*d = 0;				if (stat(path, &sb) && mkdir(path, 0755)) {					res = 1;					goto out;				}				*d++ = '/';			}			/* Try it again. */			fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);			if (fd == -1) {				res = 1;				break;			}		}		close(fd);	}out:	if (chdir("../.."))		return 1;	return res;}int conf_write_autoconf(void){	struct symbol *sym;	const char *str;	char *name;	FILE *out, *out_h;	time_t now;	int i, l;	sym_clear_all_valid();	file_write_dep("include/config/auto.conf.cmd");	if (conf_split_config())		return 1;	out = fopen(".tmpconfig", "w");	if (!out)		return 1;	out_h = fopen(".tmpconfig.h", "w");	if (!out_h) {		fclose(out);		return 1;	}	sym = sym_lookup("KERNELVERSION", 0);	sym_calc_value(sym);	time(&now);	fprintf(out, "#\n"		     "# Automatically generated make config: don't edit\n"		     "# Linux kernel version: %s\n"		     "# %s"		     "#\n",		     sym_get_string_value(sym), ctime(&now));	fprintf(out_h, "/*\n"		       " * Automatically generated C config: don't edit\n"		       " * Linux kernel version: %s\n"		       " * %s"		       " */\n"		       "#define AUTOCONF_INCLUDED\n",		       sym_get_string_value(sym), ctime(&now));	for_all_symbols(i, sym) {		sym_calc_value(sym);		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)			continue;		switch (sym->type) {		case S_BOOLEAN:		case S_TRISTATE:			switch (sym_get_tristate_value(sym)) {			case no:				break;			case mod:				fprintf(out, "CONFIG_%s=m\n", sym->name);				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);				break;			case yes:				fprintf(out, "CONFIG_%s=y\n", sym->name);				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);				break;			}			break;		case S_STRING:			str = sym_get_string_value(sym);			fprintf(out, "CONFIG_%s=\"", sym->name);			fprintf(out_h, "#define CONFIG_%s \"", sym->name);			while (1) {				l = strcspn(str, "\"\\");				if (l) {					fwrite(str, l, 1, out);					fwrite(str, l, 1, out_h);					str += l;				}				if (!*str)					break;				fprintf(out, "\\%c", *str);				fprintf(out_h, "\\%c", *str);				str++;			}			fputs("\"\n", out);			fputs("\"\n", out_h);			break;		case S_HEX:			str = sym_get_string_value(sym);			if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);				fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);				break;			}		case S_INT:			str = sym_get_string_value(sym);			fprintf(out, "CONFIG_%s=%s\n", sym->name, str);			fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);			break;		default:			break;		}	}	fclose(out);	fclose(out_h);	name = getenv("KCONFIG_AUTOHEADER");	if (!name)		name = "include/linux/autoconf.h";	if (rename(".tmpconfig.h", name))		return 1;	name = getenv("KCONFIG_AUTOCONFIG");	if (!name)		name = "include/config/auto.conf";	/*	 * This must be the last step, kbuild has a dependency on auto.conf	 * and this marks the successful completion of the previous steps.	 */	if (rename(".tmpconfig", name))		return 1;	return 0;}static int sym_change_count;static void (*conf_changed_callback)(void);void sym_set_change_count(int count){	int _sym_change_count = sym_change_count;	sym_change_count = count;	if (conf_changed_callback &&	    (bool)_sym_change_count != (bool)count)		conf_changed_callback();}void sym_add_change_count(int count){	sym_set_change_count(count + sym_change_count);}bool conf_get_changed(void){	return sym_change_count;}void conf_set_changed_callback(void (*fn)(void)){	conf_changed_callback = fn;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -