rpm  4.11.1-rc1
rpm2cpio.c
Go to the documentation of this file.
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 }