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 80*5e8e1cc0SMartin Ettl closedir(d); 819fffb55fSDavid Gibson return tree; 829fffb55fSDavid Gibson } 839fffb55fSDavid Gibson 849fffb55fSDavid Gibson struct boot_info *dt_from_fs(const char *dirname) 859fffb55fSDavid Gibson { 869fffb55fSDavid Gibson struct node *tree; 879fffb55fSDavid Gibson 889fffb55fSDavid Gibson tree = read_fstree(dirname); 899fffb55fSDavid Gibson tree = name_node(tree, "", NULL); 909fffb55fSDavid Gibson 919fffb55fSDavid Gibson return build_boot_info(NULL, tree, 0); 929fffb55fSDavid Gibson } 939fffb55fSDavid Gibson 94