diff options
Diffstat (limited to 'scripts/kconfig/conf.c')
| -rw-r--r-- | scripts/kconfig/conf.c | 120 | 
1 files changed, 91 insertions, 29 deletions
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 5459a38be86..fef75fc756f 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -13,12 +13,13 @@  #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 input_mode {  	oldaskconfig, @@ -32,12 +33,11 @@ enum input_mode {  	defconfig,  	savedefconfig,  	listnewconfig, -	oldnoconfig, +	olddefconfig,  } input_mode = oldaskconfig; -char *defconfig_file; -  static int indent = 1; +static int tty_stdio;  static int valid_stdin = 1;  static int sync_kconfig;  static int conf_cnt; @@ -106,9 +106,12 @@ static int conf_askvalue(struct symbol *sym, const char *def)  			return 0;  		}  		check_stdin(); +		/* fall through */  	case oldaskconfig:  		fflush(stdout);  		xfgets(line, 128, stdin); +		if (!tty_stdio) +			printf("\n");  		return 1;  	default:  		break; @@ -150,6 +153,7 @@ static int conf_string(struct menu *menu)  				def = NULL;  				break;  			} +			/* fall through */  		default:  			line[strlen(line)-1] = 0;  			def = line; @@ -304,6 +308,7 @@ static int conf_choice(struct menu *menu)  				break;  			}  			check_stdin(); +			/* fall through */  		case oldaskconfig:  			fflush(stdout);  			xfgets(line, 128, stdin); @@ -332,7 +337,7 @@ static int conf_choice(struct menu *menu)  		}  		if (!child)  			continue; -		if (line[strlen(line) - 1] == '?') { +		if (line[0] && line[strlen(line) - 1] == '?') {  			print_help(child);  			continue;  		} @@ -364,11 +369,12 @@ static void conf(struct menu *menu)  		case P_MENU:  			if ((input_mode == silentoldconfig ||  			     input_mode == listnewconfig || -			     input_mode == oldnoconfig) && +			     input_mode == olddefconfig) &&  			    rootEntry != menu) {  				check_conf(menu);  				return;  			} +			/* fall through */  		case P_COMMENT:  			prompt = menu_get_prompt(menu);  			if (prompt) @@ -427,7 +433,7 @@ static void check_conf(struct menu *menu)  				if (sym->name && !sym_is_choice_value(sym)) {  					printf("%s%s\n", CONFIG_, sym->name);  				} -			} else if (input_mode != oldnoconfig) { +			} else if (input_mode != olddefconfig) {  				if (!conf_cnt++)  					printf(_("*\n* Restart config...\n*\n"));  				rootEntry = menu_get_parent_menu(menu); @@ -452,20 +458,49 @@ static struct option long_opts[] = {  	{"alldefconfig",    no_argument,       NULL, alldefconfig},  	{"randconfig",      no_argument,       NULL, randconfig},  	{"listnewconfig",   no_argument,       NULL, listnewconfig}, -	{"oldnoconfig",     no_argument,       NULL, oldnoconfig}, +	{"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"); +} +  int main(int ac, char **av)  { +	const char *progname = av[0];  	int opt; -	const char *name; +	const char *name, *defconfig_file = NULL /* gcc uninit */;  	struct stat tmpstat;  	setlocale(LC_ALL, "");  	bindtextdomain(PACKAGE, LOCALEDIR);  	textdomain(PACKAGE); +	tty_stdio = isatty(0) && isatty(1) && isatty(2); +  	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {  		input_mode = (enum input_mode)opt;  		switch (opt) { @@ -480,25 +515,45 @@ int main(int ac, char **av)  		{  			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)); + +			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 oldaskconfig: +		case oldconfig: +		case allnoconfig: +		case allyesconfig: +		case allmodconfig: +		case alldefconfig: +		case listnewconfig: +		case olddefconfig: +			break;  		case '?': -			fprintf(stderr, _("See README for usage info\n")); +			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]; @@ -529,13 +584,11 @@ int main(int ac, char **av)  		}  		break;  	case savedefconfig: -		conf_read(NULL); -		break;  	case silentoldconfig:  	case oldaskconfig:  	case oldconfig:  	case listnewconfig: -	case oldnoconfig: +	case olddefconfig:  		conf_read(NULL);  		break;  	case allnoconfig: @@ -544,8 +597,15 @@ int main(int ac, char **av)  	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) { @@ -556,10 +616,13 @@ int main(int ac, char **av)  		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; @@ -574,7 +637,7 @@ int main(int ac, char **av)  				return 1;  			}  		} -		valid_stdin = isatty(0) && isatty(1) && isatty(2); +		valid_stdin = tty_stdio;  	}  	switch (input_mode) { @@ -591,7 +654,8 @@ int main(int ac, char **av)  		conf_set_all_new_symbols(def_default);  		break;  	case randconfig: -		conf_set_all_new_symbols(def_random); +		/* Really nothing to do in this loop */ +		while (conf_set_all_new_symbols(def_random)) ;  		break;  	case defconfig:  		conf_set_all_new_symbols(def_default); @@ -605,7 +669,7 @@ int main(int ac, char **av)  		/* fall through */  	case oldconfig:  	case listnewconfig: -	case oldnoconfig: +	case olddefconfig:  	case silentoldconfig:  		/* Update until a loop caused no more changes */  		do { @@ -613,7 +677,7 @@ int main(int ac, char **av)  			check_conf(&rootmenu);  		} while (conf_cnt &&  			 (input_mode != listnewconfig && -			  input_mode != oldnoconfig)); +			  input_mode != olddefconfig));  		break;  	} @@ -632,7 +696,7 @@ int main(int ac, char **av)  	} else if (input_mode == savedefconfig) {  		if (conf_write_defconfig(defconfig_file)) {  			fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"), -			        defconfig_file); +				defconfig_file);  			return 1;  		}  	} else if (input_mode != listnewconfig) { @@ -643,13 +707,11 @@ int main(int ac, char **av)  	}  	return 0;  } +  /*   * Helper function to facilitate fgets() by Jean Sacren.   */ -void xfgets(str, size, in) -	char *str; -	int size; -	FILE *in; +void xfgets(char *str, int size, FILE *in)  {  	if (fgets(str, size, in) == NULL)  		fprintf(stderr, "\nError in reading or end of file.\n");  | 
