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) { 40*47605971SRob Herring char *tmpname; 419fffb55fSDavid Gibson 429fffb55fSDavid Gibson if (streq(de->d_name, ".") 439fffb55fSDavid Gibson || streq(de->d_name, "..")) 449fffb55fSDavid Gibson continue; 459fffb55fSDavid Gibson 46*47605971SRob Herring tmpname = join_path(dirname, de->d_name); 479fffb55fSDavid Gibson 48*47605971SRob Herring if (lstat(tmpname, &st) < 0) 49*47605971SRob 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 55*47605971SRob Herring pfile = fopen(tmpname, "rb"); 569fffb55fSDavid Gibson if (! pfile) { 579fffb55fSDavid Gibson fprintf(stderr, 589fffb55fSDavid Gibson "WARNING: Cannot open %s: %s\n", 59*47605971SRob Herring tmpname, strerror(errno)); 609fffb55fSDavid Gibson } else { 61658f29a5SJohn Bonesio prop = build_property(xstrdup(de->d_name), 629fffb55fSDavid Gibson data_copy_file(pfile, 63658f29a5SJohn Bonesio st.st_size)); 649fffb55fSDavid Gibson add_property(tree, prop); 659fffb55fSDavid Gibson fclose(pfile); 669fffb55fSDavid Gibson } 679fffb55fSDavid Gibson } else if (S_ISDIR(st.st_mode)) { 689fffb55fSDavid Gibson struct node *newchild; 699fffb55fSDavid Gibson 70*47605971SRob Herring newchild = read_fstree(tmpname); 71658f29a5SJohn Bonesio newchild = name_node(newchild, xstrdup(de->d_name)); 729fffb55fSDavid Gibson add_child(tree, newchild); 739fffb55fSDavid Gibson } 749fffb55fSDavid Gibson 75*47605971SRob Herring free(tmpname); 769fffb55fSDavid Gibson } 779fffb55fSDavid Gibson 785e8e1cc0SMartin Ettl closedir(d); 799fffb55fSDavid Gibson return tree; 809fffb55fSDavid Gibson } 819fffb55fSDavid Gibson 829fffb55fSDavid Gibson struct boot_info *dt_from_fs(const char *dirname) 839fffb55fSDavid Gibson { 849fffb55fSDavid Gibson struct node *tree; 859fffb55fSDavid Gibson 869fffb55fSDavid Gibson tree = read_fstree(dirname); 87658f29a5SJohn Bonesio tree = name_node(tree, ""); 889fffb55fSDavid Gibson 89658f29a5SJohn Bonesio return build_boot_info(NULL, tree, guess_boot_cpuid(tree)); 909fffb55fSDavid Gibson } 91*47605971SRob Herring 92