diff options
Diffstat (limited to 'src/lib/dhcp/iface_mgr_error_handler.h')
-rw-r--r-- | src/lib/dhcp/iface_mgr_error_handler.h | 49 |
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 |