Add support for global LDFLAGS
[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     int rc;
21     off_t payload_size;
22     FD_t gzdi;
23     
24     setprogname(argv[0]);       /* Retrofit glibc __progname */
25     rpmReadConfigFiles(NULL, NULL);
26     if (argc == 1)
27         fdi = fdDup(STDIN_FILENO);
28     else {
29         if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
30             fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
31             exit(EXIT_FAILURE);
32         }
33         fdi = Fopen(argv[1], "r.ufdio");
34     }
35
36     if (Ferror(fdi)) {
37         fprintf(stderr, "%s: %s: %s\n", argv[0],
38                 (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
39         exit(EXIT_FAILURE);
40     }
41     fdo = fdDup(STDOUT_FILENO);
42
43     {   rpmts ts = rpmtsCreate();
44         rpmVSFlags vsflags = 0;
45
46         /* XXX retain the ageless behavior of rpm2cpio */
47         vsflags |= _RPMVSF_NODIGESTS;
48         vsflags |= _RPMVSF_NOSIGNATURES;
49         vsflags |= RPMVSF_NOHDRCHK;
50         (void) rpmtsSetVSFlags(ts, vsflags);
51
52         rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
53
54         ts = rpmtsFree(ts);
55     }
56
57     switch (rc) {
58     case RPMRC_OK:
59     case RPMRC_NOKEY:
60     case RPMRC_NOTTRUSTED:
61         break;
62     case RPMRC_NOTFOUND:
63         fprintf(stderr, _("argument is not an RPM package\n"));
64         exit(EXIT_FAILURE);
65         break;
66     case RPMRC_FAIL:
67     default:
68         fprintf(stderr, _("error reading header from package\n"));
69         exit(EXIT_FAILURE);
70         break;
71     }
72
73     /* Retrieve payload size and compression type. */
74     {   const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
75         rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
76         payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
77     }
78
79     gzdi = Fdopen(fdi, rpmio_flags);    /* XXX gzdi == fdi */
80     free(rpmio_flags);
81
82     if (gzdi == NULL) {
83         fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
84         exit(EXIT_FAILURE);
85     }
86
87     rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE;
88
89     Fclose(fdo);
90
91     Fclose(gzdi);       /* XXX gzdi == fdi */
92
93     return rc;
94 }