public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v3] handle libc implemntations which do not provide `error.h`
@ 2021-08-27 15:35 Saleem Abdulrasool
  0 siblings, 0 replies; only message in thread
From: Saleem Abdulrasool @ 2021-08-27 15:35 UTC (permalink / raw)
  To: elfutils-devel

Introduce a configure time check for the presence of `error.h`.  In the
case that `error.h` is not available, we can fall back to `err.h`.
Although `err.h` is not a C standard header (it is a BSD extension),
many libc implementations provide.  If there are targets which do not
provide an implementation of `err.h`, it would be possible to further
extend the implementation to be more portable.

This partially resolves bug #21008.

Signed-off-by: Saleem Abdulrasool <abdulras@google.com>
---
 configure.ac    |  3 +++
 lib/ChangeLog   |  7 +++++++
 lib/Makefile.am |  2 +-
 lib/error.c     | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/system.h    | 13 ++++++++++++-
 5 files changed, 72 insertions(+), 2 deletions(-)
 create mode 100644 lib/error.c

diff --git a/configure.ac b/configure.ac
index 7caff2c5..177bb1a2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -431,6 +431,9 @@ AC_CHECK_DECLS([reallocarray],[],[],
 
 AC_CHECK_FUNCS([process_vm_readv])
 
+AC_CHECK_HEADERS([error.h])
+AC_CHECK_HEADERS([err.h])
+
 old_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -D_GNU_SOURCE"
 AC_FUNC_STRERROR_R()
diff --git a/lib/ChangeLog b/lib/ChangeLog
index a95f8041..101a4e6f 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,10 @@
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* error.c: New file, adds error_number_count and error fallbacks.
+	* system.h: Declare error_number_count and error fallbacks for when
+	error.h is unavailable.
+	* Makefile.am (libeu_a_SOURCES): add error.c.
+
 2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
 
 	* fixedsizehash.h: Remove sys/cdefs.h include. Unconditionally
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 97bf7329..766fbcd7 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -35,7 +35,7 @@ noinst_LIBRARIES = libeu.a
 
 libeu_a_SOURCES = xstrdup.c xstrndup.c xmalloc.c next_prime.c \
 		  crc32.c crc32_file.c \
-		  color.c printversion.c
+		  color.c error.c printversion.c
 
 noinst_HEADERS = fixedsizehash.h libeu.h system.h dynamicsizehash.h list.h \
 		 eu-config.h color.h printversion.h bpf.h \
diff --git a/lib/error.c b/lib/error.c
new file mode 100644
index 00000000..b0264efb
--- /dev/null
+++ b/lib/error.c
@@ -0,0 +1,49 @@
+/* Definitions for error handling fallback functions.
+   Copyright (C) 2021 Google, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#if !defined(HAVE_ERROR_H) && defined(HAVE_ERR_H)
+#include <stdarg.h>
+#include <stdlib.h>
+#include <err.h>
+
+unsigned int error_message_count = 0;
+
+void error(int status, int errnum, const char *format, ...) {
+  va_list argp;
+
+  va_start(argp, format);
+  verr(status, format, argp);
+  va_end(argp);
+
+  if (status)
+    exit(status);
+  ++error_message_count;
+}
+#endif
diff --git a/lib/system.h b/lib/system.h
index 58d9deee..edbc8488 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -29,8 +29,9 @@
 #ifndef LIB_SYSTEM_H
 #define LIB_SYSTEM_H	1
 
+#include <config.h>
+
 #include <errno.h>
-#include <error.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/param.h>
@@ -38,8 +39,18 @@
 #include <byteswap.h>
 #include <unistd.h>
 #include <string.h>
+#include <stdarg.h>
 #include <stdlib.h>
 
+#if defined(HAVE_ERROR_H)
+#include <error.h>
+#elif defined(HAVE_ERR_H)
+extern int error_message_count;
+void error(int status, int errnum, const char *format, ...);
+#else
+#error "err.h or error.h must be available"
+#endif
+
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 # define LE32(n)	(n)
 # define LE64(n)	(n)
-- 
2.33.0.259.gc128427fd7-goog


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-08-27 15:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-27 15:35 [PATCH v3] handle libc implemntations which do not provide `error.h` Saleem Abdulrasool

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).