فهرست منبع

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.

Manuel Novoa III 21 سال پیش
والد
کامیت
93261cdf00
3فایلهای تغییر یافته به همراه111 افزوده شده و 76 حذف شده
  1. 1 1
      libc/misc/error/Makefile
  2. 110 0
      libc/misc/error/err.c
  3. 0 75
      libc/misc/error/error.c

+ 1 - 1
libc/misc/error/Makefile

@@ -19,7 +19,7 @@
 TOPDIR=../../../
 TOPDIR=../../../
 include $(TOPDIR)Rules.mak
 include $(TOPDIR)Rules.mak
 
 
-CSRC=error.c
+CSRC=error.c err.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 OBJS=$(COBJS)
 OBJS=$(COBJS)
 
 

+ 110 - 0
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);
+}

+ 0 - 75
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
 #undef error_at_line
 weak_alias (__error, error)
 weak_alias (__error, error)
 weak_alias (__error_at_line, error_at_line)
 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);
-}