diff options
author | Junio C Hamano <junkio@cox.net> | 2005-10-29 13:11:36 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-10-29 13:11:36 -0700 |
commit | 52e4478dbd3425332ed4ef6a4cadeb034ee8c4b6 (patch) | |
tree | 30a6e96879878f1fa17b7bf0eb69ecd570bbd9ae | |
parent | 0ffdbbfe36a25682cbb2e6b18b9217c93c97b424 (diff) | |
download | git-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.c | 28 |
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 |