Replacing the system call pread() with lseek()/xread()/lseek() sequence.
Using cygwin with cygwin.dll before 1.5.22 the system call pread() is buggy. This patch introduces NO_PREAD. If NO_PREAD is set git uses a sequence of lseek()/xread()/lseek() to emulate pread. Signed-off-by: Stefan-W. Hahn <stefan.hahn@s-hahn.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
0bdb28c9cc
commit
6900679c2f
7
Makefile
7
Makefile
@ -69,6 +69,9 @@ all:
|
||||
#
|
||||
# Define NO_MMAP if you want to avoid mmap.
|
||||
#
|
||||
# Define NO_PREAD if you have a problem with pread() system call (e.g.
|
||||
# cygwin.dll before v1.5.22).
|
||||
#
|
||||
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
|
||||
# generally faster on your platform than accessing the working directory.
|
||||
#
|
||||
@ -523,6 +526,10 @@ ifdef NO_MMAP
|
||||
COMPAT_CFLAGS += -DNO_MMAP
|
||||
COMPAT_OBJS += compat/mmap.o
|
||||
endif
|
||||
ifdef NO_PREAD
|
||||
COMPAT_CFLAGS += -DNO_PREAD
|
||||
COMPAT_OBJS += compat/pread.o
|
||||
endif
|
||||
ifdef NO_FAST_WORKING_DIRECTORY
|
||||
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
|
||||
endif
|
||||
|
18
compat/pread.c
Normal file
18
compat/pread.c
Normal file
@ -0,0 +1,18 @@
|
||||
#include "../git-compat-util.h"
|
||||
|
||||
ssize_t git_pread(int fd, void *buf, size_t count, off_t offset)
|
||||
{
|
||||
off_t current_offset;
|
||||
ssize_t rc;
|
||||
|
||||
current_offset = lseek(fd, 0, SEEK_CUR);
|
||||
|
||||
if (lseek(fd, offset, SEEK_SET) < 0)
|
||||
return -1;
|
||||
|
||||
rc = read_in_full(fd, buf, count);
|
||||
|
||||
if (current_offset != lseek(fd, current_offset, SEEK_SET))
|
||||
return -1;
|
||||
return rc;
|
||||
}
|
@ -107,6 +107,11 @@ extern int git_munmap(void *start, size_t length);
|
||||
#define DEFAULT_PACKED_GIT_LIMIT \
|
||||
((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
|
||||
|
||||
#ifdef NO_PREAD
|
||||
#define pread git_pread
|
||||
extern ssize_t git_pread(int fd, void *buf, size_t count, off_t offset);
|
||||
#endif
|
||||
|
||||
#ifdef NO_SETENV
|
||||
#define setenv gitsetenv
|
||||
extern int gitsetenv(const char *, const char *, int);
|
||||
|
Loading…
Reference in New Issue
Block a user