summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2004-03-11 10:10:53 +0000
committerManuel Novoa III <mjn3@codepoet.org>2004-03-11 10:10:53 +0000
commit93261cdf00778d5706a72bbbeb3a379bfaad948c (patch)
tree8d518dd6ca978884ebeddfccdbb802df4c8dcc13
parent79248fe718689c31c3df3d24bfbc6f147bc345e7 (diff)
Rewrite the err/warn functions as they were broken (__noreturn__ funcs
were returning). Anyway, also make them threadsafe and smaller. The error.c file still needs work.
-rw-r--r--libc/misc/error/Makefile2
-rw-r--r--libc/misc/error/err.c110
-rw-r--r--libc/misc/error/error.c75
3 files changed, 111 insertions, 76 deletions
diff --git a/libc/misc/error/Makefile b/libc/misc/error/Makefile
index 754010688..880fd58df 100644
--- a/libc/misc/error/Makefile
+++ b/libc/misc/error/Makefile
@@ -19,7 +19,7 @@
TOPDIR=../../../
include $(TOPDIR)Rules.mak
-CSRC=error.c
+CSRC=error.c err.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
diff --git a/libc/misc/error/err.c b/libc/misc/error/err.c
new file mode 100644
index 000000000..5c53e545f
--- /dev/null
+++ b/libc/misc/error/err.c
@@ -0,0 +1,110 @@
+/* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org>
+ *
+ * GNU Library General Public License (LGPL) version 2 or later.
+ *
+ * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <err.h>
+#ifdef __UCLIBC_HAS_THREADS__
+#include <pthread.h>
+#endif
+
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning REMINDER: Need a centralized __progname prototype.
+#warning REMINDER: Deal with wide oriented stderr case.
+#endif
+extern const char *__progname;
+
+static void vwarn_work(const char *format, va_list args, int showerr)
+{
+ /* 0123 45678 9 a b*/
+ static const char fmt[] = "%s: \0: %s\n\0\n";
+ const char *f;
+ char buf[64];
+ __STDIO_AUTO_THREADLOCK_VAR;
+
+ /* Do this first, in case something below changes errno. */
+ f = fmt + 11; /* At 11. */
+ if (showerr) {
+ f -= 4; /* At 7. */
+ _susv3_strerror_r(errno, buf, sizeof(buf));
+ }
+
+ __STDIO_AUTO_THREADLOCK(stderr);
+
+ fprintf(stderr, fmt, __progname);
+ if (format) {
+ vfprintf(stderr, format, args);
+ f -= 2; /* At 5 (showerr) or 9. */
+ }
+ fprintf(stderr, f, buf);
+
+ __STDIO_AUTO_THREADUNLOCK(stderr);
+}
+
+extern void warn(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vwarn(format, args);
+ va_end(args);
+}
+
+extern void vwarn(const char *format, va_list args)
+{
+ vwarn_work(format, args, 1);
+}
+
+extern void warnx(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vwarnx(format, args);
+ va_end(args);
+}
+
+extern void vwarnx(const char *format, va_list args)
+{
+ vwarn_work(format, args, 0);
+}
+
+extern void err(int status, const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ verr(status, format, args);
+ /* This should get optimized away. We'll leave it now for safety. */
+ va_end(args);
+}
+
+extern void verr(int status, const char *format, va_list args)
+{
+ vwarn(format, args);
+ exit(status);
+}
+
+extern void errx(int status, const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ verrx(status, format, args);
+ /* This should get optimized away. We'll leave it now for safety. */
+ va_end(args);
+}
+
+extern void verrx(int status, const char *format, va_list args)
+{
+ vwarnx(format, args);
+ exit(status);
+}
diff --git a/libc/misc/error/error.c b/libc/misc/error/error.c
index 60a9d8af8..eddf24587 100644
--- a/libc/misc/error/error.c
+++ b/libc/misc/error/error.c
@@ -99,78 +99,3 @@ void __error_at_line (int status, int errnum, const char *file_name,
#undef error_at_line
weak_alias (__error, error)
weak_alias (__error_at_line, error_at_line)
-
-
-
-#include "err.h"
-#include "errno.h"
-
-/* NORETURN */
-void verr (int status, const char *message, va_list args)
-{
- fflush (stdout);
-
- vfprintf (stderr, message, args);
- if (errno) {
- fprintf (stderr, ": %s", strerror (errno));
- }
- putc ('\n', stderr);
- if (status)
- exit (status);
-}
-
-/* NORETURN */
-void verrx (int status, const char *message, va_list args)
-{
- fflush (stdout);
-
- vfprintf (stderr, message, args);
- if (status)
- exit (status);
-}
-
-void vwarn (const char *message, va_list args)
-{
- verr (0, message, args);
-}
-
-void vwarnx (const char *message, va_list args)
-{
- verrx (0, message, args);
-}
-
-void err (int status, const char *message, ...)
-{
- va_list args;
-
- va_start (args, message);
- verr (status, message, args);
- va_end (args);
-}
-
-void errx (int status, const char *message, ...)
-{
- va_list args;
-
- va_start (args, message);
- verrx (status, message, args);
- va_end (args);
-}
-
-void warn (const char *message, ...)
-{
- va_list args;
-
- va_start (args, message);
- verr (0, message, args);
- va_end (args);
-}
-
-void warnx (const char *message, ...)
-{
- va_list args;
-
- va_start (args, message);
- verrx (0, message, args);
- va_end (args);
-}