From c654449ccf403ccd2b81be2038b1013d6fbb06cc Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 30 Aug 2001 04:33:20 +0000 Subject: [PATCH] isc__strerror --- config.h.in | 5 +- configure.in | 5 +- lib/isc/unix/include/isc/strerror.h | 41 ++++++++++++++++ lib/isc/unix/strerror.c | 76 +++++++++++++++++++++++++++++ util/copyrights | 2 + 5 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 lib/isc/unix/include/isc/strerror.h create mode 100644 lib/isc/unix/strerror.c diff --git a/config.h.in b/config.h.in index ef1ea35db1..d55479f283 100644 --- a/config.h.in +++ b/config.h.in @@ -16,7 +16,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.h.in,v 1.47 2001/08/16 06:19:56 marka Exp $ */ +/* $Id: config.h.in,v 1.48 2001/08/30 04:33:17 marka Exp $ */ /*** *** This file is not to be included by any public header files, because @@ -173,3 +173,6 @@ int sigwait(const unsigned int *set, int *sig); /* Define if you have the socket library (-lsocket). */ #undef HAVE_LIBSOCKET + +/* Define if you have strerror in the C library. */ +#undef HAVE_STRERROR diff --git a/configure.in b/configure.in index e9a1987079..4403e05d24 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl esyscmd([sed "s/^/# /" COPYRIGHT])dnl AC_DIVERT_POP()dnl -AC_REVISION($Revision: 1.294 $) +AC_REVISION($Revision: 1.295 $) AC_INIT(lib/dns/name.c) AC_PREREQ(2.13) @@ -198,7 +198,7 @@ AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/sysct AC_C_CONST AC_C_INLINE -AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME),) +AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME)) # # UnixWare 7.1.1 with the feature supplement to the UDK compiler @@ -1345,6 +1345,7 @@ AC_CHECK_FUNC(vsnprintf, ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRSEP) AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF) +AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR)) AC_SUBST(ISC_EXTRA_OBJS) AC_SUBST(ISC_EXTRA_SRCS) diff --git a/lib/isc/unix/include/isc/strerror.h b/lib/isc/unix/include/isc/strerror.h new file mode 100644 index 0000000000..50e290171b --- /dev/null +++ b/lib/isc/unix/include/isc/strerror.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2001 Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: strerror.h,v 1.1 2001/08/30 04:33:19 marka Exp $ */ + +#ifndef ISC_STRERROR_H +#define ISC_STRERROR_H + +#include + +#include + +ISC_LANG_BEGINDECLS + +/* + * Provide a thread safe wrapper to strerrror(). + * 'buf' is always returned. + * + * Requires: + * 'buf' to be non NULL. + */ +char * +isc__strerror(int num, char *buf, size_t bufsize); + +ISC_LANG_ENDDECLS + +#endif /* ISC_STRERROR_H */ diff --git a/lib/isc/unix/strerror.c b/lib/isc/unix/strerror.c new file mode 100644 index 0000000000..c749cbc2aa --- /dev/null +++ b/lib/isc/unix/strerror.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2001 Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: strerror.c,v 1.1 2001/08/30 04:33:19 marka Exp $ */ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef HAVE_STRERROR +/* + * We need to do this this way for profiled locks. + */ +static isc_mutex_t isc_strerror_lock; +static void init_lock(void) { + RUNTIME_CHECK(isc_mutex_init(&isc_strerror_lock) == ISC_R_SUCCESS); +} +#else +extern const char * const sys_errlist[]; +extern const int sys_nerr; +#endif + +char * +isc__strerror(int num, char *buf, size_t size) { +#ifdef HAVE_STRERROR + char *msg; + unsigned int unum = num; + static isc_once_t once = ISC_ONCE_INIT; + + REQUIRE(buf != NULL); + + RUNTIME_CHECK(isc_once_do(&once, init_lock) == ISC_R_SUCCESS); + + LOCK(&isc_strerror_lock); + msg = strerror(num); + if (msg != NULL) + snprintf(buf, size, "%s", msg); + else + snprintf(buf, size, "Unknown error: %u", unum); + UNLOCK(&isc_strerror_lock); + return (buf); +#else + unsigned int unum = num; + isc_once_t once = ISC_ONCE_INIT; + static lock; + + REQUIRE(buf != NULL); + + if (num >= 0 && num < sys_nerr) + snprintf(buf, size, "%s", sys_errlist[num]); + else + snprintf(buf, size, "Unknown error: %u", unum); + return (buf); +#endif +} diff --git a/util/copyrights b/util/copyrights index ac3801ed8d..3626c5383f 100644 --- a/util/copyrights +++ b/util/copyrights @@ -1936,6 +1936,7 @@ ./lib/isc/unix/include/isc/netdb.h C 1999,2000,2001 ./lib/isc/unix/include/isc/offset.h C 2000,2001 ./lib/isc/unix/include/isc/stdtime.h C 1999,2000,2001 +./lib/isc/unix/include/isc/strerror.h C 2001 ./lib/isc/unix/include/isc/syslog.h C 1999,2000,2001 ./lib/isc/unix/include/isc/time.h C 1998,1999,2000,2001 ./lib/isc/unix/interfaceiter.c C 1999,2000,2001 @@ -1948,6 +1949,7 @@ ./lib/isc/unix/socket_p.h C 2000,2001 ./lib/isc/unix/stdio.c C 2000,2001 ./lib/isc/unix/stdtime.c C 1999,2000,2001 +./lib/isc/unix/strerror.c C 2001 ./lib/isc/unix/syslog.c C 2001 ./lib/isc/unix/time.c C 1998,1999,2000,2001 ./lib/isc/version.c C 1998,1999,2000,2001 -- GitLab