sa.sa_handler = handler;
if (sigfillset(&sa.sa_mask) != 0 || sigaction(sig, &sa, NULL) < 0) {
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "handle_signal() %d setup: %s", sig, strbuf);
+ FATAL_SYSERROR(errno, "signal %d", sig);
}
}
isc_app_ctxstart(isc_appctx_t *ctx) {
int presult;
sigset_t sset;
- char strbuf[ISC_STRERRORSIZE];
REQUIRE(VALID_APPCTX(ctx));
if (sigemptyset(&sset) != 0 || sigaddset(&sset, SIGHUP) != 0 ||
sigaddset(&sset, SIGINT) != 0 || sigaddset(&sset, SIGTERM) != 0)
{
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "isc_app_start() sigsetops: %s", strbuf);
+ FATAL_SYSERROR(errno, "sigsetops");
}
presult = pthread_sigmask(SIG_BLOCK, &sset, NULL);
if (presult != 0) {
- strerror_r(presult, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "isc_app_start() pthread_sigmask: %s", strbuf);
+ FATAL_SYSERROR(presult, "pthread_sigmask()");
}
return (ISC_R_SUCCESS);
sigaddset(&sset, SIGINT) != 0 ||
sigaddset(&sset, SIGTERM) != 0)
{
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "isc_app_run() sigsetops: %s",
- strbuf);
+ FATAL_SYSERROR(errno, "sigsetops");
}
if (sigwait(&sset, &sig) == 0) {
} else {
/* Normal single BIND9 context */
if (kill(getpid(), SIGTERM) < 0) {
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "isc_app_shutdown() "
- "kill: %s",
- strbuf);
+ FATAL_SYSERROR(errno, "kill");
}
}
}
} else {
/* Normal single BIND9 context */
if (kill(getpid(), SIGHUP) < 0) {
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__,
- "isc_app_reload() "
- "kill: %s",
- strbuf);
+ FATAL_SYSERROR(errno, "kill");
}
}
}
int presult;
isc_result_t result;
struct timespec ts;
- char strbuf[ISC_STRERRORSIZE];
REQUIRE(c != NULL && m != NULL && t != NULL);
}
} while (presult == EINTR);
- strerror_r(presult, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("pthread_cond_timedwait() returned %s", strbuf);
+ UNEXPECTED_SYSERROR(presult, "pthread_cond_timedwait()");
return (ISC_R_UNEXPECTED);
}
typedef pthread_cond_t isc_condition_t;
-#define isc_condition_init(cond) \
- if (pthread_cond_init(cond, NULL) != 0) { \
- char isc_condition_strbuf[ISC_STRERRORSIZE]; \
- strerror_r(errno, isc_condition_strbuf, \
- sizeof(isc_condition_strbuf)); \
- isc_error_fatal(__FILE__, __LINE__, \
- "pthread_cond_init failed: %s", \
- isc_condition_strbuf); \
+#define isc_condition_init(cond) \
+ if (pthread_cond_init(cond, NULL) != 0) { \
+ FATAL_SYSERROR(errno, "pthread_cond_init()"); \
}
#define isc_condition_wait(cp, mp) \
noreturn void
isc_error_runtimecheck(const char *, int, const char *);
-#define ISC_ERROR_RUNTIMECHECK(cond) \
- ((void)((cond) || \
- ((isc_error_runtimecheck)(__FILE__, __LINE__, #cond), 0)))
-
ISC_LANG_ENDDECLS
typedef pthread_mutex_t isc_mutex_t;
-void
-isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line);
-
-#define isc_mutex_init(mp) isc__mutex_init((mp), __FILE__, __LINE__)
+int
+isc__mutex_init(isc_mutex_t *mp);
+
+#define isc_mutex_init(mp) \
+ do { \
+ int _err = isc__mutex_init((mp)); \
+ if (_err != 0) { \
+ FATAL_SYSERROR(_err, "pthread_mutex_init()"); \
+ } \
+ } while (0)
#define isc_mutex_lock(mp) \
((pthread_mutex_lock((mp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
/*
* Errors
*/
-#include <isc/error.h> /* Contractual promise. */
+#include <isc/error.h> /* Contractual promise. */
+#include <isc/strerr.h> /* for ISC_STRERRORSIZE */
#define UNEXPECTED_ERROR(...) \
isc_error_unexpected(__FILE__, __LINE__, __VA_ARGS__)
#define FATAL_ERROR(...) isc_error_fatal(__FILE__, __LINE__, __VA_ARGS__)
+#define REPORT_SYSERROR(report, err, fmt, ...) \
+ { \
+ char _strerr[ISC_STRERRORSIZE]; \
+ strerror_r(err, _strerr, sizeof(_strerr)); \
+ report(__FILE__, __LINE__, fmt ": %s (%d)", ##__VA_ARGS__, \
+ _strerr, err); \
+ }
+
+#define UNEXPECTED_SYSERROR(err, ...) \
+ REPORT_SYSERROR(isc_error_unexpected, err, __VA_ARGS__)
+
+#define FATAL_SYSERROR(err, ...) \
+ REPORT_SYSERROR(isc_error_fatal, err, __VA_ARGS__)
+
#ifdef UNIT_TESTING
-#define RUNTIME_CHECK(expression) \
- ((!(expression)) \
- ? (mock_assert(0, #expression, __FILE__, __LINE__), abort()) \
- : (void)0)
+#define RUNTIME_CHECK(cond) \
+ ((cond) ? (void)0 \
+ : (mock_assert(0, #cond, __FILE__, __LINE__), abort()))
#else /* UNIT_TESTING */
-#define RUNTIME_CHECK(cond) ISC_ERROR_RUNTIMECHECK(cond)
+#define RUNTIME_CHECK(cond) \
+ ((cond) ? (void)0 : isc_error_runtimecheck(__FILE__, __LINE__, #cond))
#endif /* UNIT_TESTING */
}
#endif /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */
-void
-isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line) {
- int err;
-
+int
+isc__mutex_init(isc_mutex_t *mp) {
#ifdef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP
isc_result_t result = ISC_R_SUCCESS;
result = isc_once_do(&once_attr, initialize_attr);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- err = pthread_mutex_init(mp, &attr);
+ return (pthread_mutex_init(mp, &attr));
#else /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */
- err = pthread_mutex_init(mp, NULL);
+ return (pthread_mutex_init(mp, NULL));
#endif /* HAVE_PTHREAD_MUTEX_ADAPTIVE_NP */
- if (err != 0) {
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(err, strbuf, sizeof(strbuf));
- isc_error_fatal(file, line, "pthread_mutex_init failed: %s",
- strbuf);
- }
}
try_proto(int domain) {
int s;
isc_result_t result = ISC_R_SUCCESS;
- char strbuf[ISC_STRERRORSIZE];
s = socket(domain, SOCK_STREAM, 0);
if (s == -1) {
#endif /* ifdef EINVAL */
return (ISC_R_NOTFOUND);
default:
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("socket() failed: %s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "socket()");
return (ISC_R_UNEXPECTED);
}
}
try_ipv6only(void) {
#ifdef IPV6_V6ONLY
int s, on;
- char strbuf[ISC_STRERRORSIZE];
#endif /* ifdef IPV6_V6ONLY */
isc_result_t result;
/* check for TCP sockets */
s = socket(PF_INET6, SOCK_STREAM, 0);
if (s == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("socket() failed: %s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "socket()");
ipv6only_result = ISC_R_UNEXPECTED;
return;
}
/* check for UDP sockets */
s = socket(PF_INET6, SOCK_DGRAM, 0);
if (s == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("socket() failed: %s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "socket()");
ipv6only_result = ISC_R_UNEXPECTED;
return;
}
static void
try_ipv6pktinfo(void) {
int s, on;
- char strbuf[ISC_STRERRORSIZE];
isc_result_t result;
int optname;
/* we only use this for UDP sockets */
s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (s == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("socket() failed: %s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "socket()");
ipv6pktinfo_result = ISC_R_UNEXPECTED;
return;
}
make_nonblock(int fd) {
int ret;
int flags;
- char strbuf[ISC_STRERRORSIZE];
-#ifdef USE_FIONBIO_IOCTL
- int on = 1;
- ret = ioctl(fd, FIONBIO, (char *)&on);
+#ifdef USE_FIONBIO_IOCTL
+ flags = 1;
+ ret = ioctl(fd, FIONBIO, (char *)&flags);
#else /* ifdef USE_FIONBIO_IOCTL */
flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
#endif /* ifdef USE_FIONBIO_IOCTL */
if (ret == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
#ifdef USE_FIONBIO_IOCTL
- UNEXPECTED_ERROR("ioctl(%d, FIONBIO, &on): %s", fd, strbuf);
-#else /* ifdef USE_FIONBIO_IOCTL */
- UNEXPECTED_ERROR("fcntl(%d, F_SETFL, %d): %s", fd, flags,
- strbuf);
-#endif /* ifdef USE_FIONBIO_IOCTL */
-
+ UNEXPECTED_SYSERROR(errno, "ioctl(%d, FIONBIO, &on)", fd);
+#else
+ UNEXPECTED_SYSERROR(errno, "fcntl(%d, F_SETFL, %d)", fd, flags);
+#endif
return (ISC_R_UNEXPECTED);
}
}
if (sendmsg(s, &msg, 0) < 0) {
- int debug = ISC_LOG_DEBUG(10);
switch (errno) {
#ifdef ENOPROTOOPT
case ENOPROTOOPT:
#endif /* ifdef EOPNOTSUPP */
case EINVAL:
case EPERM:
- break;
- default:
- debug = ISC_LOG_NOTICE;
- }
- strerror_r(errno, strbuf, sizeof(strbuf));
- if (debug != ISC_LOG_NOTICE) {
+ strerror_r(errno, strbuf, sizeof(strbuf));
isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(10),
"sendmsg: %s", strbuf);
- } else {
- UNEXPECTED_ERROR(
- "probing sendmsg() with %s=%02x failed: %s",
+ break;
+ default:
+ UNEXPECTED_SYSERROR(
+ errno, "probing sendmsg() with %s=%02x failed",
(type == IP_TOS) ? "IP_TOS" : "IPV6_TCLASS",
- dscp, strbuf);
+ dscp);
+ break;
}
return (false);
}
}
s = socket(res0->ai_family, res0->ai_socktype, res0->ai_protocol);
-
if (s == -1) {
strerror_r(errno, strbuf, sizeof(strbuf));
isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
REQUIRE(workers > 0);
if (uv_version() < MINIMAL_UV_VERSION) {
- isc_error_fatal(__FILE__, __LINE__,
- "libuv version too old: running with libuv %s "
- "when compiled with libuv %s will lead to "
- "libuv failures because of unknown flags",
- uv_version_string(), UV_VERSION_STRING);
+ FATAL_ERROR("libuv version too old: running with libuv %s "
+ "when compiled with libuv %s will lead to "
+ "libuv failures because of unknown flags",
+ uv_version_string(), UV_VERSION_STRING);
}
isc__nm_threadpool_initialize(workers);
struct timespec ts;
if (clock_gettime(CLOCKSOURCE, &ts) == -1) {
- char strbuf[ISC_STRERRORSIZE];
- strerror_r(errno, strbuf, sizeof(strbuf));
- isc_error_fatal(__FILE__, __LINE__, "clock_gettime failed: %s",
- strbuf);
+ FATAL_SYSERROR(errno, "clock_gettime()");
}
REQUIRE(ts.tv_sec > 0 && ts.tv_nsec >= 0 && ts.tv_nsec < NS_PER_S);
#define THREAD_MINSTACKSIZE (1024U * 1024)
#endif /* ifndef THREAD_MINSTACKSIZE */
-#define _FATAL(r, f) \
- { \
- char strbuf[ISC_STRERRORSIZE]; \
- strerror_r(r, strbuf, sizeof(strbuf)); \
- isc_error_fatal(__FILE__, __LINE__, f " failed: %s", strbuf); \
- }
-
void
isc_thread_create(isc_threadfunc_t func, isc_threadarg_t arg,
isc_thread_t *thread) {
defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE)
ret = pthread_attr_getstacksize(&attr, &stacksize);
if (ret != 0) {
- _FATAL(ret, "pthread_attr_getstacksize()");
+ FATAL_SYSERROR(ret, "pthread_attr_getstacksize()");
}
if (stacksize < THREAD_MINSTACKSIZE) {
ret = pthread_attr_setstacksize(&attr, THREAD_MINSTACKSIZE);
if (ret != 0) {
- _FATAL(ret, "pthread_attr_setstacksize()");
+ FATAL_SYSERROR(ret, "pthread_attr_setstacksize()");
}
}
#endif /* if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \
ret = pthread_create(thread, &attr, isc__trampoline_run,
trampoline_arg);
if (ret != 0) {
- _FATAL(ret, "pthread_create()");
+ FATAL_SYSERROR(ret, "pthread_create()");
}
pthread_attr_destroy(&attr);
isc_thread_join(isc_thread_t thread, isc_threadresult_t *result) {
int ret = pthread_join(thread, result);
if (ret != 0) {
- _FATAL(ret, "pthread_join()");
+ FATAL_SYSERROR(ret, "pthread_join()");
}
}
#include <isc/log.h>
#include <isc/print.h>
-#include <isc/strerr.h>
#include <isc/string.h>
#include <isc/time.h>
#include <isc/tm.h>
static isc_result_t
time_now(isc_time_t *t, clockid_t clock) {
struct timespec ts;
- char strbuf[ISC_STRERRORSIZE];
REQUIRE(t != NULL);
if (clock_gettime(clock, &ts) == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("%s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "clock_gettime()");
return (ISC_R_UNEXPECTED);
}
isc_result_t
isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i) {
struct timespec ts;
- char strbuf[ISC_STRERRORSIZE];
REQUIRE(t != NULL);
REQUIRE(i != NULL);
INSIST(i->nanoseconds < NS_PER_S);
if (clock_gettime(CLOCKSOURCE, &ts) == -1) {
- strerror_r(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR("%s", strbuf);
+ UNEXPECTED_SYSERROR(errno, "clock_gettime()");
return (ISC_R_UNEXPECTED);
}