summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcp/iface_mgr_error_handler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcp/iface_mgr_error_handler.h')
-rw-r--r--src/lib/dhcp/iface_mgr_error_handler.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/lib/dhcp/iface_mgr_error_handler.h b/src/lib/dhcp/iface_mgr_error_handler.h
new file mode 100644
index 0000000..631d25f
--- /dev/null
+++ b/src/lib/dhcp/iface_mgr_error_handler.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2014-2022 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef IFACE_MGR_ERROR_HANDLER_H
+#define IFACE_MGR_ERROR_HANDLER_H
+
+/// @brief A macro which handles an error in IfaceMgr.
+///
+/// There are certain cases when IfaceMgr may hit an error which shouldn't
+/// result in interruption of the function processing. A typical case is
+/// the function which opens sockets on available interfaces for a DHCP
+/// server. If this function fails to open a socket on a specific interface
+/// (for example, there is another socket already open on this interface
+/// and bound to the same address and port), it is desired that the server
+/// logs a warning but will try to open sockets on other interfaces. In order
+/// to log an error, the IfaceMgr will use the error handler function provided
+/// by the server and pass an error string to it. When the handler function
+/// returns, the IfaceMgr will proceed to open other sockets. It is allowed
+/// that the error handler function is not installed (is NULL). In these
+/// cases it is expected that the exception is thrown instead. A possible
+/// solution would be to enclose this conditional behavior in a function.
+/// However, despite the hate for macros, the macro seems to be a bit
+/// better solution in this case as it allows to conveniently pass an
+/// error string in a stream (not as a string).
+///
+/// @param ex_type Exception to be thrown if error_handler is NULL.
+/// @param handler Error handler function to be called or NULL to indicate
+/// that exception should be thrown instead.
+/// @param iface Pointer to the interface for which the error is logged. Can be null.
+/// @param stream stream object holding an error string.
+#define IFACEMGR_ERROR(ex_type, handler, iface, stream) \
+{ \
+ std::ostringstream ieoss__; \
+ ieoss__ << stream; \
+ std::string const error(ieoss__.str()); \
+ if (iface) { \
+ iface->addError(error); \
+ } \
+ if (handler) { \
+ handler(error); \
+ } else { \
+ isc_throw(ex_type, error); \
+ } \
+} \
+
+#endif // IFACE_MGR_ERROR_HANDLER_H