git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git v2.21.0-rc0 broken on *BSD, maybe others

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 12, 2019, 18:42 UTC
Message-ID
<xmqqr2ccdf25.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<xmqqlg2ldjg4.fsf@gitster-ct.c.googlers.com>
Junio C Hamano <gitster@pobox.com> writes:
> If I find time later in the day, I may forge your sign-off and
> fabricate log messages for both patches, but unfortunately I need to
> run a long errand today during the day, so it may not happen.
And here is the other one.  I have the s/is/if/ typofix already in there.
-- >8 --
From: Duy Nguyen <pclouds@gmail.com>
Date: Tue, 12 Feb 2019 21:14:41 +0700
Subject: [PATCH] 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>
---
 Makefile          | 7 +++++++
 compat/fileno.c   | 7 +++++++
 config.mak.uname  | 2 ++
 git-compat-util.h | 8 ++++++++
 4 files changed, 24 insertions(+)
 create mode 100644 compat/fileno.c
diff --git a/Makefile b/Makefile
index 1a44c811aa..08d9961425 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 0000000000..7b105f4cd7
--- /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 3ee7da0e23..23eac5ac9d 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 09b0102cae..7899f42f5e 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
-- 
2.21.0-rc0-36-ge9bd4aa026
Previous: Junio C HamanoNext: Junio C Hamano
Message 16 of 20 in “[ANNOUNCE] Git v2.21.0-rc0”
  1. Junio C HamanoFeb 7, 2019
  2. Christian CouderFeb 7, 2019
  3. Johannes SchindelinFeb 7, 2019
  4. Johannes SchindelinFeb 7, 2019
  5. Junio C HamanoFeb 7, 2019
  6. Junio C HamanoFeb 7, 2019
  7. Git v2.21.0-rc0 broken on *BSD, maybe othersÆvar Arnfjörð Bjarmason, Feb 12, 2019
  8. Duy NguyenFeb 12, 2019
  9. Duy NguyenFeb 12, 2019
  10. Ævar Arnfjörð BjarmasonFeb 12, 2019
  11. Ævar Arnfjörð BjarmasonFeb 12, 2019
  12. SZEDER GáborFeb 12, 2019
  13. Johannes SchindelinFeb 13, 2019
  14. Junio C HamanoFeb 12, 2019
  15. Junio C HamanoFeb 12, 2019
  16. Junio C HamanoFeb 12, 2019
  17. Junio C HamanoFeb 12, 2019
  18. Junio C HamanoFeb 12, 2019
  19. SZEDER GáborFeb 12, 2019
  20. Ævar Arnfjörð BjarmasonFeb 12, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.