blob: 95dfc61d5c9cbbe1bb49a39934842de8c0585908 [file] [log] [blame]
#include <sdbusplus/bus.hpp>
#include <sdbusplus/exception.hpp>
namespace sdbusplus::bus
{
void bus::emit_interfaces_added(const char* path,
const std::vector<std::string>& ifaces)
{
details::Strv s{ifaces};
_intf->sd_bus_emit_interfaces_added_strv(_bus.get(), path,
static_cast<char**>(s));
}
void bus::emit_interfaces_removed(const char* path,
const std::vector<std::string>& ifaces)
{
details::Strv s{ifaces};
_intf->sd_bus_emit_interfaces_removed_strv(_bus.get(), path,
static_cast<char**>(s));
}
/* Create a new default connection: system bus if root, session bus if user. */
bus new_default()
{
sd_bus* b = nullptr;
auto rc = sd_bus_default(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
return bus(b, std::false_type());
}
/* Create a new default connection to the session bus. */
bus new_default_user()
{
sd_bus* b = nullptr;
auto rc = sd_bus_default_user(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
return bus(b, std::false_type());
}
/* Create a new default connection to the system bus. */
bus new_default_system()
{
sd_bus* b = nullptr;
auto rc = sd_bus_default_system(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
return bus(b, std::false_type());
}
/* Create a new connection: system bus if root, session bus if user. */
bus new_bus()
{
sd_bus* b = nullptr;
auto rc = sd_bus_open(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
bus bus(b, std::false_type());
bus.set_should_close(true);
return bus;
}
/* Create a new connection to the session bus. */
bus new_user()
{
sd_bus* b = nullptr;
auto rc = sd_bus_open_user(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
bus bus(b, std::false_type());
bus.set_should_close(true);
return bus;
}
/* Create a new connection to the system bus. */
bus new_system()
{
sd_bus* b = nullptr;
auto rc = sd_bus_open_system(&b);
if (rc < 0)
{
throw exception::SdBusError(-rc, __PRETTY_FUNCTION__);
}
bus bus(b, std::false_type());
bus.set_should_close(true);
return bus;
}
bus::bus(busp_t b, sdbusplus::SdBusInterface* intf) :
_intf(intf), _bus(_intf->sd_bus_ref(b), details::BusDeleter(intf))
{
// Emitting object added causes a message to get the properties
// which can trigger a 'transaction' in the server bindings. If
// the bus isn't up far enough, this causes an assert deep in
// sd-bus code. Get the 'unique_name' to ensure the bus is up far
// enough to avoid the assert.
if (b != nullptr)
{
get_unique_name();
}
}
bus::bus(busp_t b) :
_intf(&sdbus_impl),
_bus(_intf->sd_bus_ref(b), details::BusDeleter(&sdbus_impl))
{
// Emitting object added causes a message to get the properties
// which can trigger a 'transaction' in the server bindings. If
// the bus isn't up far enough, this causes an assert deep in
// sd-bus code. Get the 'unique_name' to ensure the bus is up far
// enough to avoid the assert.
if (b != nullptr)
{
get_unique_name();
}
}
bus::bus(busp_t b, std::false_type) :
_intf(&sdbus_impl), _bus(b, details::BusDeleter(&sdbus_impl))
{
// Emitting object added causes a message to get the properties
// which can trigger a 'transaction' in the server bindings. If
// the bus isn't up far enough, this causes an assert deep in
// sd-bus code. Get the 'unique_name' to ensure the bus is up far
// enough to avoid the assert.
if (b != nullptr)
{
get_unique_name();
}
}
} // namespace sdbusplus::bus