Browse Source

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>
maint
Stefan-W. Hahn 18 years ago committed by Junio C Hamano
parent
commit
6900679c2f
  1. 7
      Makefile
  2. 18
      compat/pread.c
  3. 5
      git-compat-util.h

7
Makefile

@ -69,6 +69,9 @@ all: @@ -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 @@ -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

@ -0,0 +1,18 @@ @@ -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
git-compat-util.h

@ -107,6 +107,11 @@ extern int git_munmap(void *start, size_t length); @@ -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…
Cancel
Save