summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuy Nguyen <pclouds@gmail.com>2019-02-12 14:14:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-02-12 18:01:59 (GMT)
commit18a4f6be6b4cfc34de6f80c36ab3ef951a0f7164 (patch)
tree8ba3c3bc28c1eae9f19ce47e7fca682ee0e4a895
parent0d0ac3826a3bbb9247e39e12623bbcfdd722f24c (diff)
downloadgit-18a4f6be6b4cfc34de6f80c36ab3ef951a0f7164.zip
git-18a4f6be6b4cfc34de6f80c36ab3ef951a0f7164.tar.gz
git-18a4f6be6b4cfc34de6f80c36ab3ef951a0f7164.tar.bz2
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>
-rw-r--r--Makefile7
-rw-r--r--compat/fileno.c7
-rw-r--r--config.mak.uname2
-rw-r--r--git-compat-util.h8
4 files changed, 24 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index 1a44c81..08d9961 100644
--- a/Makefile
+++ b/Makefile
@@ -427,6 +427,8 @@ all::
#
# 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
# default environment variables to be passed when a pager is spawned, e.g.
#
@@ -1773,6 +1775,11 @@ ifdef HAVE_WPGMPTR
BASIC_CFLAGS += -DHAVE_WPGMPTR
endif
+ifdef FILENO_IS_A_MACRO
+ COMPAT_CFLAGS += -DFILENO_IS_A_MACRO
+ COMPAT_OBJS += compat/fileno.o
+endif
+
ifeq ($(TCLTK_PATH),)
NO_TCLTK = NoThanks
endif
diff --git a/compat/fileno.c b/compat/fileno.c
new file mode 100644
index 0000000..7b105f4
--- /dev/null
+++ b/compat/fileno.c
@@ -0,0 +1,7 @@
+#define COMPAT_CODE
+#include "../git-compat-util.h"
+
+int git_fileno(FILE *stream)
+{
+ return fileno(stream);
+}
diff --git a/config.mak.uname b/config.mak.uname
index 3ee7da0..23eac5a 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -221,6 +221,7 @@ ifeq ($(uname_S),FreeBSD)
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
PAGER_ENV = LESS=FRX LV=-c MORE=FRX
FREAD_READS_DIRECTORIES = UnfortunatelyYes
+ FILENO_IS_A_MACRO = UnfortunatelyYes
endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease
@@ -233,6 +234,7 @@ ifeq ($(uname_S),OpenBSD)
HAVE_BSD_SYSCTL = YesPlease
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
PROCFS_EXECUTABLE_PATH = /proc/curproc/file
+ FILENO_IS_A_MACRO = UnfortunatelyYes
endif
ifeq ($(uname_S),MirBSD)
NO_STRCASESTR = YesPlease
diff --git a/git-compat-util.h b/git-compat-util.h
index 09b0102..7899f42 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1220,6 +1220,14 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
#define getc_unlocked(fh) getc(fh)
#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
* contents when we can successfully open it. We can ignore a failure