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