0001
0002
0003
0004
0005
0006 #include "dtc.h"
0007
0008 #include <dirent.h>
0009 #include <sys/stat.h>
0010
0011 static struct node *read_fstree(const char *dirname)
0012 {
0013 DIR *d;
0014 struct dirent *de;
0015 struct stat st;
0016 struct node *tree;
0017
0018 d = opendir(dirname);
0019 if (!d)
0020 die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
0021
0022 tree = build_node(NULL, NULL, NULL);
0023
0024 while ((de = readdir(d)) != NULL) {
0025 char *tmpname;
0026
0027 if (streq(de->d_name, ".")
0028 || streq(de->d_name, ".."))
0029 continue;
0030
0031 tmpname = join_path(dirname, de->d_name);
0032
0033 if (stat(tmpname, &st) < 0)
0034 die("stat(%s): %s\n", tmpname, strerror(errno));
0035
0036 if (S_ISREG(st.st_mode)) {
0037 struct property *prop;
0038 FILE *pfile;
0039
0040 pfile = fopen(tmpname, "rb");
0041 if (! pfile) {
0042 fprintf(stderr,
0043 "WARNING: Cannot open %s: %s\n",
0044 tmpname, strerror(errno));
0045 } else {
0046 prop = build_property(xstrdup(de->d_name),
0047 data_copy_file(pfile,
0048 st.st_size),
0049 NULL);
0050 add_property(tree, prop);
0051 fclose(pfile);
0052 }
0053 } else if (S_ISDIR(st.st_mode)) {
0054 struct node *newchild;
0055
0056 newchild = read_fstree(tmpname);
0057 newchild = name_node(newchild, xstrdup(de->d_name));
0058 add_child(tree, newchild);
0059 }
0060
0061 free(tmpname);
0062 }
0063
0064 closedir(d);
0065 return tree;
0066 }
0067
0068 struct dt_info *dt_from_fs(const char *dirname)
0069 {
0070 struct node *tree;
0071
0072 tree = read_fstree(dirname);
0073 tree = name_node(tree, "");
0074
0075 return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
0076 }