From 93261cdf00778d5706a72bbbeb3a379bfaad948c Mon Sep 17 00:00:00 2001
From: Manuel Novoa III <mjn3@codepoet.org>
Date: Thu, 11 Mar 2004 10:10:53 +0000
Subject: 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.

---
 libc/misc/error/Makefile |   2 +-
 libc/misc/error/err.c    | 110 +++++++++++++++++++++++++++++++++++++++++++++++
 libc/misc/error/error.c  |  75 --------------------------------
 3 files changed, 111 insertions(+), 76 deletions(-)
 create mode 100644 libc/misc/error/err.c

(limited to 'libc/misc/error')

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);
-}
-- 
cgit v1.2.3