1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-06-10 20:26:14 +02:00

Do not mmap-copy the whole thing; just use copy_fd()

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2005-10-29 13:11:36 -07:00
parent 0ffdbbfe36
commit 52e4478dbd

View File

@ -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