Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
0004  */
0005 
0006 #include "dtc.h"
0007 
0008 #include <dirent.h>
0009 #include <sys/stat.h>
0010 
0011 static struct node *read_fstree(const char *dirname)
0012 {
0013     DIR *d;
0014     struct dirent *de;
0015     struct stat st;
0016     struct node *tree;
0017 
0018     d = opendir(dirname);
0019     if (!d)
0020         die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
0021 
0022     tree = build_node(NULL, NULL, NULL);
0023 
0024     while ((de = readdir(d)) != NULL) {
0025         char *tmpname;
0026 
0027         if (streq(de->d_name, ".")
0028             || streq(de->d_name, ".."))
0029             continue;
0030 
0031         tmpname = join_path(dirname, de->d_name);
0032 
0033         if (stat(tmpname, &st) < 0)
0034             die("stat(%s): %s\n", tmpname, strerror(errno));
0035 
0036         if (S_ISREG(st.st_mode)) {
0037             struct property *prop;
0038             FILE *pfile;
0039 
0040             pfile = fopen(tmpname, "rb");
0041             if (! pfile) {
0042                 fprintf(stderr,
0043                     "WARNING: Cannot open %s: %s\n",
0044                     tmpname, strerror(errno));
0045             } else {
0046                 prop = build_property(xstrdup(de->d_name),
0047                               data_copy_file(pfile,
0048                                      st.st_size),
0049                               NULL);
0050                 add_property(tree, prop);
0051                 fclose(pfile);
0052             }
0053         } else if (S_ISDIR(st.st_mode)) {
0054             struct node *newchild;
0055 
0056             newchild = read_fstree(tmpname);
0057             newchild = name_node(newchild, xstrdup(de->d_name));
0058             add_child(tree, newchild);
0059         }
0060 
0061         free(tmpname);
0062     }
0063 
0064     closedir(d);
0065     return tree;
0066 }
0067 
0068 struct dt_info *dt_from_fs(const char *dirname)
0069 {
0070     struct node *tree;
0071 
0072     tree = read_fstree(dirname);
0073     tree = name_node(tree, "");
0074 
0075     return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
0076 }