Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 090b710e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6:
  kconfig: Fix warning: ignoring return value of 'fgets'
  kconfig: Fix warning: ignoring return value of 'fwrite'
  nconfig: Fix segfault when menu is empty
  kconfig: fix tristate choice with minimal config
  kconfig: fix savedefconfig for tristate choices
parents 10041d2d 4418a2b9
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
		check_stdin();
	case oldaskconfig:
		fflush(stdout);
		fgets(line, 128, stdin);
		xfgets(line, 128, stdin);
		return 1;
	default:
		break;
@@ -306,7 +306,7 @@ static int conf_choice(struct menu *menu)
			check_stdin();
		case oldaskconfig:
			fflush(stdout);
			fgets(line, 128, stdin);
			xfgets(line, 128, stdin);
			strip(line);
			if (line[0] == '?') {
				print_help(menu);
@@ -644,3 +644,14 @@ 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;
{
	if (fgets(str, size, in) == NULL)
		fprintf(stderr, "\nError in reading or end of file.\n");
}
+71 −40
Original line number Diff line number Diff line
@@ -412,7 +412,7 @@ static void conf_write_string(bool headerfile, const char *name,
	while (1) {
		l = strcspn(str, "\"\\");
		if (l) {
			fwrite(str, l, 1, out);
			xfwrite(str, l, 1, out);
			str += l;
		}
		if (!*str)
@@ -497,7 +497,7 @@ int conf_write_defconfig(const char *filename)
			/*
			 * If symbol is a choice value and equals to the
			 * default for a choice - skip.
			 * But only if value equal to "y".
			 * But only if value is bool and equal to "y" .
			 */
			if (sym_is_choice_value(sym)) {
				struct symbol *cs;
@@ -506,8 +506,7 @@ int conf_write_defconfig(const char *filename)
				cs = prop_get_symbol(sym_get_choice_prop(sym));
				ds = sym_choice_default(cs);
				if (sym == ds) {
					if ((sym->type == S_BOOLEAN ||
					sym->type == S_TRISTATE) &&
					if ((sym->type == S_BOOLEAN) &&
					    sym_get_tristate_value(sym) == yes)
						goto next_menu;
				}
@@ -919,13 +918,73 @@ void conf_set_changed_callback(void (*fn)(void))
	conf_changed_callback = fn;
}

static void randomize_choice_values(struct symbol *csym)
{
	struct property *prop;
	struct symbol *sym;
	struct expr *e;
	int cnt, def;

void conf_set_all_new_symbols(enum conf_def_mode mode)
	/*
	 * If choice is mod then we may have more items slected
	 * and if no then no-one.
	 * In both cases stop.
	 */
	if (csym->curr.tri != yes)
		return;

	prop = sym_get_choice_prop(csym);

	/* count entries in choice block */
	cnt = 0;
	expr_list_for_each_sym(prop->expr, e, sym)
		cnt++;

	/*
	 * find a random value and set it to yes,
	 * set the rest to no so we have only one set
	 */
	def = (rand() % cnt);

	cnt = 0;
	expr_list_for_each_sym(prop->expr, e, sym) {
		if (def == cnt++) {
			sym->def[S_DEF_USER].tri = yes;
			csym->def[S_DEF_USER].val = sym;
		}
		else {
			sym->def[S_DEF_USER].tri = no;
		}
	}
	csym->flags |= SYMBOL_DEF_USER;
	/* clear VALID to get value calculated */
	csym->flags &= ~(SYMBOL_VALID);
}

static void set_all_choice_values(struct symbol *csym)
{
	struct symbol *sym, *csym;
	struct property *prop;
	struct symbol *sym;
	struct expr *e;
	int i, cnt, def;

	prop = sym_get_choice_prop(csym);

	/*
	 * Set all non-assinged choice values to no
	 */
	expr_list_for_each_sym(prop->expr, e, sym) {
		if (!sym_has_value(sym))
			sym->def[S_DEF_USER].tri = no;
	}
	csym->flags |= SYMBOL_DEF_USER;
	/* clear VALID to get value calculated */
	csym->flags &= ~(SYMBOL_VALID);
}

void conf_set_all_new_symbols(enum conf_def_mode mode)
{
	struct symbol *sym, *csym;
	int i, cnt;

	for_all_symbols(i, sym) {
		if (sym_has_value(sym))
@@ -961,8 +1020,6 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)

	sym_clear_all_valid();

	if (mode != def_random)
		return;
	/*
	 * We have different type of choice blocks.
	 * If curr.tri equal to mod then we can select several
@@ -977,35 +1034,9 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
			continue;

		sym_calc_value(csym);

		if (csym->curr.tri != yes)
			continue;

		prop = sym_get_choice_prop(csym);

		/* count entries in choice block */
		cnt = 0;
		expr_list_for_each_sym(prop->expr, e, sym)
			cnt++;

		/*
		 * find a random value and set it to yes,
		 * set the rest to no so we have only one set
		 */
		def = (rand() % cnt);

		cnt = 0;
		expr_list_for_each_sym(prop->expr, e, sym) {
			if (def == cnt++) {
				sym->def[S_DEF_USER].tri = yes;
				csym->def[S_DEF_USER].val = sym;
			}
			else {
				sym->def[S_DEF_USER].tri = no;
			}
		}
		csym->flags |= SYMBOL_DEF_USER;
		/* clear VALID to get value calculated */
		csym->flags &= ~(SYMBOL_VALID);
		if (mode == def_random)
			randomize_choice_values(csym);
		else
			set_all_choice_values(csym);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -1087,7 +1087,7 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *

static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
{
	fwrite(str, strlen(str), 1, data);
	xfwrite(str, strlen(str), 1, data);
}

void expr_fprint(struct expr *e, FILE *out)
+10 −0
Original line number Diff line number Diff line
@@ -72,6 +72,9 @@ void zconf_nextfile(const char *name);
int zconf_lineno(void);
char *zconf_curname(void);

/* conf.c */
void xfgets(char *str, int size, FILE *in);

/* confdata.c */
const char *conf_get_configname(void);
const char *conf_get_autoconfig_name(void);
@@ -80,6 +83,13 @@ void sym_set_change_count(int count);
void sym_add_change_count(int count);
void conf_set_all_new_symbols(enum conf_def_mode mode);

/* confdata.c and expr.c */
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
{
	if (fwrite(str, len, count, out) < count)
		fprintf(stderr, "\nError in writing or end of file.\n");
}

/* kconfig_load.c */
void kconfig_load(void);

+2 −0
Original line number Diff line number Diff line
@@ -676,6 +676,8 @@ static void *item_data(void)
	struct mitem *mcur;

	cur = current_item(curses_menu);
	if (!cur)
		return NULL;
	mcur = (struct mitem *) item_userptr(cur);
	return mcur->usrptr;