diff options
Diffstat (limited to 'scripts/config/confdata.c')
-rw-r--r-- | scripts/config/confdata.c | 140 |
1 files changed, 85 insertions, 55 deletions
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c index 4524d51..c77bef2 100644 --- a/scripts/config/confdata.c +++ b/scripts/config/confdata.c @@ -14,6 +14,8 @@ #define LKC_DIRECT_LINK #include "lkc.h" +#define LOCAL_BUILD_SETTINGS "/.openwrt/defconfig" + static void conf_warning(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); @@ -87,7 +89,7 @@ void conf_reset(void) { struct symbol *sym; int i; - + for_all_symbols(i, sym) { sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; if (sym_is_choice(sym)) @@ -104,55 +106,12 @@ void conf_reset(void) sym->user.tri = no; } } + conf_read_simple(NULL, 0); } -int conf_read_simple(const char *name) -{ - FILE *in = NULL; +int conf_read_file(FILE *in, struct symbol *sym){ char line[1024]; char *p, *p2; - struct symbol *sym; - int i; - - if (name) { - in = zconf_fopen(name); - } else { - const char **names = conf_confnames; - while ((name = *names++)) { - name = conf_expand_value(name); - in = zconf_fopen(name); - if (in) { - printf(_("#\n" - "# using defaults found in %s\n" - "#\n"), name); - break; - } - } - } - if (!in) - return 1; - - conf_filename = name; - conf_lineno = 0; - conf_warnings = 0; - conf_unsaved = 0; - - for_all_symbols(i, sym) { - sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; - if (sym_is_choice(sym)) - sym->flags &= ~SYMBOL_NEW; - sym->flags &= ~SYMBOL_VALID; - switch (sym->type) { - case S_INT: - case S_HEX: - case S_STRING: - if (sym->user.val) - free(sym->user.val); - default: - sym->user.val = NULL; - sym->user.tri = no; - } - } while (fgets(line, sizeof(line), in)) { conf_lineno++; @@ -169,12 +128,12 @@ int conf_read_simple(const char *name) continue; sym = sym_find(line + 9); if (!sym) { - conf_warning("trying to assign nonexistent symbol %s", line + 9); + //conf_warning("trying to assign nonexistent symbol %s", line + 9); break; - } else if (!(sym->flags & SYMBOL_NEW)) { - conf_warning("trying to reassign symbol %s", sym->name); + } /*else if (!(sym->flags & SYMBOL_NEW)) { + //conf_warning("trying to reassign symbol %s", sym->name); break; - } + }*/ switch (sym->type) { case S_BOOLEAN: case S_TRISTATE: @@ -199,12 +158,12 @@ int conf_read_simple(const char *name) *p2 = 0; sym = sym_find(line + 7); if (!sym) { - conf_warning("trying to assign nonexistent symbol %s", line + 7); + //conf_warning("trying to assign nonexistent symbol %s", line + 7); break; - } else if (!(sym->flags & SYMBOL_NEW)) { + } /*else if (!(sym->flags & SYMBOL_NEW)) { conf_warning("trying to reassign symbol %s", sym->name); break; - } + }*/ switch (sym->type) { case S_TRISTATE: if (p[0] == 'm') { @@ -283,9 +242,80 @@ int conf_read_simple(const char *name) } fclose(in); + return 0; +} + +int conf_read_simple(const char *name, int load_config) +{ + FILE *in = NULL; + FILE *defaults = NULL; + struct symbol *sym; + int i; + char *home_dir = getenv("HOME"); + char *default_config_path = NULL; + + if(home_dir){ + default_config_path = malloc(strlen(home_dir) + sizeof(LOCAL_BUILD_SETTINGS) + 1); + sprintf(default_config_path, "%s%s", home_dir, LOCAL_BUILD_SETTINGS); + defaults = zconf_fopen(default_config_path); + if(defaults) + printf("# using buildsystem predefines from %s\n", default_config_path); + free(default_config_path); + } + + if(load_config){ + if (name) { + in = zconf_fopen(name); + } else { + const char **names = conf_confnames; + while ((name = *names++)) { + name = conf_expand_value(name); + in = zconf_fopen(name); + if (in) { + printf(_("#\n" + "# using defaults found in %s\n" + "#\n"), name); + break; + } + } + } + } + + if (!in && !defaults) + return 1; + + conf_filename = name; + conf_lineno = 0; + conf_warnings = 0; + conf_unsaved = 0; + + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; + if (sym_is_choice(sym)) + sym->flags &= ~SYMBOL_NEW; + sym->flags &= ~SYMBOL_VALID; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->user.val) + free(sym->user.val); + default: + sym->user.val = NULL; + sym->user.tri = no; + } + } + + if(defaults) + conf_read_file(defaults, sym); + + if(in) + conf_read_file(in, sym); + if (modules_sym) sym_calc_value(modules_sym); - return 0; + + return 0; } int conf_read(const char *name) @@ -295,7 +325,7 @@ int conf_read(const char *name) struct expr *e; int i; - if (conf_read_simple(name)) + if (conf_read_simple(name, 1)) return 1; for_all_symbols(i, sym) { |