This patch adds error() API implementation for non-glibc system C libs

Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>

---
 misc-utils/test_uuidd.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/misc-utils/test_uuidd.c b/misc-utils/test_uuidd.c
index 36f3b3d..7d579ce 100644
--- a/misc-utils/test_uuidd.c
+++ b/misc-utils/test_uuidd.c
@@ -23,7 +23,6 @@
  *
  *	make uuidd uuidgen localstatedir=/var
  */
-#include <error.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -38,6 +37,17 @@
 #include "xalloc.h"
 #include "strutils.h"
 
+#ifdef __GLIBC__
+#include <error.h>
+#else
+extern void (*error_print_progname)(void);
+extern unsigned int error_message_count;
+extern int error_one_per_line;
+
+void error(int, int, const char *, ...);
+void error_at_line(int, int, const char *, unsigned int, const char *, ...);
+#endif
+
 #define LOG(level,args) if (loglev >= level) { fprintf args; }
 
 size_t nprocesses = 4;
@@ -256,6 +266,56 @@ static void object_dump(size_t idx, object_t *obj)
 	fprintf(stderr, "}\n");
 }
 
+#ifndef __GLIBC__
+extern char *__progname;
+
+void (*error_print_progname)(void) = 0;
+unsigned int error_message_count = 0;
+int error_one_per_line = 0;
+
+static void eprint(int status, int e, const char *file, unsigned int line, const char *fmt, va_list ap)
+{
+	if (file && error_one_per_line) {
+		static const char *oldfile;
+		static unsigned int oldline;
+		if (line == oldline && strcmp(file, oldfile) == 0)
+			return;
+		oldfile = file;
+		oldline = line;
+	}
+	if (error_print_progname)
+		error_print_progname();
+	else
+		fprintf(stderr, "%s: ", __progname);
+	if (file)
+		fprintf(stderr, "%s:%u: ", file, line);
+	vfprintf(stderr, fmt, ap);
+	if (e)
+		fprintf(stderr, ": %s", strerror(e));
+	putc('\n', stderr);
+	fflush(stderr);
+	error_message_count++;
+	if (status)
+		exit(status);
+}
+
+void error(int status, int e, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap,fmt);
+	eprint(status, e, 0, 0, fmt, ap);
+	va_end(ap);
+}
+
+void error_at_line(int status, int e, const char *file, unsigned int line, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap,fmt);
+	eprint(status, e, file, line, fmt, ap);
+	va_end(ap);
+}
+#endif /* __GLIBC__ */
+
 int main(int argc, char *argv[])
 {
 	size_t i, nfailed = 0, nignored = 0;
-- 
2.8.3

