blob: a6fde5d9cba71a92f351c1735d79e7eabd72a522 [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>
---
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