linux/scripts/kconfig/confdata.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
   3 * Released under the terms of the GNU GPL v2.0.
   4 */
   5
   6#include <sys/stat.h>
   7#include <ctype.h>
   8#include <errno.h>
   9#include <fcntl.h>
  10#include <stdarg.h>
  11#include <stdio.h>
  12#include <stdlib.h>
  13#include <string.h>
  14#include <time.h>
  15#include <unistd.h>
  16
  17#include "lkc.h"
  18
  19static void conf_warning(const char *fmt, ...)
  20        __attribute__ ((format (printf, 1, 2)));
  21
  22static void conf_message(const char *fmt, ...)
  23        __attribute__ ((format (printf, 1, 2)));
  24
  25static const char *conf_filename;
  26static int conf_lineno, conf_warnings, conf_unsaved;
  27
  28const char conf_defname[] = "arch/$ARCH/defconfig";
  29
  30static void conf_warning(const char *fmt, ...)
  31{
  32        va_list ap;
  33        va_start(ap, fmt);
  34        fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
  35        vfprintf(stderr, fmt, ap);
  36        fprintf(stderr, "\n");
  37        va_end(ap);
  38        conf_warnings++;
  39}
  40
  41static void conf_default_message_callback(const char *fmt, va_list ap)
  42{
  43        printf("#\n# ");
  44        vprintf(fmt, ap);
  45        printf("\n#\n");
  46}
  47
  48static void (*conf_message_callback) (const char *fmt, va_list ap) =
  49        conf_default_message_callback;
  50void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
  51{
  52        conf_message_callback = fn;
  53}
  54
  55static void conf_message(const char *fmt, ...)
  56{
  57        va_list ap;
  58
  59        va_start(ap, fmt);
  60        if (conf_message_callback)
  61                conf_message_callback(fmt, ap);
  62}
  63
  64const char *conf_get_configname(void)
  65{
  66        char *name = getenv("KCONFIG_CONFIG");
  67
  68        return name ? name : ".config";
  69}
  70
  71const char *conf_get_autoconfig_name(void)
  72{
  73        char *name = getenv("KCONFIG_AUTOCONFIG");
  74
  75        return name ? name : "include/config/auto.conf";
  76}
  77
  78static char *conf_expand_value(const char *in)
  79{
  80        struct symbol *sym;
  81        const char *src;
  82        static char res_value[SYMBOL_MAXLENGTH];
  83        char *dst, name[SYMBOL_MAXLENGTH];
  84
  85        res_value[0] = 0;
  86        dst = name;
  87        while ((src = strchr(in, '$'))) {
  88                strncat(res_value, in, src - in);
  89                src++;
  90                dst = name;
  91                while (isalnum(*src) || *src == '_')
  92                        *dst++ = *src++;
  93                *dst = 0;
  94                sym = sym_lookup(name, 0);
  95                sym_calc_value(sym);
  96                strcat(res_value, sym_get_string_value(sym));
  97                in = src;
  98        }
  99        strcat(res_value, in);
 100
 101        return res_value;
 102}
 103
 104char *conf_get_default_confname(void)
 105{
 106        struct stat buf;
 107        static char fullname[PATH_MAX+1];
 108        char *env, *name;
 109
 110        name = conf_expand_value(conf_defname);
 111        env = getenv(SRCTREE);
 112        if (env) {
 113                sprintf(fullname, "%s/%s", env, name);
 114                if (!stat(fullname, &buf))
 115                        return fullname;
 116        }
 117        return name;
 118}
 119
 120static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
 121{
 122        char *p2;
 123
 124        switch (sym->type) {
 125        case S_TRISTATE:
 126                if (p[0] == 'm') {
 127                        sym->def[def].tri = mod;
 128                        sym->flags |= def_flags;
 129                        break;
 130                }
 131                /* fall through */
 132        case S_BOOLEAN:
 133                if (p[0] == 'y') {
 134                        sym->def[def].tri = yes;
 135                        sym->flags |= def_flags;
 136                        break;
 137                }
 138                if (p[0] == 'n') {
 139                        sym->def[def].tri = no;
 140                        sym->flags |= def_flags;
 141                        break;
 142                }
 143                if (def != S_DEF_AUTO)
 144                        conf_warning("symbol value '%s' invalid for %s",
 145                                     p, sym->name);
 146                return 1;
 147        case S_OTHER:
 148                if (*p != '"') {
 149                        for (p2 = p; *p2 && !isspace(*p2); p2++)
 150                                ;
 151                        sym->type = S_STRING;
 152                        goto done;
 153                }
 154                /* fall through */
 155        case S_STRING:
 156                if (*p++ != '"')
 157                        break;
 158                for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
 159                        if (*p2 == '"') {
 160                                *p2 = 0;
 161                                break;
 162                        }
 163                        memmove(p2, p2 + 1, strlen(p2));
 164                }
 165                if (!p2) {
 166                        if (def != S_DEF_AUTO)
 167                                conf_warning("invalid string found");
 168                        return 1;
 169                }
 170                /* fall through */
 171        case S_INT:
 172        case S_HEX:
 173        done:
 174                if (sym_string_valid(sym, p)) {
 175                        sym->def[def].val = strdup(p);
 176                        sym->flags |= def_flags;
 177                } else {
 178                        if (def != S_DEF_AUTO)
 179                                conf_warning("symbol value '%s' invalid for %s",
 180                                             p, sym->name);
 181                        return 1;
 182                }
 183                break;
 184        default:
 185                ;
 186        }
 187        return 0;
 188}
 189
 190#define LINE_GROWTH 16
 191static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
 192{
 193        char *nline;
 194        size_t new_size = slen + 1;
 195        if (new_size > *n) {
 196                new_size += LINE_GROWTH - 1;
 197                new_size *= 2;
 198                nline = realloc(*lineptr, new_size);
 199                if (!nline)
 200                        return -1;
 201
 202                *lineptr = nline;
 203                *n = new_size;
 204        }
 205
 206        (*lineptr)[slen] = c;
 207
 208        return 0;
 209}
 210
 211static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream)
 212{
 213        char *line = *lineptr;
 214        size_t slen = 0;
 215
 216        for (;;) {
 217                int c = getc(stream);
 218
 219                switch (c) {
 220                case '\n':
 221                        if (add_byte(c, &line, slen, n) < 0)
 222                                goto e_out;
 223                        slen++;
 224                        /* fall through */
 225                case EOF:
 226                        if (add_byte('\0', &line, slen, n) < 0)
 227                                goto e_out;
 228                        *lineptr = line;
 229                        if (slen == 0)
 230                                return -1;
 231                        return slen;
 232                default:
 233                        if (add_byte(c, &line, slen, n) < 0)
 234                                goto e_out;
 235                        slen++;
 236                }
 237        }
 238
 239e_out:
 240        line[slen-1] = '\0';
 241        *lineptr = line;
 242        return -1;
 243}
 244
 245int conf_read_simple(const char *name, int def)
 246{
 247        FILE *in = NULL;
 248        char   *line = NULL;
 249        size_t  line_asize = 0;
 250        char *p, *p2;
 251        struct symbol *sym;
 252        int i, def_flags;
 253
 254        if (name) {
 255                in = zconf_fopen(name);
 256        } else {
 257                struct property *prop;
 258
 259                name = conf_get_configname();
 260                in = zconf_fopen(name);
 261                if (in)
 262                        goto load;
 263                sym_add_change_count(1);
 264                if (!sym_defconfig_list) {
 265                        if (modules_sym)
 266                                sym_calc_value(modules_sym);
 267                        return 1;
 268                }
 269
 270                for_all_defaults(sym_defconfig_list, prop) {
 271                        if (expr_calc_value(prop->visible.expr) == no ||
 272                            prop->expr->type != E_SYMBOL)
 273                                continue;
 274                        name = conf_expand_value(prop->expr->left.sym->name);
 275                        in = zconf_fopen(name);
 276                        if (in) {
 277                                conf_message(_("using defaults found in %s"),
 278                                         name);
 279                                goto load;
 280                        }
 281                }
 282        }
 283        if (!in)
 284                return 1;
 285
 286load:
 287        conf_filename = name;
 288        conf_lineno = 0;
 289        conf_warnings = 0;
 290        conf_unsaved = 0;
 291
 292        def_flags = SYMBOL_DEF << def;
 293        for_all_symbols(i, sym) {
 294                sym->flags |= SYMBOL_CHANGED;
 295                sym->flags &= ~(def_flags|SYMBOL_VALID);
 296                if (sym_is_choice(sym))
 297                        sym->flags |= def_flags;
 298                switch (sym->type) {
 299                case S_INT:
 300                case S_HEX:
 301                case S_STRING:
 302                        if (sym->def[def].val)
 303                                free(sym->def[def].val);
 304                        /* fall through */
 305                default:
 306                        sym->def[def].val = NULL;
 307                        sym->def[def].tri = no;
 308                }
 309        }
 310
 311        while (compat_getline(&line, &line_asize, in) != -1) {
 312                conf_lineno++;
 313                sym = NULL;
 314                if (line[0] == '#') {
 315                        if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
 316                                continue;
 317                        p = strchr(line + 2 + strlen(CONFIG_), ' ');
 318                        if (!p)
 319                                continue;
 320                        *p++ = 0;
 321                        if (strncmp(p, "is not set", 10))
 322                                continue;
 323                        if (def == S_DEF_USER) {
 324                                sym = sym_find(line + 2 + strlen(CONFIG_));
 325                                if (!sym) {
 326                                        sym_add_change_count(1);
 327                                        goto setsym;
 328                                }
 329                        } else {
 330                                sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
 331                                if (sym->type == S_UNKNOWN)
 332                                        sym->type = S_BOOLEAN;
 333                        }
 334                        if (sym->flags & def_flags) {
 335                                conf_warning("override: reassigning to symbol %s", sym->name);
 336                        }
 337                        switch (sym->type) {
 338                        case S_BOOLEAN:
 339                        case S_TRISTATE:
 340                                sym->def[def].tri = no;
 341                                sym->flags |= def_flags;
 342                                break;
 343                        default:
 344                                ;
 345                        }
 346                } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
 347                        p = strchr(line + strlen(CONFIG_), '=');
 348                        if (!p)
 349                                continue;
 350                        *p++ = 0;
 351                        p2 = strchr(p, '\n');
 352                        if (p2) {
 353                                *p2-- = 0;
 354                                if (*p2 == '\r')
 355                                        *p2 = 0;
 356                        }
 357                        if (def == S_DEF_USER) {
 358                                sym = sym_find(line + strlen(CONFIG_));
 359                                if (!sym) {
 360                                        sym_add_change_count(1);
 361                                        goto setsym;
 362                                }
 363                        } else {
 364                                sym = sym_lookup(line + strlen(CONFIG_), 0);
 365                                if (sym->type == S_UNKNOWN)
 366                                        sym->type = S_OTHER;
 367                        }
 368                        if (sym->flags & def_flags) {
 369                                conf_warning("override: reassigning to symbol %s", sym->name);
 370                        }
 371                        if (conf_set_sym_val(sym, def, def_flags, p))
 372                                continue;
 373                } else {
 374                        if (line[0] != '\r' && line[0] != '\n')
 375                                conf_warning("unexpected data");
 376                        continue;
 377                }
 378setsym:
 379                if (sym && sym_is_choice_value(sym)) {
 380                        struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
 381                        switch (sym->def[def].tri) {
 382                        case no:
 383                                break;
 384                        case mod:
 385                                if (cs->def[def].tri == yes) {
 386                                        conf_warning("%s creates inconsistent choice state", sym->name);
 387                                        cs->flags &= ~def_flags;
 388                                }
 389                                break;
 390                        case yes:
 391                                if (cs->def[def].tri != no)
 392                                        conf_warning("override: %s changes choice state", sym->name);
 393                                cs->def[def].val = sym;
 394                                break;
 395                        }
 396                        cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
 397                }
 398        }
 399        free(line);
 400        fclose(in);
 401
 402        if (modules_sym)
 403                sym_calc_value(modules_sym);
 404        return 0;
 405}
 406
 407int conf_read(const char *name)
 408{
 409        struct symbol *sym;
 410        int i;
 411
 412        sym_set_change_count(0);
 413
 414        if (conf_read_simple(name, S_DEF_USER))
 415                return 1;
 416
 417        for_all_symbols(i, sym) {
 418                sym_calc_value(sym);
 419                if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
 420                        continue;
 421                if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
 422                        /* check that calculated value agrees with saved value */
 423                        switch (sym->type) {
 424                        case S_BOOLEAN:
 425                        case S_TRISTATE:
 426                                if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
 427                                        break;
 428                                if (!sym_is_choice(sym))
 429                                        continue;
 430                                /* fall through */
 431                        default:
 432                                if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
 433                                        continue;
 434                                break;
 435                        }
 436                } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
 437                        /* no previous value and not saved */
 438                        continue;
 439                conf_unsaved++;
 440                /* maybe print value in verbose mode... */
 441        }
 442
 443        for_all_symbols(i, sym) {
 444                if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
 445                        /* Reset values of generates values, so they'll appear
 446                         * as new, if they should become visible, but that
 447                         * doesn't quite work if the Kconfig and the saved
 448                         * configuration disagree.
 449                         */
 450                        if (sym->visible == no && !conf_unsaved)
 451                                sym->flags &= ~SYMBOL_DEF_USER;
 452                        switch (sym->type) {
 453                        case S_STRING:
 454                        case S_INT:
 455                        case S_HEX:
 456                                /* Reset a string value if it's out of range */
 457                                if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
 458                                        break;
 459                                sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
 460                                conf_unsaved++;
 461                                break;
 462                        default:
 463                                break;
 464                        }
 465                }
 466        }
 467
 468        sym_add_change_count(conf_warnings || conf_unsaved);
 469
 470        return 0;
 471}
 472
 473/*
 474 * Kconfig configuration printer
 475 *
 476 * This printer is used when generating the resulting configuration after
 477 * kconfig invocation and `defconfig' files. Unset symbol might be omitted by
 478 * passing a non-NULL argument to the printer.
 479 *
 480 */
 481static void
 482kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 483{
 484
 485        switch (sym->type) {
 486        case S_BOOLEAN:
 487        case S_TRISTATE:
 488                if (*value == 'n') {
 489                        bool skip_unset = (arg != NULL);
 490
 491                        if (!skip_unset)
 492                                fprintf(fp, "# %s%s is not set\n",
 493                                    CONFIG_, sym->name);
 494                        return;
 495                }
 496                break;
 497        default:
 498                break;
 499        }
 500
 501        fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
 502}
 503
 504static void
 505kconfig_print_comment(FILE *fp, const char *value, void *arg)
 506{
 507        const char *p = value;
 508        size_t l;
 509
 510        for (;;) {
 511                l = strcspn(p, "\n");
 512                fprintf(fp, "#");
 513                if (l) {
 514                        fprintf(fp, " ");
 515                        xfwrite(p, l, 1, fp);
 516                        p += l;
 517                }
 518                fprintf(fp, "\n");
 519                if (*p++ == '\0')
 520                        break;
 521        }
 522}
 523
 524static struct conf_printer kconfig_printer_cb =
 525{
 526        .print_symbol = kconfig_print_symbol,
 527        .print_comment = kconfig_print_comment,
 528};
 529
 530/*
 531 * Header printer
 532 *
 533 * This printer is used when generating the `include/generated/autoconf.h' file.
 534 */
 535static void
 536header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 537{
 538
 539        switch (sym->type) {
 540        case S_BOOLEAN:
 541        case S_TRISTATE: {
 542                const char *suffix = "";
 543
 544                switch (*value) {
 545                case 'n':
 546                        break;
 547                case 'm':
 548                        suffix = "_MODULE";
 549                        /* fall through */
 550                default:
 551                        fprintf(fp, "#define %s%s%s 1\n",
 552                            CONFIG_, sym->name, suffix);
 553                }
 554                break;
 555        }
 556        case S_HEX: {
 557                const char *prefix = "";
 558
 559                if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
 560                        prefix = "0x";
 561                fprintf(fp, "#define %s%s %s%s\n",
 562                    CONFIG_, sym->name, prefix, value);
 563                break;
 564        }
 565        case S_STRING:
 566        case S_INT:
 567                fprintf(fp, "#define %s%s %s\n",
 568                    CONFIG_, sym->name, value);
 569                break;
 570        default:
 571                break;
 572        }
 573
 574}
 575
 576static void
 577header_print_comment(FILE *fp, const char *value, void *arg)
 578{
 579        const char *p = value;
 580        size_t l;
 581
 582        fprintf(fp, "/*\n");
 583        for (;;) {
 584                l = strcspn(p, "\n");
 585                fprintf(fp, " *");
 586                if (l) {
 587                        fprintf(fp, " ");
 588                        xfwrite(p, l, 1, fp);
 589                        p += l;
 590                }
 591                fprintf(fp, "\n");
 592                if (*p++ == '\0')
 593                        break;
 594        }
 595        fprintf(fp, " */\n");
 596}
 597
 598static struct conf_printer header_printer_cb =
 599{
 600        .print_symbol = header_print_symbol,
 601        .print_comment = header_print_comment,
 602};
 603
 604/*
 605 * Tristate printer
 606 *
 607 * This printer is used when generating the `include/config/tristate.conf' file.
 608 */
 609static void
 610tristate_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 611{
 612
 613        if (sym->type == S_TRISTATE && *value != 'n')
 614                fprintf(fp, "%s%s=%c\n", CONFIG_, sym->name, (char)toupper(*value));
 615}
 616
 617static struct conf_printer tristate_printer_cb =
 618{
 619        .print_symbol = tristate_print_symbol,
 620        .print_comment = kconfig_print_comment,
 621};
 622
 623static void conf_write_symbol(FILE *fp, struct symbol *sym,
 624                              struct conf_printer *printer, void *printer_arg)
 625{
 626        const char *str;
 627
 628        switch (sym->type) {
 629        case S_OTHER:
 630        case S_UNKNOWN:
 631                break;
 632        case S_STRING:
 633                str = sym_get_string_value(sym);
 634                str = sym_escape_string_value(str);
 635                printer->print_symbol(fp, sym, str, printer_arg);
 636                free((void *)str);
 637                break;
 638        default:
 639                str = sym_get_string_value(sym);
 640                printer->print_symbol(fp, sym, str, printer_arg);
 641        }
 642}
 643
 644static void
 645conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
 646{
 647        char buf[256];
 648
 649        snprintf(buf, sizeof(buf),
 650            "\n"
 651            "Automatically generated file; DO NOT EDIT.\n"
 652            "%s\n",
 653            rootmenu.prompt->text);
 654
 655        printer->print_comment(fp, buf, printer_arg);
 656}
 657
 658/*
 659 * Write out a minimal config.
 660 * All values that has default values are skipped as this is redundant.
 661 */
 662int conf_write_defconfig(const char *filename)
 663{
 664        struct symbol *sym;
 665        struct menu *menu;
 666        FILE *out;
 667
 668        out = fopen(filename, "w");
 669        if (!out)
 670                return 1;
 671
 672        sym_clear_all_valid();
 673
 674        /* Traverse all menus to find all relevant symbols */
 675        menu = rootmenu.list;
 676
 677        while (menu != NULL)
 678        {
 679                sym = menu->sym;
 680                if (sym == NULL) {
 681                        if (!menu_is_visible(menu))
 682                                goto next_menu;
 683                } else if (!sym_is_choice(sym)) {
 684                        sym_calc_value(sym);
 685                        if (!(sym->flags & SYMBOL_WRITE))
 686                                goto next_menu;
 687                        sym->flags &= ~SYMBOL_WRITE;
 688                        /* If we cannot change the symbol - skip */
 689                        if (!sym_is_changable(sym))
 690                                goto next_menu;
 691                        /* If symbol equals to default value - skip */
 692                        if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
 693                                goto next_menu;
 694
 695                        /*
 696                         * If symbol is a choice value and equals to the
 697                         * default for a choice - skip.
 698                         * But only if value is bool and equal to "y" and
 699                         * choice is not "optional".
 700                         * (If choice is "optional" then all values can be "n")
 701                         */
 702                        if (sym_is_choice_value(sym)) {
 703                                struct symbol *cs;
 704                                struct symbol *ds;
 705
 706                                cs = prop_get_symbol(sym_get_choice_prop(sym));
 707                                ds = sym_choice_default(cs);
 708                                if (!sym_is_optional(cs) && sym == ds) {
 709                                        if ((sym->type == S_BOOLEAN) &&
 710                                            sym_get_tristate_value(sym) == yes)
 711                                                goto next_menu;
 712                                }
 713                        }
 714                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
 715                }
 716next_menu:
 717                if (menu->list != NULL) {
 718                        menu = menu->list;
 719                }
 720                else if (menu->next != NULL) {
 721                        menu = menu->next;
 722                } else {
 723                        while ((menu = menu->parent)) {
 724                                if (menu->next != NULL) {
 725                                        menu = menu->next;
 726                                        break;
 727                                }
 728                        }
 729                }
 730        }
 731        fclose(out);
 732        return 0;
 733}
 734
 735int conf_write(const char *name)
 736{
 737        FILE *out;
 738        struct symbol *sym;
 739        struct menu *menu;
 740        const char *basename;
 741        const char *str;
 742        char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
 743        char *env;
 744
 745        dirname[0] = 0;
 746        if (name && name[0]) {
 747                struct stat st;
 748                char *slash;
 749
 750                if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
 751                        strcpy(dirname, name);
 752                        strcat(dirname, "/");
 753                        basename = conf_get_configname();
 754                } else if ((slash = strrchr(name, '/'))) {
 755                        int size = slash - name + 1;
 756                        memcpy(dirname, name, size);
 757                        dirname[size] = 0;
 758                        if (slash[1])
 759                                basename = slash + 1;
 760                        else
 761                                basename = conf_get_configname();
 762                } else
 763                        basename = name;
 764        } else
 765                basename = conf_get_configname();
 766
 767        sprintf(newname, "%s%s", dirname, basename);
 768        env = getenv("KCONFIG_OVERWRITECONFIG");
 769        if (!env || !*env) {
 770                sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
 771                out = fopen(tmpname, "w");
 772        } else {
 773                *tmpname = 0;
 774                out = fopen(newname, "w");
 775        }
 776        if (!out)
 777                return 1;
 778
 779        conf_write_heading(out, &kconfig_printer_cb, NULL);
 780
 781        if (!conf_get_changed())
 782                sym_clear_all_valid();
 783
 784        menu = rootmenu.list;
 785        while (menu) {
 786                sym = menu->sym;
 787                if (!sym) {
 788                        if (!menu_is_visible(menu))
 789                                goto next;
 790                        str = menu_get_prompt(menu);
 791                        fprintf(out, "\n"
 792                                     "#\n"
 793                                     "# %s\n"
 794                                     "#\n", str);
 795                } else if (!(sym->flags & SYMBOL_CHOICE)) {
 796                        sym_calc_value(sym);
 797                        if (!(sym->flags & SYMBOL_WRITE))
 798                                goto next;
 799                        sym->flags &= ~SYMBOL_WRITE;
 800
 801                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
 802                }
 803
 804next:
 805                if (menu->list) {
 806                        menu = menu->list;
 807                        continue;
 808                }
 809                if (menu->next)
 810                        menu = menu->next;
 811                else while ((menu = menu->parent)) {
 812                        if (menu->next) {
 813                                menu = menu->next;
 814                                break;
 815                        }
 816                }
 817        }
 818        fclose(out);
 819
 820        if (*tmpname) {
 821                strcat(dirname, basename);
 822                strcat(dirname, ".old");
 823                rename(newname, dirname);
 824                if (rename(tmpname, newname))
 825                        return 1;
 826        }
 827
 828        conf_message(_("configuration written to %s"), newname);
 829
 830        sym_set_change_count(0);
 831
 832        return 0;
 833}
 834
 835static int conf_split_config(void)
 836{
 837        const char *name;
 838        char path[PATH_MAX+1];
 839        char *s, *d, c;
 840        struct symbol *sym;
 841        struct stat sb;
 842        int res, i, fd;
 843
 844        name = conf_get_autoconfig_name();
 845        conf_read_simple(name, S_DEF_AUTO);
 846
 847        if (chdir("include/config"))
 848                return 1;
 849
 850        res = 0;
 851        for_all_symbols(i, sym) {
 852                sym_calc_value(sym);
 853                if ((sym->flags & SYMBOL_AUTO) || !sym->name)
 854                        continue;
 855                if (sym->flags & SYMBOL_WRITE) {
 856                        if (sym->flags & SYMBOL_DEF_AUTO) {
 857                                /*
 858                                 * symbol has old and new value,
 859                                 * so compare them...
 860                                 */
 861                                switch (sym->type) {
 862                                case S_BOOLEAN:
 863                                case S_TRISTATE:
 864                                        if (sym_get_tristate_value(sym) ==
 865                                            sym->def[S_DEF_AUTO].tri)
 866                                                continue;
 867                                        break;
 868                                case S_STRING:
 869                                case S_HEX:
 870                                case S_INT:
 871                                        if (!strcmp(sym_get_string_value(sym),
 872                                                    sym->def[S_DEF_AUTO].val))
 873                                                continue;
 874                                        break;
 875                                default:
 876                                        break;
 877                                }
 878                        } else {
 879                                /*
 880                                 * If there is no old value, only 'no' (unset)
 881                                 * is allowed as new value.
 882                                 */
 883                                switch (sym->type) {
 884                                case S_BOOLEAN:
 885                                case S_TRISTATE:
 886                                        if (sym_get_tristate_value(sym) == no)
 887                                                continue;
 888                                        break;
 889                                default:
 890                                        break;
 891                                }
 892                        }
 893                } else if (!(sym->flags & SYMBOL_DEF_AUTO))
 894                        /* There is neither an old nor a new value. */
 895                        continue;
 896                /* else
 897                 *      There is an old value, but no new value ('no' (unset)
 898                 *      isn't saved in auto.conf, so the old value is always
 899                 *      different from 'no').
 900                 */
 901
 902                /* Replace all '_' and append ".h" */
 903                s = sym->name;
 904                d = path;
 905                while ((c = *s++)) {
 906                        c = tolower(c);
 907                        *d++ = (c == '_') ? '/' : c;
 908                }
 909                strcpy(d, ".h");
 910
 911                /* Assume directory path already exists. */
 912                fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 913                if (fd == -1) {
 914                        if (errno != ENOENT) {
 915                                res = 1;
 916                                break;
 917                        }
 918                        /*
 919                         * Create directory components,
 920                         * unless they exist already.
 921                         */
 922                        d = path;
 923                        while ((d = strchr(d, '/'))) {
 924                                *d = 0;
 925                                if (stat(path, &sb) && mkdir(path, 0755)) {
 926                                        res = 1;
 927                                        goto out;
 928                                }
 929                                *d++ = '/';
 930                        }
 931                        /* Try it again. */
 932                        fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 933                        if (fd == -1) {
 934                                res = 1;
 935                                break;
 936                        }
 937                }
 938                close(fd);
 939        }
 940out:
 941        if (chdir("../.."))
 942                return 1;
 943
 944        return res;
 945}
 946
 947int conf_write_autoconf(void)
 948{
 949        struct symbol *sym;
 950        const char *name;
 951        FILE *out, *tristate, *out_h;
 952        int i;
 953
 954        sym_clear_all_valid();
 955
 956        file_write_dep("include/config/auto.conf.cmd");
 957
 958        if (conf_split_config())
 959                return 1;
 960
 961        out = fopen(".tmpconfig", "w");
 962        if (!out)
 963                return 1;
 964
 965        tristate = fopen(".tmpconfig_tristate", "w");
 966        if (!tristate) {
 967                fclose(out);
 968                return 1;
 969        }
 970
 971        out_h = fopen(".tmpconfig.h", "w");
 972        if (!out_h) {
 973                fclose(out);
 974                fclose(tristate);
 975                return 1;
 976        }
 977
 978        conf_write_heading(out, &kconfig_printer_cb, NULL);
 979
 980        conf_write_heading(tristate, &tristate_printer_cb, NULL);
 981
 982        conf_write_heading(out_h, &header_printer_cb, NULL);
 983
 984        for_all_symbols(i, sym) {
 985                sym_calc_value(sym);
 986                if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
 987                        continue;
 988
 989                /* write symbol to auto.conf, tristate and header files */
 990                conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
 991
 992                conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1);
 993
 994                conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
 995        }
 996        fclose(out);
 997        fclose(tristate);
 998        fclose(out_h);
 999
1000        name = getenv("KCONFIG_AUTOHEADER");
1001        if (!name)
1002                name = "include/generated/autoconf.h";
1003        if (rename(".tmpconfig.h", name))
1004                return 1;
1005        name = getenv("KCONFIG_TRISTATE");
1006        if (!name)
1007                name = "include/config/tristate.conf";
1008        if (rename(".tmpconfig_tristate", name))
1009                return 1;
1010        name = conf_get_autoconfig_name();
1011        /*
1012         * This must be the last step, kbuild has a dependency on auto.conf
1013         * and this marks the successful completion of the previous steps.
1014         */
1015        if (rename(".tmpconfig", name))
1016                return 1;
1017
1018        return 0;
1019}
1020
1021static int sym_change_count;
1022static void (*conf_changed_callback)(void);
1023
1024void sym_set_change_count(int count)
1025{
1026        int _sym_change_count = sym_change_count;
1027        sym_change_count = count;
1028        if (conf_changed_callback &&
1029            (bool)_sym_change_count != (bool)count)
1030                conf_changed_callback();
1031}
1032
1033void sym_add_change_count(int count)
1034{
1035        sym_set_change_count(count + sym_change_count);
1036}
1037
1038bool conf_get_changed(void)
1039{
1040        return sym_change_count;
1041}
1042
1043void conf_set_changed_callback(void (*fn)(void))
1044{
1045        conf_changed_callback = fn;
1046}
1047
1048static bool randomize_choice_values(struct symbol *csym)
1049{
1050        struct property *prop;
1051        struct symbol *sym;
1052        struct expr *e;
1053        int cnt, def;
1054
1055        /*
1056         * If choice is mod then we may have more items selected
1057         * and if no then no-one.
1058         * In both cases stop.
1059         */
1060        if (csym->curr.tri != yes)
1061                return false;
1062
1063        prop = sym_get_choice_prop(csym);
1064
1065        /* count entries in choice block */
1066        cnt = 0;
1067        expr_list_for_each_sym(prop->expr, e, sym)
1068                cnt++;
1069
1070        /*
1071         * find a random value and set it to yes,
1072         * set the rest to no so we have only one set
1073         */
1074        def = (rand() % cnt);
1075
1076        cnt = 0;
1077        expr_list_for_each_sym(prop->expr, e, sym) {
1078                if (def == cnt++) {
1079                        sym->def[S_DEF_USER].tri = yes;
1080                        csym->def[S_DEF_USER].val = sym;
1081                }
1082                else {
1083                        sym->def[S_DEF_USER].tri = no;
1084                }
1085                sym->flags |= SYMBOL_DEF_USER;
1086                /* clear VALID to get value calculated */
1087                sym->flags &= ~SYMBOL_VALID;
1088        }
1089        csym->flags |= SYMBOL_DEF_USER;
1090        /* clear VALID to get value calculated */
1091        csym->flags &= ~(SYMBOL_VALID);
1092
1093        return true;
1094}
1095
1096void set_all_choice_values(struct symbol *csym)
1097{
1098        struct property *prop;
1099        struct symbol *sym;
1100        struct expr *e;
1101
1102        prop = sym_get_choice_prop(csym);
1103
1104        /*
1105         * Set all non-assinged choice values to no
1106         */
1107        expr_list_for_each_sym(prop->expr, e, sym) {
1108                if (!sym_has_value(sym))
1109                        sym->def[S_DEF_USER].tri = no;
1110        }
1111        csym->flags |= SYMBOL_DEF_USER;
1112        /* clear VALID to get value calculated */
1113        csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
1114}
1115
1116bool conf_set_all_new_symbols(enum conf_def_mode mode)
1117{
1118        struct symbol *sym, *csym;
1119        int i, cnt, pby, pty, ptm;      /* pby: probability of boolean  = y
1120                                         * pty: probability of tristate = y
1121                                         * ptm: probability of tristate = m
1122                                         */
1123
1124        pby = 50; pty = ptm = 33; /* can't go as the default in switch-case
1125                                   * below, otherwise gcc whines about
1126                                   * -Wmaybe-uninitialized */
1127        if (mode == def_random) {
1128                int n, p[3];
1129                char *env = getenv("KCONFIG_PROBABILITY");
1130                n = 0;
1131                while( env && *env ) {
1132                        char *endp;
1133                        int tmp = strtol( env, &endp, 10 );
1134                        if( tmp >= 0 && tmp <= 100 ) {
1135                                p[n++] = tmp;
1136                        } else {
1137                                errno = ERANGE;
1138                                perror( "KCONFIG_PROBABILITY" );
1139                                exit( 1 );
1140                        }
1141                        env = (*endp == ':') ? endp+1 : endp;
1142                        if( n >=3 ) {
1143                                break;
1144                        }
1145                }
1146                switch( n ) {
1147                case 1:
1148                        pby = p[0]; ptm = pby/2; pty = pby-ptm;
1149                        break;
1150                case 2:
1151                        pty = p[0]; ptm = p[1]; pby = pty + ptm;
1152                        break;
1153                case 3:
1154                        pby = p[0]; pty = p[1]; ptm = p[2];
1155                        break;
1156                }
1157
1158                if( pty+ptm > 100 ) {
1159                        errno = ERANGE;
1160                        perror( "KCONFIG_PROBABILITY" );
1161                        exit( 1 );
1162                }
1163        }
1164        bool has_changed = false;
1165
1166        for_all_symbols(i, sym) {
1167                if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
1168                        continue;
1169                switch (sym_get_type(sym)) {
1170                case S_BOOLEAN:
1171                case S_TRISTATE:
1172                        has_changed = true;
1173                        switch (mode) {
1174                        case def_yes:
1175                                sym->def[S_DEF_USER].tri = yes;
1176                                break;
1177                        case def_mod:
1178                                sym->def[S_DEF_USER].tri = mod;
1179                                break;
1180                        case def_no:
1181                                sym->def[S_DEF_USER].tri = no;
1182                                break;
1183                        case def_random:
1184                                sym->def[S_DEF_USER].tri = no;
1185                                cnt = rand() % 100;
1186                                if (sym->type == S_TRISTATE) {
1187                                        if (cnt < pty)
1188                                                sym->def[S_DEF_USER].tri = yes;
1189                                        else if (cnt < (pty+ptm))
1190                                                sym->def[S_DEF_USER].tri = mod;
1191                                } else if (cnt < pby)
1192                                        sym->def[S_DEF_USER].tri = yes;
1193                                break;
1194                        default:
1195                                continue;
1196                        }
1197                        if (!(sym_is_choice(sym) && mode == def_random))
1198                                sym->flags |= SYMBOL_DEF_USER;
1199                        break;
1200                default:
1201                        break;
1202                }
1203
1204        }
1205
1206        sym_clear_all_valid();
1207
1208        /*
1209         * We have different type of choice blocks.
1210         * If curr.tri equals to mod then we can select several
1211         * choice symbols in one block.
1212         * In this case we do nothing.
1213         * If curr.tri equals yes then only one symbol can be
1214         * selected in a choice block and we set it to yes,
1215         * and the rest to no.
1216         */
1217        if (mode != def_random) {
1218                for_all_symbols(i, csym) {
1219                        if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
1220                            sym_is_choice_value(csym))
1221                                csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
1222                }
1223        }
1224
1225        for_all_symbols(i, csym) {
1226                if (sym_has_value(csym) || !sym_is_choice(csym))
1227                        continue;
1228
1229                sym_calc_value(csym);
1230                if (mode == def_random)
1231                        has_changed = randomize_choice_values(csym);
1232                else {
1233                        set_all_choice_values(csym);
1234                        has_changed = true;
1235                }
1236        }
1237
1238        return has_changed;
1239}
1240