X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=rpm2cpio.c;h=89ebdfac0e14ac240f4526f86b167c6a5337335b;hb=9cf156d6583a9f9581000bb12ff047980ebcef03;hp=4f444c47303c3d506a547d57c5ed26436d27e7bc;hpb=eb0436b4b23ebdc8d18d2745223b6ceaf9e9a94c;p=platform%2Fupstream%2Frpm.git diff --git a/rpm2cpio.c b/rpm2cpio.c index 4f444c4..89ebdfa 100644 --- a/rpm2cpio.c +++ b/rpm2cpio.c @@ -1,67 +1,94 @@ /* rpmarchive: spit out the main archive portion of a package */ #include "system.h" +const char *__progname; -#include "rpmlib.h" +#include /* rpmReadPackageFile .. */ +#include +#include +#include -char *zlib_err [] = { - "No", - "Unix", - "Data", - "Memory", - "Buffer", - "Version" -}; +#include -int main(int argc, char **argv) +#include "debug.h" + +int main(int argc, char *argv[]) { FD_t fdi, fdo; - Header hd; - int rc, isSource; - char buffer[1024]; - int ct; + Header h; + char * rpmio_flags = NULL; + int rc; + off_t payload_size; FD_t gzdi; - if (argc == 1) { + setprogname(argv[0]); /* Retrofit glibc __progname */ + rpmReadConfigFiles(NULL, NULL); + if (argc == 1) fdi = fdDup(STDIN_FILENO); - } else { - fdi = fdOpen(argv[1], O_RDONLY, 0644); + else { + if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) { + fprintf(stderr, "Usage: rpm2cpio file.rpm\n"); + exit(EXIT_FAILURE); + } + fdi = Fopen(argv[1], "r.ufdio"); } - if (fdFileno(fdi) < 0) { - perror("cannot open package"); + if (Ferror(fdi)) { + fprintf(stderr, "%s: %s: %s\n", argv[0], + (argc == 1 ? "" : argv[1]), Fstrerror(fdi)); exit(EXIT_FAILURE); } fdo = fdDup(STDOUT_FILENO); - rc = rpmReadPackageHeader(fdi, &hd, &isSource, NULL, NULL); + { rpmts ts = rpmtsCreate(); + rpmVSFlags vsflags = 0; + + /* XXX retain the ageless behavior of rpm2cpio */ + vsflags |= _RPMVSF_NODIGESTS; + vsflags |= _RPMVSF_NOSIGNATURES; + vsflags |= RPMVSF_NOHDRCHK; + (void) rpmtsSetVSFlags(ts, vsflags); + + rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h); + + ts = rpmtsFree(ts); + } + switch (rc) { - case 0: + case RPMRC_OK: + case RPMRC_NOKEY: + case RPMRC_NOTTRUSTED: break; - case 1: + case RPMRC_NOTFOUND: fprintf(stderr, _("argument is not an RPM package\n")); exit(EXIT_FAILURE); break; + case RPMRC_FAIL: default: fprintf(stderr, _("error reading header from package\n")); exit(EXIT_FAILURE); break; } - gzdi = gzdFdopen(fdi, "r"); /* XXX gzdi == fdi */ - - while ((ct = gzdRead(gzdi, &buffer, sizeof(buffer))) > 0) { - fdWrite(fdo, &buffer, ct); + /* Retrieve payload size and compression type. */ + { const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR); + rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL); + payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE); } - if (ct < 0) { - fprintf (stderr, "rpm2cpio: zlib: %s\n", gzdStrerror(gzdi)); - rc = EXIT_FAILURE; - } else { - rc = EXIT_SUCCESS; + gzdi = Fdopen(fdi, rpmio_flags); /* XXX gzdi == fdi */ + free(rpmio_flags); + + if (gzdi == NULL) { + fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi)); + exit(EXIT_FAILURE); } - gzdClose(gzdi); + rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE; + + Fclose(fdo); + + Fclose(gzdi); /* XXX gzdi == fdi */ return rc; }