linux/scripts/dtc/fstree.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
   4 */
   5
   6#include "dtc.h"
   7
   8#include <dirent.h>
   9#include <sys/stat.h>
  10
  11static struct node *read_fstree(const char *dirname)
  12{
  13        DIR *d;
  14        struct dirent *de;
  15        struct stat st;
  16        struct node *tree;
  17
  18        d = opendir(dirname);
  19        if (!d)
  20                die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
  21
  22        tree = build_node(NULL, NULL, NULL);
  23
  24        while ((de = readdir(d)) != NULL) {
  25                char *tmpname;
  26
  27                if (streq(de->d_name, ".")
  28                    || streq(de->d_name, ".."))
  29                        continue;
  30
  31                tmpname = join_path(dirname, de->d_name);
  32
  33                if (lstat(tmpname, &st) < 0)
  34                        die("stat(%s): %s\n", tmpname, strerror(errno));
  35
  36                if (S_ISREG(st.st_mode)) {
  37                        struct property *prop;
  38                        FILE *pfile;
  39
  40                        pfile = fopen(tmpname, "rb");
  41                        if (! pfile) {
  42                                fprintf(stderr,
  43                                        "WARNING: Cannot open %s: %s\n",
  44                                        tmpname, strerror(errno));
  45                        } else {
  46                                prop = build_property(xstrdup(de->d_name),
  47                                                      data_copy_file(pfile,
  48                                                                     st.st_size),
  49                                                      NULL);
  50                                add_property(tree, prop);
  51                                fclose(pfile);
  52                        }
  53                } else if (S_ISDIR(st.st_mode)) {
  54                        struct node *newchild;
  55
  56                        newchild = read_fstree(tmpname);
  57                        newchild = name_node(newchild, xstrdup(de->d_name));
  58                        add_child(tree, newchild);
  59                }
  60
  61                free(tmpname);
  62        }
  63
  64        closedir(d);
  65        return tree;
  66}
  67
  68struct dt_info *dt_from_fs(const char *dirname)
  69{
  70        struct node *tree;
  71
  72        tree = read_fstree(dirname);
  73        tree = name_node(tree, "");
  74
  75        return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
  76}
  77