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