From 98f36517251b5bccdb80d90d698c173c18ee4a29 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Aug 2003 00:26:05 +0000 Subject: implemented merging an patch making git-svn-id: file:///home/lennart/svn/public/syrep/trunk@9 07ea20a6-d2c5-0310-9e02-9ef735347d72 --- src/extract.c | 93 ++++------------------------------------------------------- 1 file changed, 5 insertions(+), 88 deletions(-) (limited to 'src/extract.c') diff --git a/src/extract.c b/src/extract.c index 06d95df..616b8d1 100644 --- a/src/extract.c +++ b/src/extract.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -10,91 +9,7 @@ #include "package.h" #include "extract.h" - -#define MMAPSIZE (100*1024*1024) -#define BUFSIZE (1024*1024) - -int copy_file(const char *src, const char *dst, uint32_t l) { - int sfd = -1, dfd = -1, r = -1; - uint32_t m; - off_t o; - void *src_p, *dst_p; - void *buf = NULL; - - if ((sfd = open(src, O_RDONLY)) < 0) { - fprintf(stderr, "open(%s, O_RDONLY): %s\n", src, strerror(errno)); - goto finish; - } - - if ((dfd = open(dst, O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) { - fprintf(stderr, "open(%s, O_WRONLY): %s\n", dst, strerror(errno)); - goto finish; - } - - if (ftruncate(dfd, l) < 0) { - fprintf(stderr, "ftruncate(): %s\n", strerror(errno)); - goto finish; - } - - o = 0; - m = l < MMAPSIZE ? l : MMAPSIZE; - - while (l > 0) { - if ((src_p = mmap(NULL, m, PROT_READ, MAP_SHARED, sfd, o)) == MAP_FAILED) - break; - - if ((dst_p = mmap(NULL, m, PROT_READ|PROT_WRITE, MAP_SHARED, dfd, o)) == MAP_FAILED) { - munmap(src_p, m); - break; - } - - memcpy(dst_p, src_p, m); - - munmap(src_p, m); - munmap(dst_p, m); - - o += m; - l -= m; - m = l < MMAPSIZE ? l : MMAPSIZE; - } - - if (l > 0) { - fprintf(stderr, "mmap() failed: %s\n", strerror(errno)); - - if (!(buf = malloc(BUFSIZE))) - goto finish; - - for (;;) { - ssize_t r; - - if ((m = read(sfd, buf, BUFSIZE)) < 0) { - fprintf(stderr, "read(): %s\n", strerror(errno)); - goto finish; - } - - if (!m) - break; - - if ((r = write(dfd, buf, m)) < 0) { - fprintf(stderr, "write(): %s\n", strerror(errno)); - goto finish; - } - } - } - - - r = 0; - -finish: - - if (sfd >= 0) - close(sfd); - - if (dfd >= 0) - close(dfd); - - return r; -} +#include "util.h" static int cb(struct package *p, const char *name, const char *path, void *u) { struct stat st; @@ -110,8 +25,10 @@ static int cb(struct package *p, const char *name, const char *path, void *u) { } else size = (uint32_t) st.st_size; - if (size) - return copy_file(path, name, size); + if (size) { + fprintf(stderr, "Extracting %s ...\n", name); + return copy_file(path, name); + } return 0; } -- cgit