Commit 57ddd07c authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kconfig: refactor conf_write_autoconf()



This function does similar for auto.conf and autoconf.h

Create __conf_write_autoconf() helper to factor out the common code.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 8499f2dd
Loading
Loading
Loading
Loading
+57 −37
Original line number Original line Diff line number Diff line
@@ -1058,13 +1058,53 @@ static int conf_touch_deps(void)
	return 0;
	return 0;
}
}


static int __conf_write_autoconf(const char *filename,
				 void (*print_symbol)(FILE *, struct symbol *),
				 const struct comment_style *comment_style)
{
	char tmp[PATH_MAX];
	FILE *file;
	struct symbol *sym;
	int ret, i;

	if (make_parent_dir(filename))
		return -1;

	ret = snprintf(tmp, sizeof(tmp), "%s.tmp", filename);
	if (ret >= sizeof(tmp)) /* check truncation */
		return -1;

	file = fopen(tmp, "w");
	if (!file) {
		perror("fopen");
		return -1;
	}

	conf_write_heading(file, comment_style);

	for_all_symbols(i, sym)
		if ((sym->flags & SYMBOL_WRITE) && sym->name)
			print_symbol(file, sym);

	/* check possible errors in conf_write_heading() and print_symbol() */
	if (ferror(file))
		return -1;

	fclose(file);

	if (rename(tmp, filename)) {
		perror("rename");
		return -1;
	}

	return 0;
}

int conf_write_autoconf(int overwrite)
int conf_write_autoconf(int overwrite)
{
{
	struct symbol *sym;
	struct symbol *sym;
	const char *name;
	const char *autoconf_name = conf_get_autoconfig_name();
	const char *autoconf_name = conf_get_autoconfig_name();
	FILE *out, *out_h;
	int ret, i;
	int i;


	if (!overwrite && is_present(autoconf_name))
	if (!overwrite && is_present(autoconf_name))
		return 0;
		return 0;
@@ -1074,45 +1114,25 @@ int conf_write_autoconf(int overwrite)
	if (conf_touch_deps())
	if (conf_touch_deps())
		return 1;
		return 1;


	out = fopen(".tmpconfig", "w");
	for_all_symbols(i, sym)
	if (!out)
		return 1;

	out_h = fopen(".tmpconfig.h", "w");
	if (!out_h) {
		fclose(out);
		return 1;
	}

	conf_write_heading(out, &comment_style_pound);
	conf_write_heading(out_h, &comment_style_c);

	for_all_symbols(i, sym) {
		sym_calc_value(sym);
		sym_calc_value(sym);
		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
			continue;


		/* write symbols to auto.conf and autoconf.h */
	ret = __conf_write_autoconf(conf_get_autoheader_name(),
		print_symbol_for_autoconf(out, sym);
				    print_symbol_for_c,
		print_symbol_for_c(out_h, sym);
				    &comment_style_c);
	}
	if (ret)
	fclose(out);
		return ret;
	fclose(out_h);

	name = conf_get_autoheader_name();
	if (make_parent_dir(name))
		return 1;
	if (rename(".tmpconfig.h", name))
		return 1;


	if (make_parent_dir(autoconf_name))
		return 1;
	/*
	/*
	 * This must be the last step, kbuild has a dependency on auto.conf
	 * Create include/config/auto.conf. This must be the last step because
	 * and this marks the successful completion of the previous steps.
	 * Kbuild has a dependency on auto.conf and this marks the successful
	 * completion of the previous steps.
	 */
	 */
	if (rename(".tmpconfig", autoconf_name))
	ret = __conf_write_autoconf(conf_get_autoconfig_name(),
		return 1;
				    print_symbol_for_autoconf,
				    &comment_style_pound);
	if (ret)
		return ret;


	return 0;
	return 0;
}
}