From 65e69153ddab1cd4ae540d02ac2d030638aab3cc Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
Date: Sat, 1 Oct 2016 19:53:52 -0700
Subject: [PATCH] getprogname: correct the test for a __progname variable

* m4/getprogname.m4 (gl_FUNC_GETPROGNAME): Use AC_CACHE_CHECK
and AC_LINK_IFELSE to check for a global __progname.  If found,
define HAVE_VAR___PROGNAME.
* lib/getprogname.c (getprogname): Reflect the new name of the
preprocessor symbol: s/HAVE_DECL___PROGNAME/HAVE_VAR___PROGNAME/
Assaf Gordon reported that the erroneous prior check caused
link failure on AIX 7 in
https://lists.gnu.org/archive/html/grep-devel/2016-10/msg00001.html
---
 ChangeLog         | 10 ++++++++++
 lib/getprogname.c |  2 +-
 m4/getprogname.m4 | 35 ++++++++++++++++++++++++++++++-----
 3 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e9b4c80fee..7c848c46cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2016-10-01  Jim Meyering  <meyering@fb.com>
+
+	getprogname: correct the test for a __progname variable
+	* m4/getprogname.m4 (gl_FUNC_GETPROGNAME): Use AC_CACHE_CHECK
+	and AC_LINK_IFELSE to check for a global __progname.  If found,
+	define HAVE_VAR___PROGNAME.
+	* lib/getprogname.c (getprogname): Reflect the new name of the
+	feature- checked preprocessor symbol:
+	s/HAVE_DECL___PROGNAME/HAVE_VAR___PROGNAME/
+
 2016-09-28  Jim Meyering  <meyering@fb.com>
 
 	u8-uctomb-aux.c: build: placate GCC 7's new -Wimplicit-fallthrough
diff --git a/lib/getprogname.c b/lib/getprogname.c
index 7de231768f..97a6aef943 100644
--- a/lib/getprogname.c
+++ b/lib/getprogname.c
@@ -47,7 +47,7 @@ getprogname (void)
 # elif HAVE_DECL___ARGV
   const char *p = __argv && __argv[0] ? __argv[0] : "?";
   return last_component (p);
-# elif HAVE_DECL___PROGNAME
+# elif HAVE_VAR___PROGNAME
   /* Be careful to declare this only when we absolutely need it
      (OpenBSD 5.1), rather than when it's available.  Otherwise,
      its mere declaration makes program_invocation_short_name
diff --git a/m4/getprogname.m4 b/m4/getprogname.m4
index ec3ac8fb21..f027037fc6 100644
--- a/m4/getprogname.m4
+++ b/m4/getprogname.m4
@@ -5,14 +5,39 @@
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
+# serial 4
 
 AC_DEFUN([gl_FUNC_GETPROGNAME],
 [
   AC_CHECK_FUNCS_ONCE([getprogname getexecname])
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-  AC_CHECK_DECLS([program_invocation_name], [], [], [#include <errno.h>])
-  AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include <errno.h>])
-  AC_CHECK_DECLS([__argv], [], [], [#include <stdlib.h>])
-  AC_CHECK_DECLS([__progname], [], [], [char *__progname;])
+  ac_found=0
+  AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [],
+    [#include <errno.h>])
+  AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [],
+    [#include <errno.h>])
+  AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include <stdlib.h>])
+
+  # Incur the cost of this test only if none of the above worked.
+  if test $ac_found = 0; then
+    # On OpenBSD 5.1, using the global __progname variable appears to be
+    # the only way to implement getprogname.
+    AC_CACHE_CHECK([whether __progname is defined in default libraries],
+      [gl_cv_var___progname],
+      [
+        gl_cv_var___progname=
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+            [[extern char *__progname;]],
+            [[return *__progname;]]
+          )],
+          [gl_cv_var___progname=yes]
+        )
+      ]
+    )
+    if test "$gl_cv_var___progname" = yes; then
+      AC_DEFINE([HAVE_VAR___PROGNAME], 1,
+        [Define if you have a global __progname variable])
+    fi
+  fi
 ])
-- 
2.39.5