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 }