rpm  4.13.0
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 #ifdef __OS2__
25  _fsetmode( stdin, "b");
26  _fsetmode( stdout, "b");
27 #endif
28 
29  setprogname(argv[0]); /* Retrofit glibc __progname */
30 #ifdef __OS2__
31  /* XXX glibc churn sanity */
32  if (__progname == NULL) {
33  if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
34  else __progname = argv[0];
35  }
36 #endif
37 
38  rpmReadConfigFiles(NULL, NULL);
39  if (argc == 1)
40  fdi = fdDup(STDIN_FILENO);
41  else {
42  if (rstreq(argv[1], "-h") || rstreq(argv[1], "--help")) {
43  fprintf(stderr, "Usage: rpm2cpio file.rpm\n");
44  exit(EXIT_FAILURE);
45  }
46  fdi = Fopen(argv[1], "r.ufdio");
47  }
48 
49  if (Ferror(fdi)) {
50  fprintf(stderr, "%s: %s: %s\n", argv[0],
51  (argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
52  exit(EXIT_FAILURE);
53  }
54  fdo = fdDup(STDOUT_FILENO);
55 
56  { rpmts ts = rpmtsCreate();
57  rpmVSFlags vsflags = 0;
58 
59  /* XXX retain the ageless behavior of rpm2cpio */
60  vsflags |= _RPMVSF_NODIGESTS;
61  vsflags |= _RPMVSF_NOSIGNATURES;
62  vsflags |= RPMVSF_NOHDRCHK;
63  (void) rpmtsSetVSFlags(ts, vsflags);
64 
65  rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
66 
67  ts = rpmtsFree(ts);
68  }
69 
70  switch (rc) {
71  case RPMRC_OK:
72  case RPMRC_NOKEY:
73  case RPMRC_NOTTRUSTED:
74  break;
75  case RPMRC_NOTFOUND:
76  fprintf(stderr, _("argument is not an RPM package\n"));
77  exit(EXIT_FAILURE);
78  break;
79  case RPMRC_FAIL:
80  default:
81  fprintf(stderr, _("error reading header from package\n"));
82  exit(EXIT_FAILURE);
83  break;
84  }
85 
86  /* Retrieve payload size and compression type. */
87  { const char *compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
88  rpmio_flags = rstrscat(NULL, "r.", compr ? compr : "gzip", NULL);
89  payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);
90  }
91 
92  gzdi = Fdopen(fdi, rpmio_flags); /* XXX gzdi == fdi */
93  free(rpmio_flags);
94 
95  if (gzdi == NULL) {
96  fprintf(stderr, _("cannot re-open payload: %s\n"), Fstrerror(gzdi));
97  exit(EXIT_FAILURE);
98  }
99 
100  rc = (ufdCopy(gzdi, fdo) == payload_size) ? EXIT_SUCCESS : EXIT_FAILURE;
101 
102  Fclose(fdo);
103 
104  Fclose(gzdi); /* XXX gzdi == fdi */
105 
106  return rc;
107 }
_RPMVSF_NOSIGNATURES
#define _RPMVSF_NOSIGNATURES
Definition: rpmts.h:118
RPMRC_NOTTRUSTED
@ RPMRC_NOTTRUSTED
Definition: rpmtypes.h:107
_
#define _(Text)
Definition: system.h:112
Fstrerror
const char * Fstrerror(FD_t fd)
setprogname
#define setprogname(pn)
Definition: system.h:98
rpmtsCreate
rpmts rpmtsCreate(void)
main
int main(int argc, char *argv[])
Definition: rpm2cpio.c:15
rpmts
struct rpmts_s * rpmts
Definition: rpmtypes.h:63
RPMRC_NOKEY
@ RPMRC_NOKEY
Definition: rpmtypes.h:108
ufdCopy
off_t ufdCopy(FD_t sfd, FD_t tfd)
RPMTAG_LONGARCHIVESIZE
@ RPMTAG_LONGARCHIVESIZE
Definition: rpmtag.h:59
Fdopen
FD_t Fdopen(FD_t ofd, const char *fmode)
_RPMVSF_NODIGESTS
#define _RPMVSF_NODIGESTS
Definition: rpmts.h:112
Ferror
int Ferror(FD_t fd)
__progname
#define __progname
Definition: system.h:97
rpmReadConfigFiles
int rpmReadConfigFiles(const char *file, const char *target)
rpmReadPackageFile
rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char *fn, Header *hdrp)
fdDup
FD_t fdDup(int fdno)
RPMRC_FAIL
@ RPMRC_FAIL
Definition: rpmtypes.h:106
system.h
RPMVSF_NOHDRCHK
@ RPMVSF_NOHDRCHK
Definition: rpmts.h:95
Fclose
int Fclose(FD_t fd)
rstrscat
char * rstrscat(char **dest, const char *arg,...) RPM_GNUC_NULL_TERMINATED
Header
struct headerToken_s * Header
Definition: rpmtypes.h:24
rpmtsSetVSFlags
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
headerGetString
const char * headerGetString(Header h, rpmTagVal tag)
headerGetNumber
uint64_t headerGetNumber(Header h, rpmTagVal tag)
Fopen
FD_t Fopen(const char *path, const char *fmode)
rpmVSFlags
rpmFlags rpmVSFlags
Definition: rpmts.h:110
rstreq
static int rstreq(const char *s1, const char *s2)
Test for string equality.
Definition: rpmstring.h:113
RPMRC_OK
@ RPMRC_OK
Definition: rpmtypes.h:104
RPMRC_NOTFOUND
@ RPMRC_NOTFOUND
Definition: rpmtypes.h:105
RPMTAG_PAYLOADCOMPRESSOR
@ RPMTAG_PAYLOADCOMPRESSOR
Definition: rpmtag.h:189
FD_t
struct _FD_s * FD_t
Definition: rpmtypes.h:98
debug.h
rpmtsFree
rpmts rpmtsFree(rpmts ts)