X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=rpm2cpio.c;h=89ebdfac0e14ac240f4526f86b167c6a5337335b;hb=9cf156d6583a9f9581000bb12ff047980ebcef03;hp=ae978d3df501b277de13793453fddf10cc8a0110;hpb=fd068345e6e5165b8b772edc3392adda228800fe;p=platform%2Fupstream%2Frpm.git diff --git a/rpm2cpio.c b/rpm2cpio.c index ae978d3..89ebdfa 100644 --- a/rpm2cpio.c +++ b/rpm2cpio.c @@ -1,66 +1,94 @@ /* rpmarchive: spit out the main archive portion of a package */ #include "system.h" +const char *__progname; -#include "intl.h" -#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[]) { - int fd; - Header hd; - int rc, isSource; - char buffer[1024]; - int ct; - gzFile stream; + FD_t fdi, fdo; + Header h; + char * rpmio_flags = NULL; + int rc; + off_t payload_size; + FD_t gzdi; - if (argc == 1) { - fd = 0; - } else { - fd = open(argv[1], O_RDONLY, 0644); + setprogname(argv[0]); /* Retrofit glibc __progname */ + rpmReadConfigFiles(NULL, NULL); + if (argc == 1) + fdi = fdDup(STDIN_FILENO); + 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 (Ferror(fdi)) { + fprintf(stderr, "%s: %s: %s\n", argv[0], + (argc == 1 ? "" : argv[1]), Fstrerror(fdi)); + exit(EXIT_FAILURE); } + fdo = fdDup(STDOUT_FILENO); + + { 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); - if (fd < 0) { - perror("cannot open package"); - exit(1); + ts = rpmtsFree(ts); } - rc = rpmReadPackageHeader(fd, &hd, &isSource, NULL, NULL); - if (rc == 1) { + switch (rc) { + case RPMRC_OK: + case RPMRC_NOKEY: + case RPMRC_NOTTRUSTED: + break; + case RPMRC_NOTFOUND: fprintf(stderr, _("argument is not an RPM package\n")); - exit(1); - } else if (rc) { + exit(EXIT_FAILURE); + break; + case RPMRC_FAIL: + default: fprintf(stderr, _("error reading header from package\n")); - exit(1); + exit(EXIT_FAILURE); + break; } - stream = gzdopen(fd, "r"); - - while ((ct = gzread(stream, &buffer, 1024)) > 0) { - write(1, &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){ - int zerror; - - gzerror (stream, &zerror); - if (zerror == Z_ERRNO){ - perror ("While uncompressing"); - gzclose(stream); - return 1; - } - fprintf (stderr, "rpm2cpio: zlib: %s error\n", zlib_err [-zerror - 1]); + + 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); } - gzclose(stream); + rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE; + + Fclose(fdo); + + Fclose(gzdi); /* XXX gzdi == fdi */ - return 0; + return rc; }