@ -2,13 +2,17 @@
static const struct option long_opts [ ] = {
{ " root " , required_argument , NULL , ' r ' } ,
{ " no-chown " , required_argument , NULL , ' o ' } ,
{ " no-chmod " , required_argument , NULL , ' m ' } ,
{ " no-chown " , no_argument , NULL , ' o ' } ,
{ " no-chmod " , no_argument , NULL , ' m ' } ,
{ " no-dependencies " , no_argument , NULL , ' d ' } ,
{ " repo-dir " , required_argument , NULL , ' R ' } ,
{ " list-packages " , no_argument , NULL , ' p ' } ,
{ " list-files " , no_argument , NULL , ' l ' } ,
{ " format " , required_argument , NULL , ' F ' } ,
{ NULL , 0 , NULL , 0 } ,
} ;
static const char * short_opts = " R: r:om" ;
static const char * short_opts = " r:omdRplF: " ;
static int unpack_packages ( int repofd , int rootfd , int flags ,
struct pkg_dep_list * list )
@ -32,11 +36,53 @@ static int unpack_packages(int repofd, int rootfd, int flags,
return 0 ;
}
static void list_packages ( struct pkg_dep_list * list )
{
struct pkg_dep_node * it ;
for ( it = list - > head ; it ! = NULL ; it = it - > next )
printf ( " %s \n " , it - > name ) ;
}
static int list_files ( int repofd , const char * rootdir , TOC_FORMAT format ,
struct pkg_dep_list * list )
{
struct pkg_dep_node * it ;
image_entry_t * toc ;
pkg_reader_t * rd ;
for ( it = list - > head ; it ! = NULL ; it = it - > next ) {
rd = pkg_reader_open_repo ( repofd , it - > name ) ;
if ( rd = = NULL )
return - 1 ;
toc = image_entry_list_from_package ( rd ) ;
if ( toc = = NULL ) {
pkg_reader_close ( rd ) ;
return - 1 ;
}
if ( dump_toc ( toc , rootdir , format ) ) {
image_entry_free_list ( toc ) ;
pkg_reader_close ( rd ) ;
return - 1 ;
}
image_entry_free_list ( toc ) ;
pkg_reader_close ( rd ) ;
}
return 0 ;
}
static int cmd_install ( int argc , char * * argv )
{
int i , rootfd = AT_FDCWD , repofd = AT_FDCWD , flags = 0 ;
int ret = EXIT_FAILURE , mode = INSTALL_MODE_INSTALL ;
TOC_FORMAT format = TOC_FORMAT_PRETTY ;
const char * rootdir = NULL ;
struct pkg_dep_list list ;
int ret = EXIT_FAILURE ;
bool resolve_deps = true ;
memset ( & list , 0 , sizeof ( list ) ) ;
@ -46,6 +92,26 @@ static int cmd_install(int argc, char **argv)
break ;
switch ( i ) {
case ' d ' :
resolve_deps = false ;
break ;
case ' p ' :
mode = INSTALL_MODE_LIST_PKG ;
break ;
case ' l ' :
mode = INSTALL_MODE_LIST_FILES ;
break ;
case ' F ' :
if ( strcmp ( optarg , " sqfs " ) = = 0 ) {
format = TOC_FORMAT_SQFS ;
} else if ( strcmp ( optarg , " initrd " ) = = 0 ) {
format = TOC_FORMAT_INITRD ;
} else {
fprintf ( stderr , " unknown format '%s' \n " ,
optarg ) ;
goto out ;
}
break ;
case ' R ' :
if ( repofd ! = AT_FDCWD ) {
fputs ( " repo specified more than once \n " ,
@ -75,6 +141,8 @@ static int cmd_install(int argc, char **argv)
perror ( optarg ) ;
goto out ;
}
rootdir = optarg ;
break ;
case ' o ' :
flags | = UNPACK_NO_CHOWN ;
@ -93,14 +161,27 @@ static int cmd_install(int argc, char **argv)
goto out ;
}
if ( collect_dependencies ( repofd , & list ) )
goto out ;
if ( resolve_deps ) {
if ( collect_dependencies ( repofd , & list ) )
goto out ;
if ( sort_by_dependencies ( & list ) )
goto out ;
if ( sort_by_dependencies ( & list ) )
goto out ;
}
if ( unpack_packages ( repofd , rootfd , flags , & list ) )
goto out ;
switch ( mode ) {
case INSTALL_MODE_LIST_PKG :
list_packages ( & list ) ;
break ;
case INSTALL_MODE_LIST_FILES :
if ( list_files ( repofd , rootdir , format , & list ) )
goto out ;
break ;
default :
if ( unpack_packages ( repofd , rootfd , flags , & list ) )
goto out ;
break ;
}
ret = EXIT_SUCCESS ;
out :
@ -130,7 +211,23 @@ static command_t install = {
" Keep the uid/gid of the user who runs the program. \n "
" --no-chmod, -m Do not change permission flags of the extarcted \n "
" data. Use 0644 for all files and 0755 for all \n "
" directories. \n " ,
" directories. \n "
" --no-dependencies, -d Do not resolve dependencies, only install files \n "
" packages listed on the command line. \n "
" --list-packages, -p Do not install packages, print out final package \n "
" list that would be installed. \n "
" --list-files, -l Do not install packages, print out table of \n "
" contents for all packages that would be installed. \n "
" --format, -F <format> Specify what format to use for printing the table \n "
" of contents. Default is a pretty printed, human \n "
" readable version. \n "
" \n "
" If \" sqfs \" is specified, a squashfs pseudo file \n "
" is genareated for setting permissions bits and \n "
" ownership appropriately. \n "
" \n "
" If \" initrd \" is specified, a format appropriate \n "
" for Linux gen_init_cpio is produced. \n " ,
. run_cmd = cmd_install ,
} ;