2007-12-18 07:06:42 +03:00
/*
* ( C ) Copyright David Gibson < dwg @ au1 . ibm . com > , IBM Corporation . 2005.
*
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
* USA
*/
# include "dtc.h"
# include <dirent.h>
# include <sys/stat.h>
static struct node * read_fstree ( const char * dirname )
{
DIR * d ;
struct dirent * de ;
struct stat st ;
struct node * tree ;
d = opendir ( dirname ) ;
2008-08-07 06:24:17 +04:00
if ( ! d )
die ( " Couldn't opendir() \" %s \" : %s \n " , dirname , strerror ( errno ) ) ;
2007-12-18 07:06:42 +03:00
tree = build_node ( NULL , NULL ) ;
while ( ( de = readdir ( d ) ) ! = NULL ) {
char * tmpnam ;
if ( streq ( de - > d_name , " . " )
| | streq ( de - > d_name , " .. " ) )
continue ;
tmpnam = join_path ( dirname , de - > d_name ) ;
if ( lstat ( tmpnam , & st ) < 0 )
die ( " stat(%s): %s \n " , tmpnam , strerror ( errno ) ) ;
if ( S_ISREG ( st . st_mode ) ) {
struct property * prop ;
FILE * pfile ;
pfile = fopen ( tmpnam , " r " ) ;
if ( ! pfile ) {
fprintf ( stderr ,
" WARNING: Cannot open %s: %s \n " ,
tmpnam , strerror ( errno ) ) ;
} else {
2010-11-18 02:28:20 +03:00
prop = build_property ( xstrdup ( de - > d_name ) ,
2007-12-18 07:06:42 +03:00
data_copy_file ( pfile ,
2010-11-18 02:28:20 +03:00
st . st_size ) ) ;
2007-12-18 07:06:42 +03:00
add_property ( tree , prop ) ;
fclose ( pfile ) ;
}
} else if ( S_ISDIR ( st . st_mode ) ) {
struct node * newchild ;
newchild = read_fstree ( tmpnam ) ;
2010-11-18 02:28:20 +03:00
newchild = name_node ( newchild , xstrdup ( de - > d_name ) ) ;
2007-12-18 07:06:42 +03:00
add_child ( tree , newchild ) ;
}
free ( tmpnam ) ;
}
2010-02-21 11:31:44 +03:00
closedir ( d ) ;
2007-12-18 07:06:42 +03:00
return tree ;
}
struct boot_info * dt_from_fs ( const char * dirname )
{
struct node * tree ;
tree = read_fstree ( dirname ) ;
2010-11-18 02:28:20 +03:00
tree = name_node ( tree , " " ) ;
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
return build_boot_info ( NULL , tree , guess_boot_cpuid ( tree ) ) ;
2007-12-18 07:06:42 +03:00
}