rpm
4.11.1-rc1
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
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
}
Generated by
1.8.3.1