Turn rpmFdFromPyObject() into an object converter interface
[platform/upstream/rpm.git] / rpm2cpio.c
1 /* rpmarchive: spit out the main archive portion of a package */
2
3 #include "system.h"
4 const char *__progname;
5
6 #include <rpm/rpmlib.h>         /* rpmReadPackageFile .. */
7 #include <rpm/rpmtag.h>
8 #include <rpm/rpmio.h>
9 #include <rpm/rpmpgp.h>
10
11 #include <rpm/rpmts.h>
12
13 #include "debug.h"
14
15 int main(int argc, char *argv[])
16 {
17     FD_t fdi, fdo;
18     Header h;
19     char * rpmio_flags = NULL;
20     rpmRC rc;
21     FD_t gzdi;
22     
23     setprogname(argv[0]);       /* Retrofit glibc __progname */
24     rpmReadConfigFiles(NULL, NULL);
25     if (argc == 1)
26         fdi = fdDup(STDIN_FILENO);
27     else {
28         if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
29             fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
30             exit(EXIT_FAILURE);
31         }
32         fdi = Fopen(argv[1], "r.ufdio");
33     }
34
35     if (Ferror(fdi)) {
36         fprintf(stderr, "%s: %s: %s\n", argv[0],
37                 (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
38         exit(EXIT_FAILURE);
39     }
40     fdo = fdDup(STDOUT_FILENO);
41
42     {   rpmts ts = rpmtsCreate();
43         rpmVSFlags vsflags = 0;
44
45         /* XXX retain the ageless behavior of rpm2cpio */
46         vsflags |= _RPMVSF_NODIGESTS;
47         vsflags |= _RPMVSF_NOSIGNATURES;
48         vsflags |= RPMVSF_NOHDRCHK;
49         (void) rpmtsSetVSFlags(ts, vsflags);
50
51         rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
52
53         ts = rpmtsFree(ts);
54     }
55
56     switch (rc) {
57     case RPMRC_OK:
58     case RPMRC_NOKEY:
59     case RPMRC_NOTTRUSTED:
60         break;
61     case RPMRC_NOTFOUND:
62         fprintf(stderr, _("argument is not an RPM package\n"));
63         exit(EXIT_FAILURE);
64         break;
65     case RPMRC_FAIL:
66     default:
67         fprintf(stderr, _("error reading header from package\n"));
68         exit(EXIT_FAILURE);
69         break;
70     }
71
72     /* Retrieve type of payload compression. */
73     {   const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
74         rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
75     }
76
77     gzdi = Fdopen(fdi, rpmio_flags);    /* XXX gzdi == fdi */
78     free(rpmio_flags);
79
80     if (gzdi == NULL) {
81         fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
82         exit(EXIT_FAILURE);
83     }
84
85     rc = ufdCopy(gzdi, fdo);
86     rc = (rc <= 0) ? EXIT_FAILURE : EXIT_SUCCESS;
87     Fclose(fdo);
88
89     Fclose(gzdi);       /* XXX gzdi == fdi */
90
91     return rc;
92 }