xref: /openbmc/linux/scripts/dtc/fstree.c (revision 9fffb55f)
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 
379fffb55fSDavid Gibson 	tree = build_node(NULL, NULL);
389fffb55fSDavid Gibson 
399fffb55fSDavid Gibson 	while ((de = readdir(d)) != NULL) {
409fffb55fSDavid Gibson 		char *tmpnam;
419fffb55fSDavid Gibson 
429fffb55fSDavid Gibson 		if (streq(de->d_name, ".")
439fffb55fSDavid Gibson 		    || streq(de->d_name, ".."))
449fffb55fSDavid Gibson 			continue;
459fffb55fSDavid Gibson 
469fffb55fSDavid Gibson 		tmpnam = join_path(dirname, de->d_name);
479fffb55fSDavid Gibson 
489fffb55fSDavid Gibson 		if (lstat(tmpnam, &st) < 0)
499fffb55fSDavid Gibson 			die("stat(%s): %s\n", tmpnam, strerror(errno));
509fffb55fSDavid Gibson 
519fffb55fSDavid Gibson 		if (S_ISREG(st.st_mode)) {
529fffb55fSDavid Gibson 			struct property *prop;
539fffb55fSDavid Gibson 			FILE *pfile;
549fffb55fSDavid Gibson 
559fffb55fSDavid Gibson 			pfile = fopen(tmpnam, "r");
569fffb55fSDavid Gibson 			if (! pfile) {
579fffb55fSDavid Gibson 				fprintf(stderr,
589fffb55fSDavid Gibson 					"WARNING: Cannot open %s: %s\n",
599fffb55fSDavid Gibson 					tmpnam, strerror(errno));
609fffb55fSDavid Gibson 			} else {
619fffb55fSDavid Gibson 				prop = build_property(strdup(de->d_name),
629fffb55fSDavid Gibson 						      data_copy_file(pfile,
639fffb55fSDavid Gibson 								     st.st_size),
649fffb55fSDavid Gibson 						      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 
719fffb55fSDavid Gibson 			newchild = read_fstree(tmpnam);
729fffb55fSDavid Gibson 			newchild = name_node(newchild, strdup(de->d_name),
739fffb55fSDavid Gibson 					     NULL);
749fffb55fSDavid Gibson 			add_child(tree, newchild);
759fffb55fSDavid Gibson 		}
769fffb55fSDavid Gibson 
779fffb55fSDavid Gibson 		free(tmpnam);
789fffb55fSDavid Gibson 	}
799fffb55fSDavid Gibson 
809fffb55fSDavid Gibson 	return tree;
819fffb55fSDavid Gibson }
829fffb55fSDavid Gibson 
839fffb55fSDavid Gibson struct boot_info *dt_from_fs(const char *dirname)
849fffb55fSDavid Gibson {
859fffb55fSDavid Gibson 	struct node *tree;
869fffb55fSDavid Gibson 
879fffb55fSDavid Gibson 	tree = read_fstree(dirname);
889fffb55fSDavid Gibson 	tree = name_node(tree, "", NULL);
899fffb55fSDavid Gibson 
909fffb55fSDavid Gibson 	return build_boot_info(NULL, tree, 0);
919fffb55fSDavid Gibson }
929fffb55fSDavid Gibson 
93