xref: /aosp_15_r20/external/dtc/fstree.c (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
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