tMove all libarchive code to unpack() - pm - barely a pack manager
HTML git clone git://z3bra.org/pm
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit 1e59dea52f46876bd239166d24fdf680bf8965f1
DIR parent cdc9e1e65dc1b8a5d90ea60d708e81f599c0f2bf
HTML Author: z3bra <willyatmailoodotorg>
Date: Tue, 12 Jan 2016 13:35:50 +0100
Move all libarchive code to unpack()
Diffstat:
M pm.c | 57 +++++++++++++++----------------
1 file changed, 28 insertions(+), 29 deletions(-)
---
DIR diff --git a/pm.c b/pm.c
t@@ -58,13 +58,15 @@ int inspect(char *datadir, char *packname);
int write_metadata(char *datadir, struct pack *pack);
int write_entry(struct archive *a, struct archive *w);
-int unpack(struct archive *a, char *metafile, int mask);
-int install(char *rootfs, char *datadir, struct pack *p, int overwrite);
+int unpack(char *datadir, struct pack *p);
+int install(char *rootfs, char *datadir, struct pack *p);
int delete_content(FILE *metafile);
int delete(const char *rootfs, const char *datadir, const char *name);
char *argv0;
+int overwrite = 0;
+
void
usage(char *name)
{
t@@ -313,17 +315,34 @@ write_entry(struct archive *a, struct archive *w)
* Extract a tarball to the given directory
*/
int
-unpack(struct archive *a, char *meta, int mask)
+unpack(char *datadir, struct pack *p)
{
int r, fd;
+ struct archive *a;
struct archive *w;
struct archive_entry *e;
+ char tmp[PATH_MAX] = "";
- if ((fd = open(meta, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
- perror(meta);
+ int mask = ARCHIVE_EXTRACT_PERM
+ |ARCHIVE_EXTRACT_SECURE_NODOTDOT;
+
+ snprintf(tmp, PATH_MAX, "%s/%s/files", datadir, p->name);
+ if ((fd = open(tmp, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
+ perror(tmp);
return -1;
}
+ a = archive_read_new();
+ archive_read_support_filter_bzip2(a);
+ archive_read_support_format_tar(a);
+
+ /* try and open the tarball of our pack */
+ if ((r = archive_read_open_filename(a, p->path, 0)) != ARCHIVE_OK) {
+ fprintf(stderr, "%s: %s\n", p->name, archive_error_string(a));
+ archive_read_free(a);
+ return r;
+ }
+
w = archive_write_disk_new();
archive_write_disk_set_options(w, mask);
t@@ -350,8 +369,8 @@ unpack(struct archive *a, char *meta, int mask)
archive_write_finish_entry(w);
}
- archive_write_close(w);
archive_write_free(w);
+ archive_read_free(a);
return r == ARCHIVE_EOF ? ARCHIVE_OK : r;
}
t@@ -362,18 +381,13 @@ unpack(struct archive *a, char *meta, int mask)
* If overwrite is set to 1, it will overwrite all files
*/
int
-install(char *rootfs, char *datadir, struct pack *p, int overwrite)
+install(char *rootfs, char *datadir, struct pack *p)
{
- struct archive *a;
- char meta[PATH_MAX] = "";
int r;
- int mask = ARCHIVE_EXTRACT_PERM
- |ARCHIVE_EXTRACT_SECURE_NODOTDOT;
if (overwrite == 0) {
if (inspect_collision(rootfs, p) != 0)
return -1;
- mask |= ARCHIVE_EXTRACT_NO_OVERWRITE;
}
/*
t@@ -390,21 +404,7 @@ install(char *rootfs, char *datadir, struct pack *p, int overwrite)
return -1;
}
- a = archive_read_new();
- archive_read_support_filter_bzip2(a);
- archive_read_support_format_tar(a);
-
- /* try and open the tarball of our pack */
- if ((r = archive_read_open_filename(a, p->path, 0)) != ARCHIVE_OK) {
- fprintf(stderr, "%s: %s\n", p->name, archive_error_string(a));
- return r;
- }
-
- snprintf(meta, PATH_MAX, "%s/%s/files", datadir, p->name);
- r = unpack(a, meta, mask);
-
- archive_read_close(a);
- archive_read_free(a);
+ r = unpack(datadir, p);
return r;
}
t@@ -581,7 +581,6 @@ pack_free(struct pack *p)
int
main (int argc, char **argv)
{
- int overwrite = 0;
char *n = NULL;
struct pack *p = NULL;
uint8_t action = ACTION_INSPECT;
t@@ -609,7 +608,7 @@ main (int argc, char **argv)
case ACTION_INSTALL:
while (*argv) {
if ((p = pack_load(*(argv++)))) {
- install(PACK_ROOT, PACK_DATA, p, overwrite);
+ install(PACK_ROOT, PACK_DATA, p);
pack_free(p);
}
}