зеркало из https://github.com/microsoft/git.git
git-compat-util: work around fileno(fp) that is a macro
On various BSD's, fileno(fp) is implemented as a macro that directly accesses the fields in the FILE * object, which breaks a function that accepts a "void *fp" parameter and calls fileno(fp) and expect it to work. Work it around by adding a compile-time knob FILENO_IS_A_MACRO that inserts a real helper function in the middle of the callchain. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
0d0ac3826a
Коммит
18a4f6be6b
7
Makefile
7
Makefile
|
@ -427,6 +427,8 @@ all::
|
||||||
#
|
#
|
||||||
# Define HAVE_GETDELIM if your system has the getdelim() function.
|
# Define HAVE_GETDELIM if your system has the getdelim() function.
|
||||||
#
|
#
|
||||||
|
# Define FILENO_IS_A_MACRO if fileno() is a macro, not a real function.
|
||||||
|
#
|
||||||
# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
|
# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
|
||||||
# default environment variables to be passed when a pager is spawned, e.g.
|
# default environment variables to be passed when a pager is spawned, e.g.
|
||||||
#
|
#
|
||||||
|
@ -1773,6 +1775,11 @@ ifdef HAVE_WPGMPTR
|
||||||
BASIC_CFLAGS += -DHAVE_WPGMPTR
|
BASIC_CFLAGS += -DHAVE_WPGMPTR
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef FILENO_IS_A_MACRO
|
||||||
|
COMPAT_CFLAGS += -DFILENO_IS_A_MACRO
|
||||||
|
COMPAT_OBJS += compat/fileno.o
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(TCLTK_PATH),)
|
ifeq ($(TCLTK_PATH),)
|
||||||
NO_TCLTK = NoThanks
|
NO_TCLTK = NoThanks
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#define COMPAT_CODE
|
||||||
|
#include "../git-compat-util.h"
|
||||||
|
|
||||||
|
int git_fileno(FILE *stream)
|
||||||
|
{
|
||||||
|
return fileno(stream);
|
||||||
|
}
|
|
@ -221,6 +221,7 @@ ifeq ($(uname_S),FreeBSD)
|
||||||
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
||||||
PAGER_ENV = LESS=FRX LV=-c MORE=FRX
|
PAGER_ENV = LESS=FRX LV=-c MORE=FRX
|
||||||
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
||||||
|
FILENO_IS_A_MACRO = UnfortunatelyYes
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),OpenBSD)
|
ifeq ($(uname_S),OpenBSD)
|
||||||
NO_STRCASESTR = YesPlease
|
NO_STRCASESTR = YesPlease
|
||||||
|
@ -233,6 +234,7 @@ ifeq ($(uname_S),OpenBSD)
|
||||||
HAVE_BSD_SYSCTL = YesPlease
|
HAVE_BSD_SYSCTL = YesPlease
|
||||||
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
||||||
PROCFS_EXECUTABLE_PATH = /proc/curproc/file
|
PROCFS_EXECUTABLE_PATH = /proc/curproc/file
|
||||||
|
FILENO_IS_A_MACRO = UnfortunatelyYes
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),MirBSD)
|
ifeq ($(uname_S),MirBSD)
|
||||||
NO_STRCASESTR = YesPlease
|
NO_STRCASESTR = YesPlease
|
||||||
|
|
|
@ -1220,6 +1220,14 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
|
||||||
#define getc_unlocked(fh) getc(fh)
|
#define getc_unlocked(fh) getc(fh)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FILENO_IS_A_MACRO
|
||||||
|
int git_fileno(FILE *stream);
|
||||||
|
# ifndef COMPAT_CODE
|
||||||
|
# undef fileno
|
||||||
|
# define fileno(p) git_fileno(p)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Our code often opens a path to an optional file, to work on its
|
* Our code often opens a path to an optional file, to work on its
|
||||||
* contents when we can successfully open it. We can ignore a failure
|
* contents when we can successfully open it. We can ignore a failure
|
||||||
|
|
Загрузка…
Ссылка в новой задаче