kconfig: split out code touching a file to conf_touch_dep()
[carl9170fw.git] / config / confdata.c
index 7ba857cad240383e2e85fc8f9bb4771171682af1..c0a4e51df3f56857c5f77c4027d55aed0a5ab822 100644 (file)
@@ -74,6 +74,47 @@ static int make_parent_dir(const char *path)
        return 0;
 }
 
+static char depfile_path[PATH_MAX];
+static size_t depfile_prefix_len;
+
+/* touch depfile for symbol 'name' */
+static int conf_touch_dep(const char *name)
+{
+       int fd, ret;
+       const char *s;
+       char *d, c;
+
+       /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */
+       if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path))
+               return -1;
+
+       d = depfile_path + depfile_prefix_len;
+       s = name;
+
+       while ((c = *s++))
+               *d++ = (c == '_') ? '/' : tolower(c);
+       strcpy(d, ".h");
+
+       /* Assume directory path already exists. */
+       fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+       if (fd == -1) {
+               if (errno != ENOENT)
+                       return -1;
+
+               ret = make_parent_dir(depfile_path);
+               if (ret)
+                       return ret;
+
+               /* Try it again. */
+               fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+               if (fd == -1)
+                       return -1;
+       }
+       close(fd);
+
+       return 0;
+}
+
 struct conf_printer {
        void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
        void (*print_comment)(FILE *, const char *, void *);
@@ -955,21 +996,16 @@ static int conf_write_dep(const char *name)
 static int conf_touch_deps(void)
 {
        const char *name;
-       char path[PATH_MAX+1];
-       char *s, *d, c;
        struct symbol *sym;
-       int res, i, fd;
+       int res, i;
+
+       strcpy(depfile_path, "include/generated/");
+       depfile_prefix_len = strlen(depfile_path);
 
        name = conf_get_autoconfig_name();
        conf_read_simple(name, S_DEF_AUTO);
        sym_calc_value(modules_sym);
 
-       if (make_parent_dir("include/generated/foo.h"))
-               return 1;
-       if (chdir("include/generated"))
-               return 1;
-
-       res = 0;
        for_all_symbols(i, sym) {
                sym_calc_value(sym);
                if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
@@ -1021,42 +1057,12 @@ static int conf_touch_deps(void)
                 *      different from 'no').
                 */
 
-               /* Replace all '_' and append ".h" */
-               s = sym->name;
-               d = path;
-               while ((c = *s++)) {
-                       c = tolower(c);
-                       *d++ = (c == '_') ? '/' : c;
-               }
-               strcpy(d, ".h");
-
-               /* Assume directory path already exists. */
-               fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-               if (fd == -1) {
-                       if (errno != ENOENT) {
-                               res = 1;
-                               break;
-                       }
-
-                       if (make_parent_dir(path)) {
-                               res = 1;
-                               goto out;
-                       }
-
-                       /* Try it again. */
-                       fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-                       if (fd == -1) {
-                               res = 1;
-                               break;
-                       }
-               }
-               close(fd);
+               res = conf_touch_dep(sym->name);
+               if (res)
+                       return res;
        }
-out:
-       if (chdir("../.."))
-               return 1;
 
-       return res;
+       return 0;
 }
 
 int conf_write_autoconf(void)