aports/testing/hidrd/fix-check.patch
TBK f4e79e398d testing/hidrd: upgrade to 0.2.0_git20190603
Last release was in May 2010...
2021-02-03 01:27:24 +00:00

198 lines
4.5 KiB
Diff

musl libc does currently not have an equivalent of GNU Libc's error.h
The following is a mix of a workaround from aufs (https://sourceforge.net/p/aufs/aufs-util/ci/aufs4.14/tree/extlib/non-glibc/)
and the stranded error.{h,c} implementation https://www.openwall.com/lists/musl/2019/08/06/21
--- a/lib/fmt/xml_test.c
+++ b/lib/fmt/xml_test.c
@@ -25,7 +25,11 @@
#include <stdint.h>
#include <string.h>
#include <errno.h>
+#ifdef __GNU_LIBRARY__
#include <error.h>
+#else
+#include "hidrd/util/error_at_line.h"
+#endif
#include <stdio.h>
#include "hidrd/fmt/xml.h"
--- a/lib/item/any_test.c
+++ b/lib/item/any_test.c
@@ -27,7 +27,11 @@
#include <stdint.h>
#include <string.h>
#include <errno.h>
+#ifdef __GNU_LIBRARY__
#include <error.h>
+#else
+#include "hidrd/util/error_at_line.h"
+#endif
#include <stdio.h>
#include "hidrd/item.h"
--- a/lib/opt/test.c
+++ b/lib/opt/test.c
@@ -26,7 +26,11 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#ifdef __GNU_LIBRARY__
#include <error.h>
+#else
+#include "hidrd/util/error_at_line.h"
+#endif
#include <stdio.h>
#include "hidrd/opt/spec_list.h"
#include "hidrd/opt/list.h"
--- a/lib/util/num_test.c
+++ b/lib/util/num_test.c
@@ -23,7 +23,11 @@
*/
#include <assert.h>
+#ifdef __GNU_LIBRARY__
#include <error.h>
+#else
+#include "hidrd/util/error_at_line.h"
+#endif
#include <stdlib.h>
#include <string.h>
#include "hidrd/util/num.h"
--- a/lib/util/ttbl_test.c
+++ b/lib/util/ttbl_test.c
@@ -24,7 +24,11 @@
#include <assert.h>
#include <errno.h>
+#ifdef __GNU_LIBRARY__
#include <error.h>
+#else
+#include "hidrd/util/error_at_line.h"
+#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
--- a/lib/opt/Makefile.am
+++ b/lib/opt/Makefile.am
@@ -36,7 +36,7 @@
TESTS = hidrd_opt_test
-hidrd_opt_test_SOURCES = test.c
+hidrd_opt_test_SOURCES = test.c ../util/error_at_line.c
hidrd_opt_test_LDADD = $(lib_LTLIBRARIES)
bin_PROGRAMS =
--- a/lib/util/Makefile.am
+++ b/lib/util/Makefile.am
@@ -39,10 +39,10 @@
bin_PROGRAMS =
check_PROGRAMS = hidrd_num_test hidrd_ttbl_test
-hidrd_num_test_SOURCES = num_test.c
+hidrd_num_test_SOURCES = num_test.c error_at_line.c
hidrd_num_test_LDADD = $(lib_LTLIBRARIES)
-hidrd_ttbl_test_SOURCES = ttbl_test.c
+hidrd_ttbl_test_SOURCES = ttbl_test.c error_at_line.c
hidrd_ttbl_test_LDADD = $(lib_LTLIBRARIES)
TESTS = hidrd_num_test hidrd_ttbl_test
--- /dev/null
+++ b/lib/util/error_at_line.c
@@ -0,0 +1,69 @@
+#include "hidrd/util/error_at_line.h"
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void (*error_print_progname) (void) = 0;
+unsigned int error_message_count = 0;
+int error_one_per_line = 0;
+
+static unsigned int saved_linenum = 0;
+static const char *saved_file = 0;
+
+static void errorv(int status, int errnum, const char *file, unsigned int linenum, const char *fmt, va_list ap)
+{
+ ++error_message_count;
+
+ fflush(stdout);
+ flockfile(stderr);
+
+ if (error_print_progname)
+ error_print_progname();
+ else {
+ fprintf(stderr, "%s:", program_invocation_name);
+ if (!file)
+ fputc(' ', stderr);
+ }
+
+ if (file)
+ fprintf(stderr, "%s:%u: ", file, linenum);
+
+ vfprintf(stderr, fmt, ap);
+ if (errnum)
+ fprintf(stderr, ": %s", strerror(errnum));
+ fputc('\n', stderr);
+
+ funlockfile(stderr);
+
+ if (status)
+ exit(status);
+}
+
+void error(int status, int errnum, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ errorv(status, errnum, NULL, 0, fmt, ap);
+ va_end(ap);
+}
+
+void error_at_line(int status, int errnum, const char *file, unsigned int linenum, const char *fmt, ...)
+{
+ if (error_one_per_line) {
+ if(saved_linenum == linenum && file != NULL &&
+ saved_file != NULL && !strcmp(file, saved_file))
+ return;
+ saved_linenum = linenum;
+ // Assuming that the lifetime of the passed in file name extends
+ // until the next call is rather questionable, but appears to be
+ // the expected semantics.
+ saved_file = file;
+ }
+
+ va_list ap;
+ va_start(ap, fmt);
+ errorv(status, errnum, file, linenum, fmt, ap);
+ va_end(ap);
+}
--- /dev/null
+++ b/include/hidrd/util/error_at_line.h
@@ -0,0 +1,21 @@
+#ifndef _ERROR_H
+#define _ERROR_H
+
+#include <features.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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 *, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif