diff options
author | Otto Moerbeek <otto@cvs.openbsd.org> | 2005-05-26 12:56:02 +0000 |
---|---|---|
committer | Otto Moerbeek <otto@cvs.openbsd.org> | 2005-05-26 12:56:02 +0000 |
commit | 84adf6e81794f69b771b953b97dfc4e9f98b3900 (patch) | |
tree | defbee3b1ad84aed39649c773e66edb557c20ccb /lib/libc | |
parent | 22dc035d284e63e4170091dbb6fb8fd7cf5fe785 (diff) |
Merge common functionality of __strsignal and strerror_r.
ok jaredy@ miod@
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/string/Makefile.inc | 4 | ||||
-rw-r--r-- | lib/libc/string/__strsignal.c | 99 | ||||
-rw-r--r-- | lib/libc/string/strerror_r.c | 76 |
3 files changed, 50 insertions, 129 deletions
diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc index 8150294d1cb..299d7e106c4 100644 --- a/lib/libc/string/Makefile.inc +++ b/lib/libc/string/Makefile.inc @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile.inc,v 1.16 2005/04/16 12:26:12 jmc Exp $ +# $OpenBSD: Makefile.inc,v 1.17 2005/05/26 12:56:01 otto Exp $ # string sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_ARCH}/string ${LIBCSRCDIR}/string SRCS+= bm.c memccpy.c strcasecmp.c strcasestr.c strcoll.c strdup.c \ strerror.c strerror_r.c strlcat.c strmode.c strsignal.c strtok.c \ - strxfrm.c __strsignal.c \ + strxfrm.c \ wcscat.c wcschr.c wcscmp.c wcscpy.c wcscspn.c wcslcat.c wcslcpy.c \ wcslen.c wcsncat.c wcsncmp.c wcsncpy.c wcspbrk.c wcsrchr.c wcsspn.c \ wcsstr.c wcstok.c wcswcs.c wmemchr.c wmemcmp.c wmemcpy.c \ diff --git a/lib/libc/string/__strsignal.c b/lib/libc/string/__strsignal.c deleted file mode 100644 index 09054a9517e..00000000000 --- a/lib/libc/string/__strsignal.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 1988 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: __strsignal.c,v 1.10 2005/05/01 19:39:02 tom Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#ifdef NLS -#define catclose _catclose -#define catgets _catgets -#define catopen _catopen -#include <nl_types.h> -#endif - -#define sys_siglist _sys_siglist - -#include <stdio.h> -#include <limits.h> -#include <signal.h> -#include <string.h> - -static char * -itoa(char *buffer, size_t buffer_size, unsigned int num) -{ - char *p = buffer + buffer_size; - - *--p = '\0'; - while (num >= 10 && p > buffer + 1) { - *--p = (num % 10) + '0'; - num /= 10; - } - /* num < 10 || p == buffer + 1 */ - *--p = (num % 10) + '0'; - return p; -} - -char * -__strsignal(int num, char *buf) -{ -#define UPREFIX "Unknown signal: " - unsigned int signum; - -#ifdef NLS - nl_catd catd ; - catd = catopen("libc", 0); -#endif - - signum = num; /* convert to unsigned */ - if (signum < NSIG) { -#ifdef NLS - strlcpy(buf, catgets(catd, 2, signum, - (char *)sys_siglist[signum]), NL_TEXTMAX); -#else - return((char *)sys_siglist[signum]); -#endif - } else { -#define MAXINTDIGS 11 - char str[MAXINTDIGS]; - -#ifdef NLS - strlcpy(buf, catgets(catd, 1, 0xffff, UPREFIX), NL_TEXTMAX); -#else - strlcpy(buf, UPREFIX, NL_TEXTMAX); -#endif - strlcat(buf, itoa(str, sizeof(str), signum), NL_TEXTMAX); - } - -#ifdef NLS - catclose(catd); -#endif - - return buf; -} diff --git a/lib/libc/string/strerror_r.c b/lib/libc/string/strerror_r.c index 28bfd00a47e..958a88df3eb 100644 --- a/lib/libc/string/strerror_r.c +++ b/lib/libc/string/strerror_r.c @@ -1,8 +1,8 @@ -/* $OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp $ */ +/* $OpenBSD: strerror_r.c,v 1.5 2005/05/26 12:56:01 otto Exp $ */ /* Public Domain <marc@snafu.org> */ #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp $"; +static char *rcsid = "$OpenBSD: strerror_r.c,v 1.5 2005/05/26 12:56:01 otto Exp $"; #endif /* LIBC_SCCS and not lint */ #ifdef NLS @@ -14,9 +14,11 @@ static char *rcsid = "$OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp #define sys_errlist _sys_errlist #define sys_nerr _sys_nerr +#define sys_siglist _sys_siglist #include <errno.h> #include <limits.h> +#include <signal.h> #include <string.h> static size_t @@ -33,13 +35,13 @@ __digits10(unsigned int num) } static int -__itoa(int num, char *buffer, size_t start, size_t end) +__itoa(int num, int sign, char *buffer, size_t start, size_t end) { size_t pos; unsigned int a; int neg; - if (num < 0) { + if (sign && num < 0) { a = -num; neg = 1; } @@ -68,47 +70,39 @@ __itoa(int num, char *buffer, size_t start, size_t end) } -#define UPREFIX "Unknown error: " - -int -strerror_r(int errnum, char *strerrbuf, size_t buflen) +static int +__num2string(int num, int sign, int setid, char *buf, size_t buflen, + char * list[], size_t max, const char *def) { - int save_errno; - int ret_errno; + int ret = 0; size_t len; -#ifdef NLS - nl_catd catd; -#endif - - save_errno = errno; - ret_errno = 0; #ifdef NLS + nl_catd catd; catd = catopen("libc", 0); #endif - if (errnum >= 0 && errnum < sys_nerr) { + if (0 <= num && num < max) { #ifdef NLS - len = strlcpy(strerrbuf, catgets(catd, 1, errnum, - (char *)sys_errlist[errnum]), buflen); + len = strlcpy(buf, catgets(catd, setid, num, list[num]), + buflen); #else - len = strlcpy(strerrbuf, sys_errlist[errnum], buflen); + len = strlcpy(buf, def, buflen); #endif if (len >= buflen) - ret_errno = ERANGE; + ret = ERANGE; } else { #ifdef NLS - len = strlcpy(strerrbuf, catgets(catd, 1, 0xffff, UPREFIX), - buflen); + len = strlcpy(buf, catgets(catd, setid, 0xffff, def), buflen); #else - len = strlcpy(strerrbuf, UPREFIX, buflen); + len = strlcpy(buf, def, buflen); #endif if (len >= buflen) - ret_errno = ERANGE; + ret = ERANGE; else { - ret_errno = __itoa(errnum, strerrbuf, len, buflen); - if (ret_errno == 0) - ret_errno = EINVAL; + ret = __itoa(num, sign, buf, len, buflen); + if (ret == 0) + ret = EINVAL; } } @@ -116,6 +110,32 @@ strerror_r(int errnum, char *strerrbuf, size_t buflen) catclose(catd); #endif + return ret; +} + +#define UPREFIX "Unknown error: " + +int +strerror_r(int errnum, char *strerrbuf, size_t buflen) +{ + int save_errno; + int ret_errno; + + save_errno = errno; + + ret_errno = __num2string(errnum, 1, 1, strerrbuf, buflen, + sys_errlist, sys_nerr, UPREFIX); + errno = ret_errno ? ret_errno : save_errno; return (ret_errno); } + +#define USIGPREFIX "Unknown signal: " + +char * +__strsignal(int num, char *buf) +{ + __num2string(num, 0, 2, buf, NL_TEXTMAX, (char **)sys_siglist, NSIG, + USIGPREFIX); + return buf; +} |