Mail Archives: djgpp-workers/2005/01/03/11:57:09
X-Authentication-Warning: | delorie.com: mail set sender to djgpp-workers-bounces using -f
|
From: | <ams AT ludd DOT ltu DOT se>
|
Message-Id: | <200501031656.j03GuxjN028690@speedy.ludd.ltu.se>
|
Subject: | strerror_r() patch
|
To: | DJGPP-WORKERS <djgpp-workers AT delorie DOT com>
|
Date: | Mon, 3 Jan 2005 17:56:59 +0100 (CET)
|
X-Mailer: | ELM [version 2.4ME+ PL78 (25)]
|
MIME-Version: | 1.0
|
X-ltu-MailScanner-Information: | Please contact the ISP for more information
|
X-ltu-MailScanner: | Found to be clean
|
X-ltu-MailScanner-SpamScore: | ss
|
X-MailScanner-From: | ams AT ludd DOT ltu DOT se
|
Reply-To: | djgpp-workers AT delorie DOT com
|
Hello.
Here's my patch to add strerror_r(). Some fuzz if somebody applies it is
possible.
Right,
MartinS
Index: djgpp/include/string.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/string.h,v
retrieving revision 1.7
diff -p -u -r1.7 string.h
--- djgpp/include/string.h 4 Feb 2003 20:24:20 -0000 1.7
+++ djgpp/include/string.h 3 Jan 2005 16:54:08 -0000
@@ -54,6 +54,9 @@ size_t strxfrm(char *_s1, const char *_s
#ifndef __STRICT_ANSI__
+int strerror_r(int _errnum, char *_strerrbuf, size_t _buflen);
+
#ifndef _POSIX_SOURCE
#include <sys/movedata.h>
Index: djgpp/src/libc/posix/string/strerr_r.c
===================================================================
RCS file: djgpp/src/libc/posix/string/strerr_r.c
diff -N djgpp/src/libc/posix/string/strerr_r.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ djgpp/src/libc/posix/string/strerr_r.c 3 Jan 2005 16:54:19 -0000
@@ -0,0 +1,38 @@
+/* Copyright (C) 2005 DJ Delorie, see COPYING.DJ for details */
+/* Copyright (C) 2001 DJ Delorie, see COPYING.DJ for details */
+/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
+/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define UNKNOWN_ERROR_STR "Unknown error: "
+
+int
+strerror_r(int errnum, char *strerrbuf, size_t buflen)
+{
+ char ebuf[ strlen(UNKNOWN_ERROR_STR "-2147483648") + 1 ]; /* -2147483648 is
+ INT_MIN. */
+ const char *p;
+ int length;
+
+
+ if (errnum >= 0 && errnum < __sys_nerr)
+ {
+ p = __sys_errlist[errnum];
+ length = strlen(p);
+ }
+ else
+ {
+ length = sprintf(ebuf, "%s%d", UNKNOWN_ERROR_STR, errnum);
+ p = ebuf;
+ }
+
+ if (length < 0 || buflen < (size_t)length+1)
+ {
+ return ERANGE;
+ }
+
+ strcpy(strerrbuf, p);
+ return 0;
+}
Index: djgpp/src/libc/posix/string/strerr_r.txh
===================================================================
RCS file: djgpp/src/libc/posix/string/strerr_r.txh
diff -N djgpp/src/libc/posix/string/strerr_r.txh
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ djgpp/src/libc/posix/string/strerr_r.txh 3 Jan 2005 16:54:19 -0000
@@ -0,0 +1,53 @@
+@node strerror_r, stdio
+@findex strerror_r
+@subheading Syntax
+
+@example
+#include <string.h>
+
+int strerror_r(int error, char *strerrbuf, size_t buflen);
+@end example
+
+@subheading Description
+
+This function fills the @var{strerrbuf} of length @var{buflen} with a
+string that describes the @var{error}.
+
+@subheading Return Value
+
+0 if successful or @code{ERANGE} if @var{buflen} is too small.
+
+@subheading Portability
+
+@portability !ansi, posix
+
+@subheading Example
+
+@example
+f=fopen("foo", "r");
+if( f == NULL )
+@{
+ char buf[1];
+ int error_again;
+
+ error_again = strerror_r(errno, buf, 1);
+ if( error_again )
+ @{
+ char buf2[1024];
+ int error_again2;
+
+ error_again2 = strerror_r(errno, buf2, 1024);
+ if( error_again2 )
+ @{
+ printf("Error while trying to decode error from calling strerror_r(). I give up!\n"
+ "Calling strerror: '%s'\n", strerror(error_again2));
+ @}
+ printf("Error while trying to decode error from calling fopen(): '%s'\n",
+ buf2);
+ @}
+ else
+ @{
+ printf("Error from fopen(): %s\n", buf);
+ @}
+@end example
+
Index: djgpp/tests/libc/posix/string/makefile
===================================================================
RCS file: djgpp/tests/libc/posix/string/makefile
diff -N djgpp/tests/libc/posix/string/makefile
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ djgpp/tests/libc/posix/string/makefile 3 Jan 2005 16:54:19 -0000
@@ -0,0 +1,5 @@
+TOP=../..
+
+SRC += strerr_r.c
+
+include $(TOP)/../makefile.inc
Index: djgpp/tests/libc/posix/string/strerr_r.c
===================================================================
RCS file: djgpp/tests/libc/posix/string/strerr_r.c
diff -N djgpp/tests/libc/posix/string/strerr_r.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ djgpp/tests/libc/posix/string/strerr_r.c 3 Jan 2005 16:54:19 -0000
@@ -0,0 +1,55 @@
+/*
+ * File strerr_r.c.
+ *
+ * Copyright (C) 2005 Martin Str@"omberg <ams AT ludd DOT ltu DOT se>.
+ *
+ * This software may be used freely so long as this copyright notice is
+ * left intact. There is no warranty on this software.
+ *
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#define FILE_NAME "Doesn't ::: exist!"
+
+int main(void)
+{
+ FILE *f;
+
+ f = fopen(FILE_NAME, "r");
+ if( f == NULL )
+ {
+ char buf[1];
+ int error_again;
+
+ error_again = strerror_r(errno, buf, 1);
+ if( error_again )
+ {
+ char buf2[1024];
+ int error_again2;
+
+ error_again2 = strerror_r(error_again, buf2, 1024 );
+ if( error_again2 )
+ {
+ printf("Error while trying to decode error from calling strerror_r(). I give up!\n"
+ "Calling strerror: '%s'\n", strerror(error_again2));
+ }
+ printf("Error while trying to decode error from calling fopen(): '%s'\n",
+ buf2);
+ }
+ else
+ {
+ printf("Error from fopen(): %s\n", buf);
+ }
+ }
+ else
+ {
+ printf("File name '%s' could be opened! This should not be possible in DOS.\n", FILE_NAME);
+
+ return 1;
+ }
+
+ return 0;
+}
- Raw text -