fix msm-plugin.c svace issue: make sure dupPath is not NULL before strchr()
[platform/upstream/rpm.git] / rpm2cpio.c
1 /* rpmarchive: spit out the main archive portion of a package */
2
3 #include "system.h"
4
5 #include <rpm/rpmlib.h>         /* rpmReadPackageFile .. */
6 #include <rpm/rpmtag.h>
7 #include <rpm/rpmio.h>
8 #include <rpm/rpmpgp.h>
9
10 #include <rpm/rpmts.h>
11 #include <unistd.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     xsetprogname(argv[0]); /* Portability call -- see system.h */
25
26     rpmReadConfigFiles(NULL, NULL);
27     if (argc == 1)
28         fdi = fdDup(STDIN_FILENO);
29     else {
30         if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
31             fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
32             exit(EXIT_FAILURE);
33         }
34         fdi = Fopen(argv[1], "r.ufdio");
35     }
36
37     if (Ferror(fdi)) {
38         fprintf(stderr, "%s: %s: %s\n", argv[0],
39                 (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
40         exit(EXIT_FAILURE);
41     }
42     if (isatty(STDOUT_FILENO)) {
43         fprintf(stderr, "Error: refusing to output cpio data to a terminal.\n");
44         exit(EXIT_FAILURE);
45     }
46     fdo = fdDup(STDOUT_FILENO);
47
48     {   rpmts ts = rpmtsCreate();
49         rpmVSFlags vsflags = 0;
50
51         /* XXX retain the ageless behavior of rpm2cpio */
52         vsflags |= _RPMVSF_NODIGESTS;
53         vsflags |= _RPMVSF_NOSIGNATURES;
54         vsflags |= RPMVSF_NOHDRCHK;
55         (void) rpmtsSetVSFlags(ts, vsflags);
56
57         rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
58
59         ts = rpmtsFree(ts);
60     }
61
62     switch (rc) {
63     case RPMRC_OK:
64     case RPMRC_NOKEY:
65     case RPMRC_NOTTRUSTED:
66         break;
67     case RPMRC_NOTFOUND:
68         fprintf(stderr, _("argument is not an RPM package\n"));
69         exit(EXIT_FAILURE);
70         break;
71     case RPMRC_FAIL:
72     default:
73         fprintf(stderr, _("error reading header from package\n"));
74         exit(EXIT_FAILURE);
75         break;
76     }
77
78     /* Retrieve payload size and compression type. */
79     {   const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
80         rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
81         payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
82     }
83
84     gzdi = Fdopen(fdi, rpmio_flags);    /* XXX gzdi == fdi */
85     free(rpmio_flags);
86
87     if (gzdi == NULL) {
88         fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
89         exit(EXIT_FAILURE);
90     }
91
92     rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE;
93
94     Fclose(fdo);
95
96     Fclose(gzdi);       /* XXX gzdi == fdi */
97
98     return rc;
99 }