blob: 1b0ff79d4274fdea2f7ce2585b98478bc4040604 [file] [log] [blame]
This patch adds error() API implementation for non-glibc system C libs
Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Index: util-linux-2.27.1/tests/helpers/test_uuidd.c
===================================================================
--- util-linux-2.27.1.orig/tests/helpers/test_uuidd.c
+++ util-linux-2.27.1/tests/helpers/test_uuidd.c
@@ -23,7 +23,6 @@
*
* make uuidd uuidgen localstatedir=/var
*/
-#include <error.h>
#include <libgen.h>
#include <pthread.h>
#include <stdio.h>
@@ -39,6 +38,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;
@@ -257,6 +267,56 @@ static void object_dump(size_t idx, obje
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;