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