diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2014-04-06 14:46:57 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2014-04-06 14:46:57 +0200 |
commit | e8440b5c2722b2740b7fd444edcd7cbd531ccddb (patch) | |
tree | 64f07e9f722439e9d77bf66b4b6c8339149537a9 /toolchain/uclibc/patches | |
parent | b5a90a6f0655899fed42ba37d7825f7709ad4dea (diff) |
use lowercase directory name
Diffstat (limited to 'toolchain/uclibc/patches')
-rw-r--r-- | toolchain/uclibc/patches/uclibc-git-20140313.patch | 116105 | ||||
-rw-r--r-- | toolchain/uclibc/patches/xxx-origin.patch | 177 | ||||
-rw-r--r-- | toolchain/uclibc/patches/xxx-sparc-wait4.patch | 12 |
3 files changed, 116294 insertions, 0 deletions
diff --git a/toolchain/uclibc/patches/uclibc-git-20140313.patch b/toolchain/uclibc/patches/uclibc-git-20140313.patch new file mode 100644 index 000000000..561c08007 --- /dev/null +++ b/toolchain/uclibc/patches/uclibc-git-20140313.patch @@ -0,0 +1,116105 @@ +diff -Nur uClibc-0.9.33.2/docs/man/arc4random.3 uClibc-git/docs/man/arc4random.3 +--- uClibc-0.9.33.2/docs/man/arc4random.3 1970-01-01 01:00:00.000000000 +0100 ++++ uClibc-git/docs/man/arc4random.3 2014-02-03 12:32:56.000000000 +0100 +@@ -0,0 +1,110 @@ ++.\" $OpenBSD: arc4random.3,v 1.19 2005/07/17 08:50:55 jaredy Exp $ ++.\" ++.\" Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> ++.\" All rights reserved. ++.\" ++.\" Redistribution and use in source and binary forms, with or without ++.\" modification, are permitted provided that the following conditions ++.\" are met: ++.\" 1. Redistributions of source code must retain the above copyright ++.\" notice, this list of conditions and the following disclaimer. ++.\" 2. Redistributions in binary form must reproduce the above copyright ++.\" notice, this list of conditions and the following disclaimer in the ++.\" documentation and/or other materials provided with the distribution. ++.\" 3. All advertising materials mentioning features or use of this software ++.\" must display the following acknowledgement: ++.\" This product includes software developed by Niels Provos. ++.\" 4. The name of the author may not be used to endorse or promote products ++.\" derived from this software without specific prior written permission. ++.\" ++.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ++.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ++.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ++.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ++.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ++.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++.\" ++.\" Manual page, using -mandoc macros ++.\" ++.Dd April 15, 1997 ++.Dt ARC4RANDOM 3 ++.Os ++.Sh NAME ++.Nm arc4random , ++.Nm arc4random_stir , ++.Nm arc4random_addrandom ++.Nd arc4 random number generator ++.Sh SYNOPSIS ++.Fd #include <stdlib.h> ++.Ft uint32_t ++.Fn arc4random "void" ++.Ft void ++.Fn arc4random_stir "void" ++.Ft void ++.Fn arc4random_addrandom "u_char *dat" "int datlen" ++.Sh DESCRIPTION ++The ++.Fn arc4random ++function provides a high quality 32-bit pseudo-random ++number very quickly. ++.Fn arc4random ++seeds itself on a regular basis from the kernel strong random number ++subsystem described in ++.Xr random 4 . ++On each call, an ARC4 generator is used to generate a new result. ++The ++.Fn arc4random ++function uses the ARC4 cipher key stream generator, ++which uses 8*8 8-bit S-Boxes. ++The S-Boxes can be in about (2**1700) states. ++.Pp ++.Fn arc4random ++fits into a middle ground not covered by other subsystems such as ++the strong, slow, and resource expensive random ++devices described in ++.Xr random 4 ++versus the fast but poor quality interfaces described in ++.Xr rand 3 , ++.Xr random 3 , ++and ++.Xr drand48 3 . ++.Pp ++The ++.Fn arc4random_stir ++function reads data from a pseudo-random device, usually ++.Pa /dev/urandom, ++and uses it to permute the S-Boxes via ++.Fn arc4random_addrandom . ++.Pp ++There is no need to call ++.Fn arc4random_stir ++before using ++.Fn arc4random , ++since ++.Fn arc4random ++automatically initializes itself. ++.Sh SEE ALSO ++.Xr rand 3 , ++.Xr rand48 3 , ++.Xr random 3 ++.Sh HISTORY ++An algorithm called ++.Pa RC4 ++was designed by RSA Data Security, Inc. ++It was considered a trade secret. ++Because it was a trade secret, it obviously could not be patented. ++A clone of this was posted anonymously to USENET and confirmed to ++be equivalent by several sources who had access to the original cipher. ++Because of the trade secret situation, RSA Data Security, Inc. can do ++nothing about the release of the ARC4 algorithm. ++Since ++.Pa RC4 ++used to be a trade secret, the cipher is now referred to as ++.Pa ARC4 . ++.Pp ++These functions first appeared in ++.Ox 2.1 . +diff -Nur uClibc-0.9.33.2/docs/PORTING uClibc-git/docs/PORTING +--- uClibc-0.9.33.2/docs/PORTING 2012-05-15 09:20:09.000000000 +0200 ++++ uClibc-git/docs/PORTING 2014-02-03 12:32:56.000000000 +0100 +@@ -130,9 +130,6 @@ + ==================== + === Misc Cruft === + ==================== +-- utils/readelf.c - not really needed generally speaking, but might as well +- add your arch to the giant EM_* list (describe_elf_hdr) +- + - MAINTAINERS - presumably you're going to submit this code back to mainline + and since you're the only one who cares about this arch (right now), you + should add yourself to the toplevel MAINTAINERS file. do it. +diff -Nur uClibc-0.9.33.2/extra/config/check.sh uClibc-git/extra/config/check.sh +--- uClibc-0.9.33.2/extra/config/check.sh 2012-05-15 09:20:09.000000000 +0200 ++++ uClibc-git/extra/config/check.sh 2014-02-03 12:32:56.000000000 +0100 +@@ -1,6 +1,6 @@ + #!/bin/sh + # Needed for systems without gettext +-$* -xc -o /dev/null - > /dev/null 2>&1 << EOF ++$* -x c -o /dev/null - > /dev/null 2>&1 << EOF + #include <libintl.h> + int main() + { +diff -Nur uClibc-0.9.33.2/extra/config/conf.c uClibc-git/extra/config/conf.c +--- uClibc-0.9.33.2/extra/config/conf.c 2012-05-15 09:20:09.000000000 +0200 ++++ uClibc-git/extra/config/conf.c 2014-02-03 12:32:56.000000000 +0100 +@@ -10,42 +10,48 @@ + #include <string.h> + #include <time.h> + #include <unistd.h> ++#include <getopt.h> + #include <sys/stat.h> + #include <sys/time.h> ++#include <errno.h> + +-#define LKC_DIRECT_LINK + #include "lkc.h" + + static void conf(struct menu *menu); + static void check_conf(struct menu *menu); ++static void xfgets(char *str, int size, FILE *in); + +-enum { +- ask_all, +- ask_new, +- ask_silent, +- set_default, +- set_yes, +- set_mod, +- set_no, +- set_random +-} input_mode = ask_all; +-char *defconfig_file; ++enum input_mode { ++ oldaskconfig, ++ silentoldconfig, ++ oldconfig, ++ allnoconfig, ++ allyesconfig, ++ allmodconfig, ++ alldefconfig, ++ randconfig, ++ defconfig, ++ savedefconfig, ++ listnewconfig, ++ olddefconfig, ++} input_mode = oldaskconfig; + + static int indent = 1; ++static int tty_stdio; + static int valid_stdin = 1; + static int sync_kconfig; + static int conf_cnt; + static char line[128]; + static struct menu *rootEntry; + +-static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); +- +-static const char *get_help(struct menu *menu) ++static void print_help(struct menu *menu) + { +- if (menu_has_help(menu)) +- return _(menu_get_help(menu)); +- else +- return nohelp_text; ++ struct gstr help = str_new(); ++ ++ menu_get_ext_help(menu, &help); ++ ++ printf("\n%s\n", str_get(&help)); ++ str_free(&help); + } + + static void strip(char *str) +@@ -93,16 +99,19 @@ + } + + switch (input_mode) { +- case ask_new: +- case ask_silent: ++ case oldconfig: ++ case silentoldconfig: + if (sym_has_value(sym)) { + printf("%s\n", def); + return 0; + } + check_stdin(); +- case ask_all: ++ /* fall through */ ++ case oldaskconfig: + fflush(stdout); +- fgets(line, 128, stdin); ++ xfgets(line, 128, stdin); ++ if (!tty_stdio) ++ printf("\n"); + return 1; + default: + break; +@@ -121,7 +130,7 @@ + return 1; + } + +-int conf_string(struct menu *menu) ++static int conf_string(struct menu *menu) + { + struct symbol *sym = menu->sym; + const char *def; +@@ -140,10 +149,11 @@ + case '?': + /* print help */ + if (line[1] == '\n') { +- printf("\n%s\n", get_help(menu)); ++ print_help(menu); + def = NULL; + break; + } ++ /* fall through */ + default: + line[strlen(line)-1] = 0; + def = line; +@@ -156,14 +166,12 @@ + static int conf_sym(struct menu *menu) + { + struct symbol *sym = menu->sym; +- int type; + tristate oldval, newval; + + while (1) { + printf("%*s%s ", indent - 1, "", _(menu->prompt->text)); + if (sym->name) + printf("(%s) ", sym->name); +- type = sym_get_type(sym); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { +@@ -220,7 +228,7 @@ + if (sym_set_tristate_value(sym, newval)) + return 0; + help: +- printf("\n%s\n", get_help(menu)); ++ print_help(menu); + } + } + +@@ -228,11 +236,9 @@ + { + struct symbol *sym, *def_sym; + struct menu *child; +- int type; + bool is_new; + + sym = menu->sym; +- type = sym_get_type(sym); + is_new = !sym_has_value(sym); + if (sym_is_changable(sym)) { + conf_sym(menu); +@@ -294,20 +300,21 @@ + printf("?"); + printf("]: "); + switch (input_mode) { +- case ask_new: +- case ask_silent: ++ case oldconfig: ++ case silentoldconfig: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + check_stdin(); +- case ask_all: ++ /* fall through */ ++ case oldaskconfig: + fflush(stdout); +- fgets(line, 128, stdin); ++ xfgets(line, 128, stdin); + strip(line); + if (line[0] == '?') { +- printf("\n%s\n", get_help(menu)); ++ print_help(menu); + continue; + } + if (!line[0]) +@@ -330,8 +337,8 @@ + } + if (!child) + continue; +- if (line[strlen(line) - 1] == '?') { +- printf("\n%s\n", get_help(child)); ++ if (line[0] && line[strlen(line) - 1] == '?') { ++ print_help(child); + continue; + } + sym_set_choice_value(sym, child->sym); +@@ -360,10 +367,14 @@ + + switch (prop->type) { + case P_MENU: +- if (input_mode == ask_silent && rootEntry != menu) { ++ if ((input_mode == silentoldconfig || ++ input_mode == listnewconfig || ++ input_mode == olddefconfig) && ++ rootEntry != menu) { + check_conf(menu); + return; + } ++ /* fall through */ + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) +@@ -418,10 +429,16 @@ + if (sym && !sym_has_value(sym)) { + if (sym_is_changable(sym) || + (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { +- if (!conf_cnt++) +- printf(_("*\n* Restart config...\n*\n")); +- rootEntry = menu_get_parent_menu(menu); +- conf(rootEntry); ++ if (input_mode == listnewconfig) { ++ if (sym->name && !sym_is_choice_value(sym)) { ++ printf("%s%s\n", CONFIG_, sym->name); ++ } ++ } else if (input_mode != olddefconfig) { ++ if (!conf_cnt++) ++ printf(_("*\n* Restart config...\n*\n")); ++ rootEntry = menu_get_parent_menu(menu); ++ conf(rootEntry); ++ } + } + } + +@@ -429,90 +446,170 @@ + check_conf(child); + } + ++#if 00 // || !defined __UCLIBC__ || \ ++ (defined UCLIBC_HAS_GETOPT_LONG || defined UCLIBC_HAS_GNU_GETOPT) ++static struct option long_opts[] = { ++ {"oldaskconfig", no_argument, NULL, oldaskconfig}, ++ {"oldconfig", no_argument, NULL, oldconfig}, ++ {"silentoldconfig", no_argument, NULL, silentoldconfig}, ++ {"defconfig", optional_argument, NULL, defconfig}, ++ {"savedefconfig", required_argument, NULL, savedefconfig}, ++ {"allnoconfig", no_argument, NULL, allnoconfig}, ++ {"allyesconfig", no_argument, NULL, allyesconfig}, ++ {"allmodconfig", no_argument, NULL, allmodconfig}, ++ {"alldefconfig", no_argument, NULL, alldefconfig}, ++ {"randconfig", no_argument, NULL, randconfig}, ++ {"listnewconfig", no_argument, NULL, listnewconfig}, ++ {"olddefconfig", no_argument, NULL, olddefconfig}, ++ /* ++ * oldnoconfig is an alias of olddefconfig, because people already ++ * are dependent on its behavior(sets new symbols to their default ++ * value but not 'n') with the counter-intuitive name. ++ */ ++ {"oldnoconfig", no_argument, NULL, olddefconfig}, ++ {NULL, 0, NULL, 0} ++}; ++ ++static void conf_usage(const char *progname) ++{ ++ ++ printf("Usage: %s [option] <kconfig-file>\n", progname); ++ printf("[option] is _one_ of the following:\n"); ++ printf(" --listnewconfig List new options\n"); ++ printf(" --oldaskconfig Start a new configuration using a line-oriented program\n"); ++ printf(" --oldconfig Update a configuration using a provided .config as base\n"); ++ printf(" --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n"); ++ printf(" --olddefconfig Same as silentoldconfig but sets new symbols to their default value\n"); ++ printf(" --oldnoconfig An alias of olddefconfig\n"); ++ printf(" --defconfig <file> New config with default defined in <file>\n"); ++ printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n"); ++ printf(" --allnoconfig New config where all options are answered with no\n"); ++ printf(" --allyesconfig New config where all options are answered with yes\n"); ++ printf(" --allmodconfig New config where all options are answered with mod\n"); ++ printf(" --alldefconfig New config with all symbols set to default\n"); ++ printf(" --randconfig New config with random answer to all options\n"); ++} ++#else ++static void conf_usage(const char *progname) ++{ ++ ++ printf("Usage: %s [option] <kconfig-file>\n", progname); ++ printf("[option] is _one_ of the following:\n"); ++ printf(" -a, --oldaskconfig Start a new configuration using a line-oriented program\n"); ++ printf(" -s, --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n"); ++ printf(" -o, --oldconfig Update a configuration using a provided .config as base\n"); ++ printf(" -n, --allnoconfig New config where all options are answered with no\n"); ++ printf(" -y, --allyesconfig New config where all options are answered with yes\n"); ++ printf(" -m, --allmodconfig New config where all options are answered with mod\n"); ++ printf(" -A, --alldefconfig New config with all symbols set to default\n"); ++ printf(" -r, --randconfig New config with random answer to all options\n"); ++ printf(" -D, --defconfig <file> New config with default defined in <file>\n"); ++ printf(" -S, --savedefconfig <file> Save the minimal current configuration to <file>\n"); ++ printf(" -l, --listnewconfig List new options\n"); ++ printf(" -d, --olddefconfig Same as silentoldconfig but sets new symbols to their default value\n"); ++ printf(" --oldnoconfig An alias of olddefconfig\n"); ++ ++} ++#endif ++ + int main(int ac, char **av) + { ++ const char *progname = av[0]; + int opt; +- const char *name; +- const char *configname = conf_get_configname(); ++ const char *name, *defconfig_file = NULL /* gcc uninit */; + struct stat tmpstat; + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + +- while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) { ++ tty_stdio = isatty(0) && isatty(1) && isatty(2); ++ ++#if 00// !defined __UCLIBC__ || \ ++ (defined UCLIBC_HAS_GETOPT_LONG || defined UCLIBC_HAS_GNU_GETOPT) ++ while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) ++#else ++ char *gch = "asonymArDSld"; ++ while ((opt = getopt(ac, av, "asonymArD:S:ldh")) != -1) ++#endif ++ { ++ char *x = memchr(gch, opt, strlen(gch)); ++ if (x == NULL) ++ opt = '?'; ++ else ++ opt = x - gch; ++ input_mode = (enum input_mode)opt; + switch (opt) { +- case 'o': +- input_mode = ask_silent; +- break; +- case 's': +- input_mode = ask_silent; ++ case silentoldconfig: + sync_kconfig = 1; + break; +- case 'd': +- input_mode = set_default; +- break; +- case 'D': +- input_mode = set_default; ++ case defconfig: ++ case savedefconfig: + defconfig_file = optarg; + break; +- case 'n': +- input_mode = set_no; +- break; +- case 'm': +- input_mode = set_mod; +- break; +- case 'y': +- input_mode = set_yes; +- break; +- case 'r': ++ case randconfig: + { + struct timeval now; + unsigned int seed; ++ char *seed_env; + + /* + * Use microseconds derived seed, + * compensate for systems where it may be zero + */ + gettimeofday(&now, NULL); +- + seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); +- srand(seed); + +- input_mode = set_random; ++ seed_env = getenv("KCONFIG_SEED"); ++ if( seed_env && *seed_env ) { ++ char *endp; ++ int tmp = (int)strtol(seed_env, &endp, 0); ++ if (*endp == '\0') { ++ seed = tmp; ++ } ++ } ++ fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed ); ++ srand(seed); + break; + } +- case 'h': +- printf(_("See README for usage info\n")); +- exit(0); ++ case oldaskconfig: ++ case oldconfig: ++ case allnoconfig: ++ case allyesconfig: ++ case allmodconfig: ++ case alldefconfig: ++ case listnewconfig: ++ case olddefconfig: + break; +- default: +- fprintf(stderr, _("See README for usage info\n")); ++ case '?': ++ conf_usage(progname); + exit(1); ++ break; + } + } + if (ac == optind) { + printf(_("%s: Kconfig file missing\n"), av[0]); ++ conf_usage(progname); + exit(1); + } + name = av[optind]; + conf_parse(name); + //zconfdump(stdout); + if (sync_kconfig) { +- if (stat(configname, &tmpstat)) { ++ name = conf_get_configname(); ++ if (stat(name, &tmpstat)) { + fprintf(stderr, _("***\n" +- "*** You have not yet configured!\n" +- "*** (missing .config file)\n" ++ "*** Configuration file \"%s\" not found!\n" + "***\n" + "*** Please run some configurator (e.g. \"make oldconfig\" or\n" + "*** \"make menuconfig\" or \"make xconfig\").\n" +- "***\n")); ++ "***\n"), name); + exit(1); + } + } + + switch (input_mode) { +- case set_default: ++ case defconfig: + if (!defconfig_file) + defconfig_file = conf_get_default_confname(); + if (conf_read(defconfig_file)) { +@@ -522,31 +619,46 @@ + exit(1); + } + break; +- case ask_silent: +- case ask_all: +- case ask_new: ++ case savedefconfig: ++ case silentoldconfig: ++ case oldaskconfig: ++ case oldconfig: ++ case listnewconfig: ++ case olddefconfig: + conf_read(NULL); + break; +- case set_no: +- case set_mod: +- case set_yes: +- case set_random: ++ case allnoconfig: ++ case allyesconfig: ++ case allmodconfig: ++ case alldefconfig: ++ case randconfig: + name = getenv("KCONFIG_ALLCONFIG"); +- if (name && !stat(name, &tmpstat)) { +- conf_read_simple(name, S_DEF_USER); ++ if (!name) ++ break; ++ if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) { ++ if (conf_read_simple(name, S_DEF_USER)) { ++ fprintf(stderr, ++ _("*** Can't read seed configuration \"%s\"!\n"), ++ name); ++ exit(1); ++ } + break; + } + switch (input_mode) { +- case set_no: name = "allno.config"; break; +- case set_mod: name = "allmod.config"; break; +- case set_yes: name = "allyes.config"; break; +- case set_random: name = "allrandom.config"; break; ++ case allnoconfig: name = "allno.config"; break; ++ case allyesconfig: name = "allyes.config"; break; ++ case allmodconfig: name = "allmod.config"; break; ++ case alldefconfig: name = "alldef.config"; break; ++ case randconfig: name = "allrandom.config"; break; + default: break; + } +- if (!stat(name, &tmpstat)) +- conf_read_simple(name, S_DEF_USER); +- else if (!stat("all.config", &tmpstat)) +- conf_read_simple("all.config", S_DEF_USER); ++ if (conf_read_simple(name, S_DEF_USER) && ++ conf_read_simple("all.config", S_DEF_USER)) { ++ fprintf(stderr, ++ _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"), ++ name); ++ exit(1); ++ } + break; + default: + break; +@@ -557,41 +669,51 @@ + name = getenv("KCONFIG_NOSILENTUPDATE"); + if (name && *name) { + fprintf(stderr, +- _("\n*** configuration requires explicit update.\n\n")); ++ _("\n*** The configuration requires explicit update.\n\n")); + return 1; + } + } +- valid_stdin = isatty(0) && isatty(1) && isatty(2); ++ valid_stdin = tty_stdio; + } + + switch (input_mode) { +- case set_no: ++ case allnoconfig: + conf_set_all_new_symbols(def_no); + break; +- case set_yes: ++ case allyesconfig: + conf_set_all_new_symbols(def_yes); + break; +- case set_mod: ++ case allmodconfig: + conf_set_all_new_symbols(def_mod); + break; +- case set_random: +- conf_set_all_new_symbols(def_random); ++ case alldefconfig: ++ conf_set_all_new_symbols(def_default); ++ break; ++ case randconfig: ++ /* Really nothing to do in this loop */ ++ while (conf_set_all_new_symbols(def_random)) ; + break; +- case set_default: ++ case defconfig: + conf_set_all_new_symbols(def_default); + break; +- case ask_new: +- case ask_all: ++ case savedefconfig: ++ break; ++ case oldaskconfig: + rootEntry = &rootmenu; + conf(&rootmenu); +- input_mode = ask_silent; ++ input_mode = silentoldconfig; + /* fall through */ +- case ask_silent: ++ case oldconfig: ++ case listnewconfig: ++ case olddefconfig: ++ case silentoldconfig: + /* Update until a loop caused no more changes */ + do { + conf_cnt = 0; + check_conf(&rootmenu); +- } while (conf_cnt); ++ } while (conf_cnt && ++ (input_mode != listnewconfig && ++ input_mode != olddefconfig)); + break; + } + +@@ -607,7 +729,13 @@ + fprintf(stderr, _("\n*** Error during update of the configuration.\n\n")); + return 1; + } +- } else { ++ } else if (input_mode == savedefconfig) { ++ if (conf_write_defconfig(defconfig_file)) { ++ fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"), ++ defconfig_file); ++ return 1; ++ } ++ } else if (input_mode != listnewconfig) { + if (conf_write(NULL)) { + fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n")); + exit(1); +@@ -615,3 +743,12 @@ + } + return 0; + } ++ ++/* ++ * Helper function to facilitate fgets() by Jean Sacren. ++ */ ++void xfgets(char *str, int size, FILE *in) ++{ ++ if (fgets(str, size, in) == NULL) ++ fprintf(stderr, "\nError in reading or end of file.\n"); ++} +diff -Nur uClibc-0.9.33.2/extra/config/confdata.c uClibc-git/extra/config/confdata.c +--- uClibc-0.9.33.2/extra/config/confdata.c 2012-05-15 09:20:09.000000000 +0200 ++++ uClibc-git/extra/config/confdata.c 2014-02-03 12:32:56.000000000 +0100 +@@ -5,24 +5,27 @@ + + #include <sys/stat.h> + #include <ctype.h> ++#include <errno.h> + #include <fcntl.h> ++#include <stdarg.h> + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include <time.h> + #include <unistd.h> +-#include <libgen.h> + +-#define LKC_DIRECT_LINK + #include "lkc.h" + + static void conf_warning(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + ++static void conf_message(const char *fmt, ...) ++ __attribute__ ((format (printf, 1, 2))); ++ + static const char *conf_filename; + static int conf_lineno, conf_warnings, conf_unsaved; + +-const char conf_defname[] = "extra/Configs/defconfigs/$ARCH"; ++const char conf_defname[] = "arch/$ARCH/defconfig"; + + static void conf_warning(const char *fmt, ...) + { +@@ -35,6 +38,29 @@ + conf_warnings++; + } + ++static void conf_default_message_callback(const char *fmt, va_list ap) ++{ ++ printf("#\n# "); ++ vprintf(fmt, ap); ++ printf("\n#\n"); ++} ++ ++static void (*conf_message_callback) (const char *fmt, va_list ap) = ++ conf_default_message_callback; ++void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap)) ++{ ++ conf_message_callback = fn; ++} ++ ++static void conf_message(const char *fmt, ...) ++{ ++ va_list ap; ++ ++ va_start(ap, fmt); ++ if (conf_message_callback) ++ conf_message_callback(fmt, ap); ++} ++ + const char *conf_get_configname(void) + { + char *name = getenv("KCONFIG_CONFIG"); +@@ -42,6 +68,13 @@ + return name ? name : ".config"; + } + ++const char *conf_get_autoconfig_name(void) ++{ ++ char *name = getenv("KCONFIG_AUTOCONFIG"); ++ ++ return name ? name : "include/config/auto.conf"; ++} ++ + static char *conf_expand_value(const char *in) + { + struct symbol *sym; +@@ -95,6 +128,7 @@ + sym->flags |= def_flags; + break; + } ++ /* fall through */ + case S_BOOLEAN: + if (p[0] == 'y') { + sym->def[def].tri = yes; +@@ -107,7 +141,7 @@ + break; + } + conf_warning("symbol value '%s' invalid for %s", p, sym->name); +- break; ++ return 1; + case S_OTHER: + if (*p != '"') { + for (p2 = p; *p2 && !isspace(*p2); p2++) +@@ -115,6 +149,7 @@ + sym->type = S_STRING; + goto done; + } ++ /* fall through */ + case S_STRING: + if (*p++ != '"') + break; +@@ -129,6 +164,7 @@ + conf_warning("invalid string found"); + return 1; + } ++ /* fall through */ + case S_INT: + case S_HEX: + done: +@@ -146,10 +182,66 @@ + return 0; + } + ++#define LINE_GROWTH 16 ++static int add_byte(int c, char **lineptr, size_t slen, size_t *n) ++{ ++ char *nline; ++ size_t new_size = slen + 1; ++ if (new_size > *n) { ++ new_size += LINE_GROWTH - 1; ++ new_size *= 2; ++ nline = realloc(*lineptr, new_size); ++ if (!nline) ++ return -1; ++ ++ *lineptr = nline; ++ *n = new_size; ++ } ++ ++ (*lineptr)[slen] = c; ++ ++ return 0; ++} ++ ++static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream) ++{ ++ char *line = *lineptr; ++ size_t slen = 0; ++ ++ for (;;) { ++ int c = getc(stream); ++ ++ switch (c) { ++ case '\n': ++ if (add_byte(c, &line, slen, n) < 0) ++ goto e_out; ++ slen++; ++ /* fall through */ ++ case EOF: ++ if (add_byte('\0', &line, slen, n) < 0) ++ goto e_out; ++ *lineptr = line; ++ if (slen == 0) ++ return -1; ++ return slen; ++ default: ++ if (add_byte(c, &line, slen, n) < 0) ++ goto e_out; ++ slen++; ++ } ++ } ++ ++e_out: ++ line[slen-1] = '\0'; ++ *lineptr = line; ++ return -1; ++} ++ + int conf_read_simple(const char *name, int def) + { + FILE *in = NULL; +- char line[1024]; ++ char *line = NULL; ++ size_t line_asize = 0; + char *p, *p2; + struct symbol *sym; + int i, def_flags; +@@ -164,8 +256,11 @@ + if (in) + goto load; + sym_add_change_count(1); +- if (!sym_defconfig_list) ++ if (!sym_defconfig_list) { ++ if (modules_sym) ++ sym_calc_value(modules_sym); + return 1; ++ } + + for_all_defaults(sym_defconfig_list, prop) { + if (expr_calc_value(prop->visible.expr) == no || +@@ -174,9 +269,8 @@ + name = conf_expand_value(prop->expr->left.sym->name); + in = zconf_fopen(name); + if (in) { +- printf(_("#\n" +- "# using defaults found in %s\n" +- "#\n"), name); ++ conf_message(_("using defaults found in %s"), ++ name); + goto load; + } + } +@@ -202,33 +296,33 @@ + case S_STRING: + if (sym->def[def].val) + free(sym->def[def].val); ++ /* fall through */ + default: + sym->def[def].val = NULL; + sym->def[def].tri = no; + } + } + +- while (fgets(line, sizeof(line), in)) { ++ while (compat_getline(&line, &line_asize, in) != -1) { + conf_lineno++; + sym = NULL; +- switch (line[0]) { +- case '#': +- if (line[1] != ' ') ++ if (line[0] == '#') { ++ if (memcmp(line + 2, CONFIG_, strlen(CONFIG_))) + continue; +- p = strchr(line + 2, ' '); ++ p = strchr(line + 2 + strlen(CONFIG_), ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + if (def == S_DEF_USER) { +- sym = sym_find(line + 2); ++ sym = sym_find(line + 2 + strlen(CONFIG_)); + if (!sym) { + sym_add_change_count(1); +- break; ++ goto setsym; + } + } else { +- sym = sym_lookup(line + 2, 0); ++ sym = sym_lookup(line + 2 + strlen(CONFIG_), 0); + if (sym->type == S_UNKNOWN) + sym->type = S_BOOLEAN; + } +@@ -244,13 +338,10 @@ + default: + ; + } +- break; +- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': +- p = strchr(line, '='); +- if (!p) { +- conf_warning("unexpected data '%s'", line); ++ } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) { ++ p = strchr(line + strlen(CONFIG_), '='); ++ if (!p) + continue; +- } + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) { +@@ -259,13 +350,13 @@ + *p2 = 0; + } + if (def == S_DEF_USER) { +- sym = sym_find(line); ++ sym = sym_find(line + strlen(CONFIG_)); + if (!sym) { + sym_add_change_count(1); +- break; ++ goto setsym; + } + } else { +- sym = sym_lookup(line, 0); ++ sym = sym_lookup(line + strlen(CONFIG_), 0); + if (sym->type == S_UNKNOWN) + sym->type = S_OTHER; + } +@@ -274,14 +365,12 @@ + } + if (conf_set_sym_val(sym, def, def_flags, p)) + continue; +- break; +- case '\r': +- case '\n': +- break; +- default: +- conf_warning("unexpected data"); ++ } else { ++ if (line[0] != '\r' && line[0] != '\n') ++ conf_warning("unexpected data"); + continue; + } ++setsym: + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->def[def].tri) { +@@ -302,6 +391,7 @@ + cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri); + } + } ++ free(line); + fclose(in); + + if (modules_sym) +@@ -311,10 +401,8 @@ + + int conf_read(const char *name) + { +- struct symbol *sym, *choice_sym; +- struct property *prop; +- struct expr *e; +- int i, flags; ++ struct symbol *sym; ++ int i; + + sym_set_change_count(0); + +@@ -324,7 +412,7 @@ + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) +- goto sym_ok; ++ continue; + if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { + /* check that calculated value agrees with saved value */ + switch (sym->type) { +@@ -333,29 +421,18 @@ + if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) + break; + if (!sym_is_choice(sym)) +- goto sym_ok; ++ continue; ++ /* fall through */ + default: + if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) +- goto sym_ok; ++ continue; + break; + } + } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) + /* no previous value and not saved */ +- goto sym_ok; ++ continue; + conf_unsaved++; + /* maybe print value in verbose mode... */ +- sym_ok: +- if (!sym_is_choice(sym)) +- continue; +- /* The choice symbol only has a set value (and thus is not new) +- * if all its visible childs have values. +- */ +- prop = sym_get_choice_prop(sym); +- flags = sym->flags; +- expr_list_for_each_sym(prop->expr, e, choice_sym) +- if (choice_sym->visible != no) +- flags &= choice_sym->flags; +- sym->flags &= flags | ~SYMBOL_DEF_USER; + } + + for_all_symbols(i, sym) { +@@ -388,43 +465,300 @@ + return 0; + } + ++/* ++ * Kconfig configuration printer ++ * ++ * This printer is used when generating the resulting configuration after ++ * kconfig invocation and `defconfig' files. Unset symbol might be omitted by ++ * passing a non-NULL argument to the printer. ++ * ++ */ ++static void ++kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg) ++{ ++ ++ switch (sym->type) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ if (*value == 'n') { ++ bool skip_unset = (arg != NULL); ++ ++ if (!skip_unset) ++ fprintf(fp, "# %s%s is not set\n", ++ CONFIG_, sym->name); ++ return; ++ } ++ break; ++ default: ++ break; ++ } ++ ++ fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value); ++} ++ ++static void ++kconfig_print_comment(FILE *fp, const char *value, void *arg) ++{ ++ const char *p = value; ++ size_t l; ++ ++ for (;;) { ++ l = strcspn(p, "\n"); ++ fprintf(fp, "#"); |