00001 
00002 
00003 #include "system.h"
00004 const char *__progname;
00005 
00006 #include <rpm/rpmlib.h>         
00007 #include <rpm/rpmtag.h>
00008 #include <rpm/rpmio.h>
00009 #include <rpm/rpmpgp.h>
00010 
00011 #include <rpm/rpmts.h>
00012 
00013 #include "debug.h"
00014 
00015 int main(int argc, char *argv[])
00016 {
00017     FD_t fdi, fdo;
00018     Header h;
00019     char * rpmio_flags;
00020     rpmRC rc;
00021     FD_t gzdi;
00022     
00023     setprogname(argv[0]);       
00024     rpmReadConfigFiles(NULL, NULL);
00025     if (argc == 1)
00026         fdi = fdDup(STDIN_FILENO);
00027     else {
00028         if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
00029             fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
00030             exit(EXIT_FAILURE);
00031         }
00032         fdi = Fopen(argv[1], "r.ufdio");
00033     }
00034 
00035     if (Ferror(fdi)) {
00036         fprintf(stderr, "%s: %s: %s\n", argv[0],
00037                 (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
00038         exit(EXIT_FAILURE);
00039     }
00040     fdo = fdDup(STDOUT_FILENO);
00041 
00042     {   rpmts ts = rpmtsCreate();
00043         rpmVSFlags vsflags = 0;
00044 
00045         
00046         vsflags |= _RPMVSF_NODIGESTS;
00047         vsflags |= _RPMVSF_NOSIGNATURES;
00048         vsflags |= RPMVSF_NOHDRCHK;
00049         (void) rpmtsSetVSFlags(ts, vsflags);
00050 
00051              
00052         rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
00053 
00054         ts = rpmtsFree(ts);
00055     }
00056 
00057     switch (rc) {
00058     case RPMRC_OK:
00059     case RPMRC_NOKEY:
00060     case RPMRC_NOTTRUSTED:
00061         break;
00062     case RPMRC_NOTFOUND:
00063         fprintf(stderr, _("argument is not an RPM package\n"));
00064         exit(EXIT_FAILURE);
00065         break;
00066     case RPMRC_FAIL:
00067     default:
00068         fprintf(stderr, _("error reading header from package\n"));
00069         exit(EXIT_FAILURE);
00070         break;
00071     }
00072 
00073     
00074     {   const char * payload_compressor = NULL;
00075         struct rpmtd_s pc;
00076 
00077         headerGet(h, RPMTAG_PAYLOADCOMPRESSOR, &pc, HEADERGET_DEFAULT);
00078         payload_compressor = rpmtdGetString(&pc);
00079         if (!payload_compressor)
00080             payload_compressor = "gzip";
00081         
00082         if (!strcmp(payload_compressor, "gzip"))
00083             rpmio_flags = "r.gzdio";
00084         if (!strcmp(payload_compressor, "bzip2"))
00085             rpmio_flags = "r.bzdio";
00086         if (!strcmp(payload_compressor, "xz"))
00087             rpmio_flags = "r.xzdio";
00088         if (!strcmp(payload_compressor, "lzma"))
00089             rpmio_flags = "r.lzdio";
00090         rpmtdFreeData(&pc);
00091     }
00092 
00093     gzdi = Fdopen(fdi, rpmio_flags);    
00094     if (gzdi == NULL) {
00095         fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
00096         exit(EXIT_FAILURE);
00097     }
00098 
00099     rc = ufdCopy(gzdi, fdo);
00100     rc = (rc <= 0) ? EXIT_FAILURE : EXIT_SUCCESS;
00101     Fclose(fdo);
00102 
00103     Fclose(gzdi);       
00104 
00105     return rc;
00106 }