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