OSDN Git Service

kconfig: refactor conf_write_autoconf()
authorMasahiro Yamada <masahiroy@kernel.org>
Fri, 1 Oct 2021 05:32:50 +0000 (14:32 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Mon, 11 Oct 2021 14:13:23 +0000 (23:13 +0900)
This function does similar for auto.conf and autoconf.h

Create __conf_write_autoconf() helper to factor out the common code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/kconfig/confdata.c

index acf3d5a..7301f4b 100644 (file)
@@ -1058,13 +1058,53 @@ static int conf_touch_deps(void)
        return 0;
 }
 
+static int __conf_write_autoconf(const char *filename,
+                                void (*print_symbol)(FILE *, struct symbol *),
+                                const struct comment_style *comment_style)
+{
+       char tmp[PATH_MAX];
+       FILE *file;
+       struct symbol *sym;
+       int ret, i;
+
+       if (make_parent_dir(filename))
+               return -1;
+
+       ret = snprintf(tmp, sizeof(tmp), "%s.tmp", filename);
+       if (ret >= sizeof(tmp)) /* check truncation */
+               return -1;
+
+       file = fopen(tmp, "w");
+       if (!file) {
+               perror("fopen");
+               return -1;
+       }
+
+       conf_write_heading(file, comment_style);
+
+       for_all_symbols(i, sym)
+               if ((sym->flags & SYMBOL_WRITE) && sym->name)
+                       print_symbol(file, sym);
+
+       /* check possible errors in conf_write_heading() and print_symbol() */
+       if (ferror(file))
+               return -1;
+
+       fclose(file);
+
+       if (rename(tmp, filename)) {
+               perror("rename");
+               return -1;
+       }
+
+       return 0;
+}
+
 int conf_write_autoconf(int overwrite)
 {
        struct symbol *sym;
-       const char *name;
        const char *autoconf_name = conf_get_autoconfig_name();
-       FILE *out, *out_h;
-       int i;
+       int ret, i;
 
        if (!overwrite && is_present(autoconf_name))
                return 0;
@@ -1074,45 +1114,25 @@ int conf_write_autoconf(int overwrite)
        if (conf_touch_deps())
                return 1;
 
-       out = fopen(".tmpconfig", "w");
-       if (!out)
-               return 1;
-
-       out_h = fopen(".tmpconfig.h", "w");
-       if (!out_h) {
-               fclose(out);
-               return 1;
-       }
-
-       conf_write_heading(out, &comment_style_pound);
-       conf_write_heading(out_h, &comment_style_c);
-
-       for_all_symbols(i, sym) {
+       for_all_symbols(i, sym)
                sym_calc_value(sym);
-               if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
-                       continue;
 
-               /* write symbols to auto.conf and autoconf.h */
-               print_symbol_for_autoconf(out, sym);
-               print_symbol_for_c(out_h, sym);
-       }
-       fclose(out);
-       fclose(out_h);
-
-       name = conf_get_autoheader_name();
-       if (make_parent_dir(name))
-               return 1;
-       if (rename(".tmpconfig.h", name))
-               return 1;
+       ret = __conf_write_autoconf(conf_get_autoheader_name(),
+                                   print_symbol_for_c,
+                                   &comment_style_c);
+       if (ret)
+               return ret;
 
-       if (make_parent_dir(autoconf_name))
-               return 1;
        /*
-        * This must be the last step, kbuild has a dependency on auto.conf
-        * and this marks the successful completion of the previous steps.
+        * Create include/config/auto.conf. This must be the last step because
+        * Kbuild has a dependency on auto.conf and this marks the successful
+        * completion of the previous steps.
         */
-       if (rename(".tmpconfig", autoconf_name))
-               return 1;
+       ret = __conf_write_autoconf(conf_get_autoconfig_name(),
+                                   print_symbol_for_autoconf,
+                                   &comment_style_pound);
+       if (ret)
+               return ret;
 
        return 0;
 }