2002-03-25 23:16:26 +03:00
/* rpmarchive: spit out the main archive portion of a package */
# include "system.h"
# include "rpmlib.h"
# include "debug.h"
int main ( int argc , char * * argv )
{
FD_t fdi , fdo ;
Header h ;
char * rpmio_flags ;
int rc , isSource ;
FD_t gzdi ;
setprogname ( argv [ 0 ] ) ; /* Retrofit glibc __progname */
if ( argc = = 1 )
fdi = fdDup ( STDIN_FILENO ) ;
else
fdi = Fopen ( argv [ 1 ] , " r.ufdio " ) ;
if ( Ferror ( fdi ) ) {
fprintf ( stderr , " %s: %s: %s \n " , argv [ 0 ] ,
( argc = = 1 ? " <stdin> " : argv [ 1 ] ) , Fstrerror ( fdi ) ) ;
exit ( EXIT_FAILURE ) ;
}
fdo = fdDup ( STDOUT_FILENO ) ;
rc = rpmReadPackageHeader ( fdi , & h , & isSource , NULL , NULL ) ;
switch ( rc ) {
case 0 :
break ;
case 1 :
fprintf ( stderr , _ ( " argument is not an RPM package \n " ) ) ;
exit ( EXIT_FAILURE ) ;
break ;
default :
fprintf ( stderr , _ ( " error reading header from package \n " ) ) ;
exit ( EXIT_FAILURE ) ;
break ;
}
/* Retrieve type of payload compression. */
{ const char * payload_compressor = NULL ;
char * t ;
if ( ! headerGetEntry ( h , RPMTAG_PAYLOADCOMPRESSOR , NULL ,
( void * * ) & payload_compressor , NULL ) )
payload_compressor = " gzip " ;
rpmio_flags = t = alloca ( sizeof ( " r.gzdio " ) ) ;
* t + + = ' r ' ;
if ( ! strcmp ( payload_compressor , " gzip " ) )
t = stpcpy ( t , " .gzdio " ) ;
if ( ! strcmp ( payload_compressor , " bzip2 " ) )
t = stpcpy ( t , " .bzdio " ) ;
2008-05-24 12:30:04 +04:00
if ( ! strcmp ( payload_compressor , " lzma " ) )
t = stpcpy ( t , " .lzdio " ) ;
2009-09-23 05:15:08 +04:00
if ( ! strcmp ( payload_compressor , " xz " ) )
t = stpcpy ( t , " .xzdio " ) ;
2002-03-25 23:16:26 +03:00
}
gzdi = Fdopen ( fdi , rpmio_flags ) ; /* XXX gzdi == fdi */
if ( gzdi = = NULL ) {
fprintf ( stderr , _ ( " cannot re-open payload: %s \n " ) , Fstrerror ( gzdi ) ) ;
exit ( EXIT_FAILURE ) ;
}
rc = ufdCopy ( gzdi , fdo ) ;
rc = ( rc < = 0 ) ? EXIT_FAILURE : EXIT_SUCCESS ;
2003-05-01 16:19:59 +04:00
if ( Fclose ( fdo ) < 0 )
rc = EXIT_FAILURE ;
2002-03-25 23:16:26 +03:00
2003-05-01 16:19:59 +04:00
if ( Fclose ( gzdi ) < 0 ) /* XXX gzdi == fdi */
rc = EXIT_FAILURE ;
2002-03-25 23:16:26 +03:00
return rc ;
}