Home | History | Annotate | Download | only in dtc
      1 /*
      2  * (C) Copyright David Gibson <dwg (at) au1.ibm.com>, IBM Corporation.  2005.
      3  *
      4  *
      5  * This program is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU General Public License as
      7  * published by the Free Software Foundation; either version 2 of the
      8  * License, or (at your option) any later version.
      9  *
     10  *  This program is distributed in the hope that it will be useful,
     11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  *  General Public License for more details.
     14  *
     15  *  You should have received a copy of the GNU General Public License
     16  *  along with this program; if not, write to the Free Software
     17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
     18  *                                                                   USA
     19  */
     20 
     21 #include "dtc.h"
     22 
     23 #include <dirent.h>
     24 #include <sys/stat.h>
     25 
     26 static struct node *read_fstree(const char *dirname)
     27 {
     28 	DIR *d;
     29 	struct dirent *de;
     30 	struct stat st;
     31 	struct node *tree;
     32 
     33 	d = opendir(dirname);
     34 	if (!d)
     35 		die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
     36 
     37 	tree = build_node(NULL, NULL);
     38 
     39 	while ((de = readdir(d)) != NULL) {
     40 		char *tmpname;
     41 
     42 		if (streq(de->d_name, ".")
     43 		    || streq(de->d_name, ".."))
     44 			continue;
     45 
     46 		tmpname = join_path(dirname, de->d_name);
     47 
     48 		if (lstat(tmpname, &st) < 0)
     49 			die("stat(%s): %s\n", tmpname, strerror(errno));
     50 
     51 		if (S_ISREG(st.st_mode)) {
     52 			struct property *prop;
     53 			FILE *pfile;
     54 
     55 			pfile = fopen(tmpname, "rb");
     56 			if (! pfile) {
     57 				fprintf(stderr,
     58 					"WARNING: Cannot open %s: %s\n",
     59 					tmpname, strerror(errno));
     60 			} else {
     61 				prop = build_property(xstrdup(de->d_name),
     62 						      data_copy_file(pfile,
     63 								     st.st_size));
     64 				add_property(tree, prop);
     65 				fclose(pfile);
     66 			}
     67 		} else if (S_ISDIR(st.st_mode)) {
     68 			struct node *newchild;
     69 
     70 			newchild = read_fstree(tmpname);
     71 			newchild = name_node(newchild, xstrdup(de->d_name));
     72 			add_child(tree, newchild);
     73 		}
     74 
     75 		free(tmpname);
     76 	}
     77 
     78 	closedir(d);
     79 	return tree;
     80 }
     81 
     82 struct dt_info *dt_from_fs(const char *dirname)
     83 {
     84 	struct node *tree;
     85 
     86 	tree = read_fstree(dirname);
     87 	tree = name_node(tree, "");
     88 
     89 	return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
     90 }
     91