aboutsummaryrefslogtreecommitdiff
path: root/local-fetch.c
diff options
context:
space:
mode:
Diffstat (limited to 'local-fetch.c')
-rw-r--r--local-fetch.c28
1 files changed, 10 insertions, 18 deletions
diff --git a/local-fetch.c b/local-fetch.c
index 0a071144b..093110914 100644
--- a/local-fetch.c
+++ b/local-fetch.c
@@ -83,31 +83,23 @@ static int copy_file(const char *source, char *dest, const char *hex,
}
}
if (use_filecopy) {
- int ifd, ofd, status;
- struct stat st;
- void *map;
+ int ifd, ofd, status = 0;
+
ifd = open(source, O_RDONLY);
- if (ifd < 0 || fstat(ifd, &st) < 0) {
- int err = errno;
- if (ifd >= 0)
- close(ifd);
- if (!warn_if_not_exists && err == ENOENT)
+ if (ifd < 0) {
+ if (!warn_if_not_exists && errno == ENOENT)
return -1;
fprintf(stderr, "cannot open %s\n", source);
return -1;
}
- map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, ifd, 0);
- close(ifd);
- if (map == MAP_FAILED) {
- fprintf(stderr, "cannot mmap %s\n", source);
+ ofd = open(dest, O_WRONLY | O_CREAT | O_EXCL, 0666);
+ if (ofd < 0) {
+ fprintf(stderr, "cannot open %s\n", dest);
+ close(ifd);
return -1;
}
- ofd = open(dest, O_WRONLY | O_CREAT | O_EXCL, 0666);
- status = ((ofd < 0) ||
- (write(ofd, map, st.st_size) != st.st_size));
- munmap(map, st.st_size);
- if (ofd >= 0)
- close(ofd);
+ status = copy_fd(ifd, ofd);
+ close(ofd);
if (status)
fprintf(stderr, "cannot write %s\n", dest);
else