xref: /openbmc/linux/scripts/dtc/fstree.c (revision c2e7075ca83036317cee4a564729eb82a5433169)
19fffb55fSDavid Gibson /*
29fffb55fSDavid Gibson  * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
39fffb55fSDavid Gibson  *
49fffb55fSDavid Gibson  *
59fffb55fSDavid Gibson  * This program is free software; you can redistribute it and/or
69fffb55fSDavid Gibson  * modify it under the terms of the GNU General Public License as
79fffb55fSDavid Gibson  * published by the Free Software Foundation; either version 2 of the
89fffb55fSDavid Gibson  * License, or (at your option) any later version.
99fffb55fSDavid Gibson  *
109fffb55fSDavid Gibson  *  This program is distributed in the hope that it will be useful,
119fffb55fSDavid Gibson  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
129fffb55fSDavid Gibson  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
139fffb55fSDavid Gibson  *  General Public License for more details.
149fffb55fSDavid Gibson  *
159fffb55fSDavid Gibson  *  You should have received a copy of the GNU General Public License
169fffb55fSDavid Gibson  *  along with this program; if not, write to the Free Software
179fffb55fSDavid Gibson  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
189fffb55fSDavid Gibson  *                                                                   USA
199fffb55fSDavid Gibson  */
209fffb55fSDavid Gibson 
219fffb55fSDavid Gibson #include "dtc.h"
229fffb55fSDavid Gibson 
239fffb55fSDavid Gibson #include <dirent.h>
249fffb55fSDavid Gibson #include <sys/stat.h>
259fffb55fSDavid Gibson 
269fffb55fSDavid Gibson static struct node *read_fstree(const char *dirname)
279fffb55fSDavid Gibson {
289fffb55fSDavid Gibson 	DIR *d;
299fffb55fSDavid Gibson 	struct dirent *de;
309fffb55fSDavid Gibson 	struct stat st;
319fffb55fSDavid Gibson 	struct node *tree;
329fffb55fSDavid Gibson 
339fffb55fSDavid Gibson 	d = opendir(dirname);
349fffb55fSDavid Gibson 	if (!d)
359fffb55fSDavid Gibson 		die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
369fffb55fSDavid Gibson 
37*c2e7075cSRob Herring 	tree = build_node(NULL, NULL, NULL);
389fffb55fSDavid Gibson 
399fffb55fSDavid Gibson 	while ((de = readdir(d)) != NULL) {
4047605971SRob Herring 		char *tmpname;
419fffb55fSDavid Gibson 
429fffb55fSDavid Gibson 		if (streq(de->d_name, ".")
439fffb55fSDavid Gibson 		    || streq(de->d_name, ".."))
449fffb55fSDavid Gibson 			continue;
459fffb55fSDavid Gibson 
4647605971SRob Herring 		tmpname = join_path(dirname, de->d_name);
479fffb55fSDavid Gibson 
4847605971SRob Herring 		if (lstat(tmpname, &st) < 0)
4947605971SRob Herring 			die("stat(%s): %s\n", tmpname, strerror(errno));
509fffb55fSDavid Gibson 
519fffb55fSDavid Gibson 		if (S_ISREG(st.st_mode)) {
529fffb55fSDavid Gibson 			struct property *prop;
539fffb55fSDavid Gibson 			FILE *pfile;
549fffb55fSDavid Gibson 
5547605971SRob Herring 			pfile = fopen(tmpname, "rb");
569fffb55fSDavid Gibson 			if (! pfile) {
579fffb55fSDavid Gibson 				fprintf(stderr,
589fffb55fSDavid Gibson 					"WARNING: Cannot open %s: %s\n",
5947605971SRob Herring 					tmpname, strerror(errno));
609fffb55fSDavid Gibson 			} else {
61658f29a5SJohn Bonesio 				prop = build_property(xstrdup(de->d_name),
629fffb55fSDavid Gibson 						      data_copy_file(pfile,
63*c2e7075cSRob Herring 								     st.st_size),
64*c2e7075cSRob Herring 						      NULL);
659fffb55fSDavid Gibson 				add_property(tree, prop);
669fffb55fSDavid Gibson 				fclose(pfile);
679fffb55fSDavid Gibson 			}
689fffb55fSDavid Gibson 		} else if (S_ISDIR(st.st_mode)) {
699fffb55fSDavid Gibson 			struct node *newchild;
709fffb55fSDavid Gibson 
7147605971SRob Herring 			newchild = read_fstree(tmpname);
72658f29a5SJohn Bonesio 			newchild = name_node(newchild, xstrdup(de->d_name));
739fffb55fSDavid Gibson 			add_child(tree, newchild);
749fffb55fSDavid Gibson 		}
759fffb55fSDavid Gibson 
7647605971SRob Herring 		free(tmpname);
779fffb55fSDavid Gibson 	}
789fffb55fSDavid Gibson 
795e8e1cc0SMartin Ettl 	closedir(d);
809fffb55fSDavid Gibson 	return tree;
819fffb55fSDavid Gibson }
829fffb55fSDavid Gibson 
836f05afcbSRob Herring struct dt_info *dt_from_fs(const char *dirname)
849fffb55fSDavid Gibson {
859fffb55fSDavid Gibson 	struct node *tree;
869fffb55fSDavid Gibson 
879fffb55fSDavid Gibson 	tree = read_fstree(dirname);
88658f29a5SJohn Bonesio 	tree = name_node(tree, "");
899fffb55fSDavid Gibson 
906f05afcbSRob Herring 	return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
919fffb55fSDavid Gibson }
92