4f444c47303c3d506a547d57c5ed26436d27e7bc
[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 "rpmlib.h"
6
7 char *zlib_err [] = {
8    "No",
9    "Unix",
10    "Data",
11    "Memory",
12    "Buffer",
13    "Version"
14 };
15
16 int main(int argc, char **argv)
17 {
18     FD_t fdi, fdo;
19     Header hd;
20     int rc, isSource;
21     char buffer[1024];
22     int ct;
23     FD_t gzdi;
24     
25     if (argc == 1) {
26         fdi = fdDup(STDIN_FILENO);
27     } else {
28         fdi = fdOpen(argv[1], O_RDONLY, 0644);
29     }
30
31     if (fdFileno(fdi) < 0) {
32         perror("cannot open package");
33         exit(EXIT_FAILURE);
34     }
35     fdo = fdDup(STDOUT_FILENO);
36
37     rc = rpmReadPackageHeader(fdi, &hd, &isSource, NULL, NULL);
38     switch (rc) {
39     case 0:
40         break;
41     case 1:
42         fprintf(stderr, _("argument is not an RPM package\n"));
43         exit(EXIT_FAILURE);
44         break;
45     default:
46         fprintf(stderr, _("error reading header from package\n"));
47         exit(EXIT_FAILURE);
48         break;
49     }
50
51     gzdi = gzdFdopen(fdi, "r"); /* XXX gzdi == fdi */
52
53     while ((ct = gzdRead(gzdi, &buffer, sizeof(buffer))) > 0) {
54         fdWrite(fdo, &buffer, ct);
55     }
56
57     if (ct < 0) {
58         fprintf (stderr, "rpm2cpio: zlib: %s\n", gzdStrerror(gzdi));
59         rc = EXIT_FAILURE;
60     } else {
61         rc = EXIT_SUCCESS;
62     }
63
64     gzdClose(gzdi);
65
66     return rc;
67 }