confdata.c revision 6840999b192b1b57d713ddee3761c457a2779036
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 <fcntl.h> 9#include <stdio.h> 10#include <stdlib.h> 11#include <string.h> 12#include <time.h> 13#include <unistd.h> 14 15#define LKC_DIRECT_LINK 16#include "lkc.h" 17 18static void conf_warning(const char *fmt, ...) 19 __attribute__ ((format (printf, 1, 2))); 20 21static const char *conf_filename; 22static int conf_lineno, conf_warnings, conf_unsaved; 23 24const char conf_defname[] = "arch/$ARCH/defconfig"; 25 26static void conf_warning(const char *fmt, ...) 27{ 28 va_list ap; 29 va_start(ap, fmt); 30 fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno); 31 vfprintf(stderr, fmt, ap); 32 fprintf(stderr, "\n"); 33 va_end(ap); 34 conf_warnings++; 35} 36 37const char *conf_get_configname(void) 38{ 39 char *name = getenv("KCONFIG_CONFIG"); 40 41 return name ? name : ".config"; 42} 43 44static char *conf_expand_value(const char *in) 45{ 46 struct symbol *sym; 47 const char *src; 48 static char res_value[SYMBOL_MAXLENGTH]; 49 char *dst, name[SYMBOL_MAXLENGTH]; 50 51 res_value[0] = 0; 52 dst = name; 53 while ((src = strchr(in, '$'))) { 54 strncat(res_value, in, src - in); 55 src++; 56 dst = name; 57 while (isalnum(*src) || *src == '_') 58 *dst++ = *src++; 59 *dst = 0; 60 sym = sym_lookup(name, 0); 61 sym_calc_value(sym); 62 strcat(res_value, sym_get_string_value(sym)); 63 in = src; 64 } 65 strcat(res_value, in); 66 67 return res_value; 68} 69 70char *conf_get_default_confname(void) 71{ 72 struct stat buf; 73 static char fullname[PATH_MAX+1]; 74 char *env, *name; 75 76 name = conf_expand_value(conf_defname); 77 env = getenv(SRCTREE); 78 if (env) { 79 sprintf(fullname, "%s/%s", env, name); 80 if (!stat(fullname, &buf)) 81 return fullname; 82 } 83 return name; 84} 85 86static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) 87{ 88 char *p2; 89 90 switch (sym->type) { 91 case S_TRISTATE: 92 if (p[0] == 'm') { 93 sym->def[def].tri = mod; 94 sym->flags |= def_flags; 95 break; 96 } 97 case S_BOOLEAN: 98 if (p[0] == 'y') { 99 sym->def[def].tri = yes; 100 sym->flags |= def_flags; 101 break; 102 } 103 if (p[0] == 'n') { 104 sym->def[def].tri = no; 105 sym->flags |= def_flags; 106 break; 107 } 108 conf_warning("symbol value '%s' invalid for %s", p, sym->name); 109 break; 110 case S_OTHER: 111 if (*p != '"') { 112 for (p2 = p; *p2 && !isspace(*p2); p2++) 113 ; 114 sym->type = S_STRING; 115 goto done; 116 } 117 case S_STRING: 118 if (*p++ != '"') 119 break; 120 for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { 121 if (*p2 == '"') { 122 *p2 = 0; 123 break; 124 } 125 memmove(p2, p2 + 1, strlen(p2)); 126 } 127 if (!p2) { 128 conf_warning("invalid string found"); 129 return 1; 130 } 131 case S_INT: 132 case S_HEX: 133 done: 134 if (sym_string_valid(sym, p)) { 135 sym->def[def].val = strdup(p); 136 sym->flags |= def_flags; 137 } else { 138 conf_warning("symbol value '%s' invalid for %s", p, sym->name); 139 return 1; 140 } 141 break; 142 default: 143 ; 144 } 145 return 0; 146} 147 148int conf_read_simple(const char *name, int def) 149{ 150 FILE *in = NULL; 151 char line[1024]; 152 char *p, *p2; 153 struct symbol *sym; 154 int i, def_flags; 155 156 if (name) { 157 in = zconf_fopen(name); 158 } else { 159 struct property *prop; 160 161 name = conf_get_configname(); 162 in = zconf_fopen(name); 163 if (in) 164 goto load; 165 sym_add_change_count(1); 166 if (!sym_defconfig_list) 167 return 1; 168 169 for_all_defaults(sym_defconfig_list, prop) { 170 if (expr_calc_value(prop->visible.expr) == no || 171 prop->expr->type != E_SYMBOL) 172 continue; 173 name = conf_expand_value(prop->expr->left.sym->name); 174 in = zconf_fopen(name); 175 if (in) { 176 printf(_("#\n" 177 "# using defaults found in %s\n" 178 "#\n"), name); 179 goto load; 180 } 181 } 182 } 183 if (!in) 184 return 1; 185 186load: 187 conf_filename = name; 188 conf_lineno = 0; 189 conf_warnings = 0; 190 conf_unsaved = 0; 191 192 def_flags = SYMBOL_DEF << def; 193 for_all_symbols(i, sym) { 194 sym->flags |= SYMBOL_CHANGED; 195 sym->flags &= ~(def_flags|SYMBOL_VALID); 196 if (sym_is_choice(sym)) 197 sym->flags |= def_flags; 198 switch (sym->type) { 199 case S_INT: 200 case S_HEX: 201 case S_STRING: 202 if (sym->def[def].val) 203 free(sym->def[def].val); 204 default: 205 sym->def[def].val = NULL; 206 sym->def[def].tri = no; 207 } 208 } 209 210 while (fgets(line, sizeof(line), in)) { 211 conf_lineno++; 212 sym = NULL; 213 switch (line[0]) { 214 case '#': 215 if (memcmp(line + 2, "CONFIG_", 7)) 216 continue; 217 p = strchr(line + 9, ' '); 218 if (!p) 219 continue; 220 *p++ = 0; 221 if (strncmp(p, "is not set", 10)) 222 continue; 223 if (def == S_DEF_USER) { 224 sym = sym_find(line + 9); 225 if (!sym) { 226 conf_warning("trying to assign nonexistent symbol %s", line + 9); 227 break; 228 } 229 } else { 230 sym = sym_lookup(line + 9, 0); 231 if (sym->type == S_UNKNOWN) 232 sym->type = S_BOOLEAN; 233 } 234 if (sym->flags & def_flags) { 235 conf_warning("trying to reassign symbol %s", sym->name); 236 break; 237 } 238 switch (sym->type) { 239 case S_BOOLEAN: 240 case S_TRISTATE: 241 sym->def[def].tri = no; 242 sym->flags |= def_flags; 243 break; 244 default: 245 ; 246 } 247 break; 248 case 'C': 249 if (memcmp(line, "CONFIG_", 7)) { 250 conf_warning("unexpected data"); 251 continue; 252 } 253 p = strchr(line + 7, '='); 254 if (!p) 255 continue; 256 *p++ = 0; 257 p2 = strchr(p, '\n'); 258 if (p2) { 259 *p2-- = 0; 260 if (*p2 == '\r') 261 *p2 = 0; 262 } 263 if (def == S_DEF_USER) { 264 sym = sym_find(line + 7); 265 if (!sym) { 266 conf_warning("trying to assign nonexistent symbol %s", line + 7); 267 break; 268 } 269 } else { 270 sym = sym_lookup(line + 7, 0); 271 if (sym->type == S_UNKNOWN) 272 sym->type = S_OTHER; 273 } 274 if (sym->flags & def_flags) { 275 conf_warning("trying to reassign symbol %s", sym->name); 276 break; 277 } 278 if (conf_set_sym_val(sym, def, def_flags, p)) 279 continue; 280 break; 281 case '\r': 282 case '\n': 283 break; 284 default: 285 conf_warning("unexpected data"); 286 continue; 287 } 288 if (sym && sym_is_choice_value(sym)) { 289 struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); 290 switch (sym->def[def].tri) { 291 case no: 292 break; 293 case mod: 294 if (cs->def[def].tri == yes) { 295 conf_warning("%s creates inconsistent choice state", sym->name); 296 cs->flags &= ~def_flags; 297 } 298 break; 299 case yes: 300 if (cs->def[def].tri != no) { 301 conf_warning("%s creates inconsistent choice state", sym->name); 302 cs->flags &= ~def_flags; 303 } else 304 cs->def[def].val = sym; 305 break; 306 } 307 cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri); 308 } 309 } 310 fclose(in); 311 312 if (modules_sym) 313 sym_calc_value(modules_sym); 314 return 0; 315} 316 317int conf_read(const char *name) 318{ 319 struct symbol *sym; 320 struct property *prop; 321 struct expr *e; 322 int i, flags; 323 324 sym_set_change_count(0); 325 326 if (conf_read_simple(name, S_DEF_USER)) 327 return 1; 328 329 for_all_symbols(i, sym) { 330 sym_calc_value(sym); 331 if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) 332 goto sym_ok; 333 if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { 334 /* check that calculated value agrees with saved value */ 335 switch (sym->type) { 336 case S_BOOLEAN: 337 case S_TRISTATE: 338 if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) 339 break; 340 if (!sym_is_choice(sym)) 341 goto sym_ok; 342 default: 343 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) 344 goto sym_ok; 345 break; 346 } 347 } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) 348 /* no previous value and not saved */ 349 goto sym_ok; 350 conf_unsaved++; 351 /* maybe print value in verbose mode... */ 352 sym_ok: 353 if (!sym_is_choice(sym)) 354 continue; 355 /* The choice symbol only has a set value (and thus is not new) 356 * if all its visible childs have values. 357 */ 358 prop = sym_get_choice_prop(sym); 359 flags = sym->flags; 360 for (e = prop->expr; e; e = e->left.expr) 361 if (e->right.sym->visible != no) 362 flags &= e->right.sym->flags; 363 sym->flags &= flags | ~SYMBOL_DEF_USER; 364 } 365 366 for_all_symbols(i, sym) { 367 if (sym_has_value(sym) && !sym_is_choice_value(sym)) { 368 /* Reset values of generates values, so they'll appear 369 * as new, if they should become visible, but that 370 * doesn't quite work if the Kconfig and the saved 371 * configuration disagree. 372 */ 373 if (sym->visible == no && !conf_unsaved) 374 sym->flags &= ~SYMBOL_DEF_USER; 375 switch (sym->type) { 376 case S_STRING: 377 case S_INT: 378 case S_HEX: 379 /* Reset a string value if it's out of range */ 380 if (sym_string_within_range(sym, sym->def[S_DEF_USER].val)) 381 break; 382 sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); 383 conf_unsaved++; 384 break; 385 default: 386 break; 387 } 388 } 389 } 390 391 sym_add_change_count(conf_warnings || conf_unsaved); 392 393 return 0; 394} 395 396int conf_write(const char *name) 397{ 398 FILE *out; 399 struct symbol *sym; 400 struct menu *menu; 401 const char *basename; 402 char dirname[128], tmpname[128], newname[128]; 403 int type, l; 404 const char *str; 405 time_t now; 406 int use_timestamp = 1; 407 char *env; 408 409 dirname[0] = 0; 410 if (name && name[0]) { 411 struct stat st; 412 char *slash; 413 414 if (!stat(name, &st) && S_ISDIR(st.st_mode)) { 415 strcpy(dirname, name); 416 strcat(dirname, "/"); 417 basename = conf_get_configname(); 418 } else if ((slash = strrchr(name, '/'))) { 419 int size = slash - name + 1; 420 memcpy(dirname, name, size); 421 dirname[size] = 0; 422 if (slash[1]) 423 basename = slash + 1; 424 else 425 basename = conf_get_configname(); 426 } else 427 basename = name; 428 } else 429 basename = conf_get_configname(); 430 431 sprintf(newname, "%s%s", dirname, basename); 432 env = getenv("KCONFIG_OVERWRITECONFIG"); 433 if (!env || !*env) { 434 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); 435 out = fopen(tmpname, "w"); 436 } else { 437 *tmpname = 0; 438 out = fopen(newname, "w"); 439 } 440 if (!out) 441 return 1; 442 443 sym = sym_lookup("KERNELVERSION", 0); 444 sym_calc_value(sym); 445 time(&now); 446 env = getenv("KCONFIG_NOTIMESTAMP"); 447 if (env && *env) 448 use_timestamp = 0; 449 450 fprintf(out, _("#\n" 451 "# Automatically generated make config: don't edit\n" 452 "# Linux kernel version: %s\n" 453 "%s%s" 454 "#\n"), 455 sym_get_string_value(sym), 456 use_timestamp ? "# " : "", 457 use_timestamp ? ctime(&now) : ""); 458 459 if (!conf_get_changed()) 460 sym_clear_all_valid(); 461 462 menu = rootmenu.list; 463 while (menu) { 464 sym = menu->sym; 465 if (!sym) { 466 if (!menu_is_visible(menu)) 467 goto next; 468 str = menu_get_prompt(menu); 469 fprintf(out, "\n" 470 "#\n" 471 "# %s\n" 472 "#\n", str); 473 } else if (!(sym->flags & SYMBOL_CHOICE)) { 474 sym_calc_value(sym); 475 if (!(sym->flags & SYMBOL_WRITE)) 476 goto next; 477 sym->flags &= ~SYMBOL_WRITE; 478 type = sym->type; 479 if (type == S_TRISTATE) { 480 sym_calc_value(modules_sym); 481 if (modules_sym->curr.tri == no) 482 type = S_BOOLEAN; 483 } 484 switch (type) { 485 case S_BOOLEAN: 486 case S_TRISTATE: 487 switch (sym_get_tristate_value(sym)) { 488 case no: 489 fprintf(out, "# CONFIG_%s is not set\n", sym->name); 490 break; 491 case mod: 492 fprintf(out, "CONFIG_%s=m\n", sym->name); 493 break; 494 case yes: 495 fprintf(out, "CONFIG_%s=y\n", sym->name); 496 break; 497 } 498 break; 499 case S_STRING: 500 str = sym_get_string_value(sym); 501 fprintf(out, "CONFIG_%s=\"", sym->name); 502 while (1) { 503 l = strcspn(str, "\"\\"); 504 if (l) { 505 fwrite(str, l, 1, out); 506 str += l; 507 } 508 if (!*str) 509 break; 510 fprintf(out, "\\%c", *str++); 511 } 512 fputs("\"\n", out); 513 break; 514 case S_HEX: 515 str = sym_get_string_value(sym); 516 if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { 517 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 518 break; 519 } 520 case S_INT: 521 str = sym_get_string_value(sym); 522 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 523 break; 524 } 525 } 526 527 next: 528 if (menu->list) { 529 menu = menu->list; 530 continue; 531 } 532 if (menu->next) 533 menu = menu->next; 534 else while ((menu = menu->parent)) { 535 if (menu->next) { 536 menu = menu->next; 537 break; 538 } 539 } 540 } 541 fclose(out); 542 543 if (*tmpname) { 544 strcat(dirname, basename); 545 strcat(dirname, ".old"); 546 rename(newname, dirname); 547 if (rename(tmpname, newname)) 548 return 1; 549 } 550 551 printf(_("#\n" 552 "# configuration written to %s\n" 553 "#\n"), newname); 554 555 sym_set_change_count(0); 556 557 return 0; 558} 559 560int conf_split_config(void) 561{ 562 char *name, path[128]; 563 char *s, *d, c; 564 struct symbol *sym; 565 struct stat sb; 566 int res, i, fd; 567 568 name = getenv("KCONFIG_AUTOCONFIG"); 569 if (!name) 570 name = "include/config/auto.conf"; 571 conf_read_simple(name, S_DEF_AUTO); 572 573 if (chdir("include/config")) 574 return 1; 575 576 res = 0; 577 for_all_symbols(i, sym) { 578 sym_calc_value(sym); 579 if ((sym->flags & SYMBOL_AUTO) || !sym->name) 580 continue; 581 if (sym->flags & SYMBOL_WRITE) { 582 if (sym->flags & SYMBOL_DEF_AUTO) { 583 /* 584 * symbol has old and new value, 585 * so compare them... 586 */ 587 switch (sym->type) { 588 case S_BOOLEAN: 589 case S_TRISTATE: 590 if (sym_get_tristate_value(sym) == 591 sym->def[S_DEF_AUTO].tri) 592 continue; 593 break; 594 case S_STRING: 595 case S_HEX: 596 case S_INT: 597 if (!strcmp(sym_get_string_value(sym), 598 sym->def[S_DEF_AUTO].val)) 599 continue; 600 break; 601 default: 602 break; 603 } 604 } else { 605 /* 606 * If there is no old value, only 'no' (unset) 607 * is allowed as new value. 608 */ 609 switch (sym->type) { 610 case S_BOOLEAN: 611 case S_TRISTATE: 612 if (sym_get_tristate_value(sym) == no) 613 continue; 614 break; 615 default: 616 break; 617 } 618 } 619 } else if (!(sym->flags & SYMBOL_DEF_AUTO)) 620 /* There is neither an old nor a new value. */ 621 continue; 622 /* else 623 * There is an old value, but no new value ('no' (unset) 624 * isn't saved in auto.conf, so the old value is always 625 * different from 'no'). 626 */ 627 628 /* Replace all '_' and append ".h" */ 629 s = sym->name; 630 d = path; 631 while ((c = *s++)) { 632 c = tolower(c); 633 *d++ = (c == '_') ? '/' : c; 634 } 635 strcpy(d, ".h"); 636 637 /* Assume directory path already exists. */ 638 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); 639 if (fd == -1) { 640 if (errno != ENOENT) { 641 res = 1; 642 break; 643 } 644 /* 645 * Create directory components, 646 * unless they exist already. 647 */ 648 d = path; 649 while ((d = strchr(d, '/'))) { 650 *d = 0; 651 if (stat(path, &sb) && mkdir(path, 0755)) { 652 res = 1; 653 goto out; 654 } 655 *d++ = '/'; 656 } 657 /* Try it again. */ 658 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); 659 if (fd == -1) { 660 res = 1; 661 break; 662 } 663 } 664 close(fd); 665 } 666out: 667 if (chdir("../..")) 668 return 1; 669 670 return res; 671} 672 673int conf_write_autoconf(void) 674{ 675 struct symbol *sym; 676 const char *str; 677 char *name; 678 FILE *out, *out_h; 679 time_t now; 680 int i, l; 681 682 sym_clear_all_valid(); 683 684 file_write_dep("include/config/auto.conf.cmd"); 685 686 if (conf_split_config()) 687 return 1; 688 689 out = fopen(".tmpconfig", "w"); 690 if (!out) 691 return 1; 692 693 out_h = fopen(".tmpconfig.h", "w"); 694 if (!out_h) { 695 fclose(out); 696 return 1; 697 } 698 699 sym = sym_lookup("KERNELVERSION", 0); 700 sym_calc_value(sym); 701 time(&now); 702 fprintf(out, "#\n" 703 "# Automatically generated make config: don't edit\n" 704 "# Linux kernel version: %s\n" 705 "# %s" 706 "#\n", 707 sym_get_string_value(sym), ctime(&now)); 708 fprintf(out_h, "/*\n" 709 " * Automatically generated C config: don't edit\n" 710 " * Linux kernel version: %s\n" 711 " * %s" 712 " */\n" 713 "#define AUTOCONF_INCLUDED\n", 714 sym_get_string_value(sym), ctime(&now)); 715 716 for_all_symbols(i, sym) { 717 sym_calc_value(sym); 718 if (!(sym->flags & SYMBOL_WRITE) || !sym->name) 719 continue; 720 switch (sym->type) { 721 case S_BOOLEAN: 722 case S_TRISTATE: 723 switch (sym_get_tristate_value(sym)) { 724 case no: 725 break; 726 case mod: 727 fprintf(out, "CONFIG_%s=m\n", sym->name); 728 fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); 729 break; 730 case yes: 731 fprintf(out, "CONFIG_%s=y\n", sym->name); 732 fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); 733 break; 734 } 735 break; 736 case S_STRING: 737 str = sym_get_string_value(sym); 738 fprintf(out, "CONFIG_%s=\"", sym->name); 739 fprintf(out_h, "#define CONFIG_%s \"", sym->name); 740 while (1) { 741 l = strcspn(str, "\"\\"); 742 if (l) { 743 fwrite(str, l, 1, out); 744 fwrite(str, l, 1, out_h); 745 str += l; 746 } 747 if (!*str) 748 break; 749 fprintf(out, "\\%c", *str); 750 fprintf(out_h, "\\%c", *str); 751 str++; 752 } 753 fputs("\"\n", out); 754 fputs("\"\n", out_h); 755 break; 756 case S_HEX: 757 str = sym_get_string_value(sym); 758 if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { 759 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 760 fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); 761 break; 762 } 763 case S_INT: 764 str = sym_get_string_value(sym); 765 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 766 fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); 767 break; 768 default: 769 break; 770 } 771 } 772 fclose(out); 773 fclose(out_h); 774 775 name = getenv("KCONFIG_AUTOHEADER"); 776 if (!name) 777 name = "include/linux/autoconf.h"; 778 if (rename(".tmpconfig.h", name)) 779 return 1; 780 name = getenv("KCONFIG_AUTOCONFIG"); 781 if (!name) 782 name = "include/config/auto.conf"; 783 /* 784 * This must be the last step, kbuild has a dependency on auto.conf 785 * and this marks the successful completion of the previous steps. 786 */ 787 if (rename(".tmpconfig", name)) 788 return 1; 789 790 return 0; 791} 792 793static int sym_change_count; 794static void (*conf_changed_callback)(void); 795 796void sym_set_change_count(int count) 797{ 798 int _sym_change_count = sym_change_count; 799 sym_change_count = count; 800 if (conf_changed_callback && 801 (bool)_sym_change_count != (bool)count) 802 conf_changed_callback(); 803} 804 805void sym_add_change_count(int count) 806{ 807 sym_set_change_count(count + sym_change_count); 808} 809 810bool conf_get_changed(void) 811{ 812 return sym_change_count; 813} 814 815void conf_set_changed_callback(void (*fn)(void)) 816{ 817 conf_changed_callback = fn; 818} 819