Skip to content

Commit

Permalink
Replacing the system call pread() with lseek()/xread()/lseek() sequence.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
Stefan-W. Hahn authored and Junio C Hamano committed Jan 10, 2007
1 parent 0bdb28c commit 6900679
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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.
#
Expand Down Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions compat/pread.c
Original file line number Diff line number Diff line change
@@ -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;
}
5 changes: 5 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 6900679

Please sign in to comment.