diff options
author | 2005-05-26 12:56:01 +0000 | |
---|---|---|
committer | 2005-05-26 12:56:01 +0000 | |
commit | 53d7e92212cd6b34c84ba16624e03c98ee2d22f4 (patch) | |
tree | d17d39c0fbf295c502ca74966b43c8ce4d574e51 /lib/libc/string/strerror_r.c | |
parent | Ensure previous adjust has completed before clearing alarm flag; ok henning@ (diff) | |
download | wireguard-openbsd-53d7e92212cd6b34c84ba16624e03c98ee2d22f4.tar.xz wireguard-openbsd-53d7e92212cd6b34c84ba16624e03c98ee2d22f4.zip |
Merge common functionality of __strsignal and strerror_r.
ok jaredy@ miod@
Diffstat (limited to 'lib/libc/string/strerror_r.c')
-rw-r--r-- | lib/libc/string/strerror_r.c | 76 |
1 files changed, 48 insertions, 28 deletions
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; +} |