| 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; |