rpm  4.10.0
rpm2cpio.c
Go to the documentation of this file.
00001 /* rpmarchive: spit out the main archive portion of a package */
00002 
00003 #include "system.h"
00004 const char *__progname;
00005 
00006 #include <rpm/rpmlib.h>         /* rpmReadPackageFile .. */
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 = NULL;
00020     int rc;
00021     off_t payload_size;
00022     FD_t gzdi;
00023     
00024     setprogname(argv[0]);       /* Retrofit glibc __progname */
00025     rpmReadConfigFiles(NULL, NULL);
00026     if (argc == 1)
00027         fdi = fdDup(STDIN_FILENO);
00028     else {
00029         if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
00030             fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
00031             exit(EXIT_FAILURE);
00032         }
00033         fdi = Fopen(argv[1], "r.ufdio");
00034     }
00035 
00036     if (Ferror(fdi)) {
00037         fprintf(stderr, "%s: %s: %s\n", argv[0],
00038                 (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
00039         exit(EXIT_FAILURE);
00040     }
00041     fdo = fdDup(STDOUT_FILENO);
00042 
00043     {   rpmts ts = rpmtsCreate();
00044         rpmVSFlags vsflags = 0;
00045 
00046         /* XXX retain the ageless behavior of rpm2cpio */
00047         vsflags |= _RPMVSF_NODIGESTS;
00048         vsflags |= _RPMVSF_NOSIGNATURES;
00049         vsflags |= RPMVSF_NOHDRCHK;
00050         (void) rpmtsSetVSFlags(ts, vsflags);
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     /* Retrieve payload size and compression type. */
00074     {   const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
00075         rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
00076         payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
00077     }
00078 
00079     gzdi = Fdopen(fdi, rpmio_flags);    /* XXX gzdi == fdi */
00080     free(rpmio_flags);
00081 
00082     if (gzdi == NULL) {
00083         fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
00084         exit(EXIT_FAILURE);
00085     }
00086 
00087     rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE;
00088 
00089     Fclose(fdo);
00090 
00091     Fclose(gzdi);       /* XXX gzdi == fdi */
00092 
00093     return rc;
00094 }