kconfig: Sync with upstream v5.2

This commit introduces the following upstream changes:

8dde5715b280 kconfig: tests: fix recursive inclusion unit test
ec8f24b7faaf treewide: Add SPDX license identifier - Makefile/Kconfig
fc2694ec1ab7 kconfig: use 'else ifneq' for Makefile to improve readability
aff11cd983ec kconfig: Terminate menu blocks with a comment in the generated config
9cc342f6c4a0 treewide: prefix header search paths with $(srctree)/
9b9f5948afcd kconfig: make conf_get_autoconfig_name() static
b9d1a8e9302e kconfig: use snprintf for formatting pathnames
4cb726121e2c kconfig: remove useless NULL pointer check in conf_write_dep()
580c5b3e1b8b kconfig: make parent directories for the saved .config as needed
67424f61f813 kconfig: do not write .config if the content is the same
ceb7f3296ea1 kconfig: do not accept a directory for configuration output
65be755a5411 kconfig: remove trailing whitespaces
b63e37bc9ec4 kconfig: Make nconf-cfg.sh executable

Signed-off-by: Chris Packham <judge.packham@gmail.com>
This commit is contained in:
Chris Packham 2020-12-09 22:27:48 +13:00
parent d057ba5324
commit 141f88a5f6
6 changed files with 98 additions and 43 deletions

View File

@ -3,6 +3,7 @@
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
*/
#include <sys/mman.h>
#include <sys/stat.h>
#include <ctype.h>
#include <errno.h>
@ -36,6 +37,52 @@ static bool is_dir(const char *path)
return S_ISDIR(st.st_mode);
}
/* return true if the given two files are the same, false otherwise */
static bool is_same(const char *file1, const char *file2)
{
int fd1, fd2;
struct stat st1, st2;
void *map1, *map2;
bool ret = false;
fd1 = open(file1, O_RDONLY);
if (fd1 < 0)
return ret;
fd2 = open(file2, O_RDONLY);
if (fd2 < 0)
goto close1;
ret = fstat(fd1, &st1);
if (ret)
goto close2;
ret = fstat(fd2, &st2);
if (ret)
goto close2;
if (st1.st_size != st2.st_size)
goto close2;
map1 = mmap(NULL, st1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0);
if (map1 == MAP_FAILED)
goto close2;
map2 = mmap(NULL, st2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0);
if (map2 == MAP_FAILED)
goto close2;
if (bcmp(map1, map2, st1.st_size))
goto close2;
ret = true;
close2:
close(fd2);
close1:
close(fd1);
return ret;
}
/*
* Create the parent directory of the given path.
*
@ -179,7 +226,7 @@ const char *conf_get_configname(void)
return name ? name : ".config";
}
const char *conf_get_autoconfig_name(void)
static const char *conf_get_autoconfig_name(void)
{
char *name = getenv("KCONFIG_AUTOCONFIG");
@ -194,7 +241,7 @@ char *conf_get_default_confname(void)
name = expand_string(conf_defname);
env = getenv(SRCTREE);
if (env) {
sprintf(fullname, "%s/%s", env, name);
snprintf(fullname, sizeof(fullname), "%s/%s", env, name);
if (is_present(fullname))
return fullname;
}
@ -817,40 +864,35 @@ int conf_write(const char *name)
FILE *out;
struct symbol *sym;
struct menu *menu;
const char *basename;
const char *str;
char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8];
char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
char *env;
bool need_newline = false;
dirname[0] = 0;
if (name && name[0]) {
char *slash;
if (!name)
name = conf_get_configname();
if (is_dir(name)) {
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();
if (!*name) {
fprintf(stderr, "config name is empty\n");
return -1;
}
if (is_dir(name)) {
fprintf(stderr, "%s: Is a directory\n", name);
return -1;
}
if (make_parent_dir(name))
return -1;
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 {
if (env && *env) {
*tmpname = 0;
out = fopen(newname, "w");
out = fopen(name, "w");
} else {
snprintf(tmpname, sizeof(tmpname), "%s.%d.tmp",
name, (int)getpid());
out = fopen(tmpname, "w");
}
if (!out)
return 1;
@ -871,12 +913,16 @@ int conf_write(const char *name)
"#\n"
"# %s\n"
"#\n", str);
need_newline = false;
} else if (!(sym->flags & SYMBOL_CHOICE)) {
sym_calc_value(sym);
if (!(sym->flags & SYMBOL_WRITE))
goto next;
if (need_newline) {
fprintf(out, "\n");
need_newline = false;
}
sym->flags &= ~SYMBOL_WRITE;
conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
}
@ -888,6 +934,12 @@ next:
if (menu->next)
menu = menu->next;
else while ((menu = menu->parent)) {
if (!menu->sym && menu_is_visible(menu) &&
menu != &rootmenu) {
str = menu_get_prompt(menu);
fprintf(out, "# end of %s\n", str);
need_newline = true;
}
if (menu->next) {
menu = menu->next;
break;
@ -897,14 +949,20 @@ next:
fclose(out);
if (*tmpname) {
strcat(dirname, basename);
strcat(dirname, ".old");
rename(newname, dirname);
if (rename(tmpname, newname))
if (is_same(name, tmpname)) {
conf_message("No change to %s", name);
unlink(tmpname);
sym_set_change_count(0);
return 0;
}
snprintf(oldname, sizeof(oldname), "%s.old", name);
rename(name, oldname);
if (rename(tmpname, name))
return 1;
}
conf_message("configuration written to %s", newname);
conf_message("configuration written to %s", name);
sym_set_change_count(0);
@ -917,8 +975,6 @@ static int conf_write_dep(const char *name)
struct file *file;
FILE *out;
if (!name)
name = ".kconfig.d";
out = fopen("..config.tmp", "w");
if (!out)
return 1;

View File

@ -378,7 +378,8 @@ FILE *zconf_fopen(const char *name)
if (!f && name != NULL && name[0] != '/') {
env = getenv(SRCTREE);
if (env) {
sprintf(fullname, "%s/%s", env, name);
snprintf(fullname, sizeof(fullname),
"%s/%s", env, name);
f = fopen(fullname, "r");
}
}

View File

@ -49,7 +49,6 @@ const char *zconf_curname(void);
/* confdata.c */
const char *conf_get_configname(void);
const char *conf_get_autoconfig_name(void);
char *conf_get_default_confname(void);
void sym_set_change_count(int count);
void sym_add_change_count(int count);

View File

@ -1,4 +1,4 @@
This is NOT the official version of dialog. This version has been
significantly modified from the original. It is for use by the Linux
kernel configuration script. Please do not bother Savio Lam with
kernel configuration script. Please do not bother Savio Lam with
questions about this program.

View File

@ -936,7 +936,7 @@ static void conf_save(void)
set_config_filename(dialog_input_result);
return;
}
show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60);
show_textbox(NULL, "Can't create file!", 5, 60);
break;
case 1:
show_helptext("Save Alternate Configuration", save_config_help);

View File

@ -1441,8 +1441,7 @@ static void conf_save(void)
set_config_filename(dialog_input_result);
return;
}
btn_dialog(main_window, "Can't create file! "
"Probably a nonexistent directory.",
btn_dialog(main_window, "Can't create file!",
1, "<OK>");
break;
case 1: