blob: 68e24ea1c642deef0121a91cbb6b99e7dd407121 [file] [log] [blame]
/*
* Copyright © 2018 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#pragma once
#define ALLOW_DEPRECATED_API 1
// make it possible to ONLY include api.hpp during the transition
#ifdef ALLOW_DEPRECATED_API
#include <ipmid/api.h>
#endif
#include <boost/asio/io_context.hpp>
#include <ipmid/api-types.hpp>
#include <ipmid/filter.hpp>
#include <ipmid/handler.hpp>
#include <ipmid/message/types.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
// any client can interact with the main asio context
std::shared_ptr<boost::asio::io_context> getIoContext();
// any client can interact with the main sdbus
std::shared_ptr<sdbusplus::asio::connection> getSdBus();
/**
* @brief post some work to the async exection queue
*
* The IPMI daemon runs an async exection queue; this allows any function to
* pass in work to be executed in that context
*
* @tparam WorkFn - a function of type void(void)
* @param work - the callback function to be executed
*/
template <typename WorkFn>
static inline void post_work(WorkFn work)
{
boost::asio::post(*getIoContext(), std::forward<WorkFn>(work));
}
enum class SignalResponse : int
{
breakExecution,
continueExecution,
};
/**
* @brief add a signal handler
*
* This registers a handler to be called asynchronously via the execution
* queue when the specified signal is received.
*
* Priority allows a signal handler to specify what order in the handler
* chain it gets called. Lower priority numbers will cause the handler to
* be executed later in the chain, while the highest priority numbers will cause
* the handler to be executed first.
*
* In order to facilitate a chain of handlers, each handler in the chain will be
* able to return breakExecution or continueExecution. Returning breakExecution
* will break the chain and no further handlers will execute for that signal.
* Returning continueExecution will allow lower-priority handlers to execute.
*
* By default, the main asio execution loop will register a low priority
* (prioOpenBmcBase) handler for SIGINT and SIGTERM to cause the process to stop
* on either of those signals. To prevent one of those signals from causing the
* process to stop, simply register a higher priority handler that returns
* breakExecution.
*
* @param int - priority of handler
* @param int - signal number to wait for
* @param handler - the callback function to be executed
*/
void registerSignalHandler(int priority, int signalNumber,
const std::function<SignalResponse(int)>& handler);