6 #include <rpm/rpmlib.h>
8 #include <rpm/rpmtag.h>
10 #include <rpm/rpmpgp.h>
12 #include <rpm/rpmts.h>
15 #include <archive_entry.h>
19 #define BUFSIZE (128*1024)
23 archive_entry_clear(entry);
26 archive_entry_copy_pathname(entry, filename);
31 archive_entry_set_filetype(entry, mode & S_IFMT);
32 archive_entry_set_perm(entry, mode);
34 archive_entry_set_uname(entry,
rpmfiFUser(fi));
40 archive_entry_set_symlink(entry,
rpmfiFLink(fi));
52 archive_write_data(a, buf, len);
54 fprintf(stderr,
"Error reading file from rpm payload\n");
67 char * rpmio_flags = NULL;
69 struct archive_entry *entry;
71 if (!strcmp(filename,
"-")) {
72 fdi =
fdDup(STDIN_FILENO);
74 fdi =
Fopen(filename,
"r.ufdio");
78 fprintf(stderr,
"rpm2archive: %s: %s\n",
91 fprintf(stderr,
_(
"argument is not an RPM package\n"));
96 fprintf(stderr,
_(
"error reading header from package\n"));
104 rpmio_flags =
rstrscat(NULL,
"r.", compr ? compr :
"gzip", NULL);
107 gzdi =
Fdopen(fdi, rpmio_flags);
111 fprintf(stderr,
_(
"cannot re-open payload: %s\n"),
Fstrerror(gzdi));
119 a = archive_write_new();
120 archive_write_add_filter_gzip(a);
121 archive_write_set_format_pax_restricted(a);
123 if (!strcmp(filename,
"-")) {
124 archive_write_open_fd(a, 1);
126 char * outname =
rstrscat(NULL, filename,
".tgz", NULL);
127 archive_write_open_filename(a, outname);
132 entry = archive_entry_new();
135 char * hardlink = NULL;
154 archive_entry_set_hardlink(entry, hardlink);
158 archive_write_header(a, entry);
167 archive_entry_free(entry);
168 archive_write_close(a);
169 archive_write_free(a);
177 int main(
int argc,
char *argv[])
187 if (
rstreq(argv[1],
"-h") ||
rstreq(argv[1],
"--help")) {
188 fprintf(stderr,
"Usage: rpm2archive file.rpm\n");
const char * rpmfiFLink(rpmfi fi)
Return current file linkto (i.e.
size_t rpmfiArchiveRead(rpmfi fi, void *buf, size_t size)
Read content from current file in archive.
rpm_mode_t rpmfiFMode(rpmfi fi)
Return current file mode from file info set iterator.
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
struct rpmts_s * rpmts
The main types involved in transaction manipulation.
rpm_rdev_t rpmfiFRdev(rpmfi fi)
Return current file rdev from file info set iterator.
rpmts rpmtsCreate(void)
Create an empty transaction set.
const char * rpmfiFUser(rpmfi fi)
Return current file owner from file info set iterator.
struct _FD_s * FD_t
RPM IO file descriptor type.
int rpmfiArchiveHasContent(rpmfi fi)
Has current file content stored in the archive.
int rpmReadConfigFiles(const char *file, const char *target)
Read macro configuration file(s) for a target.
static int rstreq(const char *s1, const char *s2)
Test for string equality.
const char * rpmfiFGroup(rpmfi fi)
Return current file group from file info set iterator.
const char * rpmfiBN(rpmfi fi)
Return current base name from file info set iterator.
char * rstrscat(char **dest, const char *arg,...) RPM_GNUC_NULL_TERMINATED
Concatenate multiple strings with dynamically (re)allocated memory.
FD_t Fdopen(FD_t ofd, const char *fmode)
struct headerToken_s * Header
RPM header and data retrieval types.
const char * rpmfiFN(rpmfi fi)
Return current file name from file info set iterator.
rpm_loff_t rpmfiFSize(rpmfi fi)
Return current file size from file info set iterator.
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set iterator.
static void write_file_content(struct archive *a, char *buf, rpmfi fi)
int main(int argc, char *argv[])
static int process_package(rpmts ts, char *filename)
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
rpmfi rpmfiNewArchiveReader(FD_t fd, rpmfiles files, int itype)
Get new file iterator for looping over the archive content.
rpmfiles rpmfilesFree(rpmfiles fi)
Destroy a file info set.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
#define _RPMVSF_NOSIGNATURES
const char * Fstrerror(FD_t fd)
strerror(3) clone.
rpmfiles rpmfilesNew(rpmstrPool pool, Header h, rpmTagVal tagN, rpmfiFlags flags)
Create and load a file info set.
const char * rpmfiDN(rpmfi fi)
Return current directory name from file info set iterator.
FD_t Fopen(const char *path, const char *fmode)
fopen(3) clone.
static void fill_archive_entry(struct archive *a, struct archive_entry *entry, rpmfi fi)
#define _RPMVSF_NODIGESTS
uint32_t rpmfiFNlink(rpmfi fi)
Return (calculated) current file nlink count from file info set iterator.
struct rpmfiles_s * rpmfiles
int Ferror(FD_t fd)
ferror(3) clone.
int Fclose(FD_t fd)
fclose(3) clone.
rpm_time_t rpmfiFMtime(rpmfi fi)
Return current file modify time from file info set iterator.