aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-10-29 13:11:36 -0700
committerJunio C Hamano <junkio@cox.net>2005-10-29 13:11:36 -0700
commit52e4478dbd3425332ed4ef6a4cadeb034ee8c4b6 (patch)
tree30a6e96879878f1fa17b7bf0eb69ecd570bbd9ae
parent0ffdbbfe36a25682cbb2e6b18b9217c93c97b424 (diff)
downloadgit-52e4478dbd3425332ed4ef6a4cadeb034ee8c4b6.tar.gz
git-52e4478dbd3425332ed4ef6a4cadeb034ee8c4b6.tar.xz
Do not mmap-copy the whole thing; just use copy_fd()
Signed-off-by: Junio C Hamano <junkio@cox.net>
-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