diff --git a/CMakeLists.txt b/CMakeLists.txt index a7d76c5..b1497b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,42 +6,42 @@ set(CMAKE_CXX_VISIBILITY_PRESET protected) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold") set(HEADER_FILES - src/dbus_asio.h - src/dbus_auth.h - src/dbus_connection.h - src/dbus_error.h - src/dbus.h - src/dbus_introspectable.h - src/dbus_log.h - src/dbus_matchrule.h - src/dbus_message.h - src/dbus_messageprotocol.h - src/dbus_messageostream.h - src/dbus_messageistream.h - src/dbus_names.h - src/dbus_octetbuffer.h - src/dbus_platform.h - src/dbus_transport.h - src/dbus_type.h - src/dbus_type_any.h - src/dbus_type_array.h - src/dbus_type_boolean.h - src/dbus_type_byte.h - src/dbus_type_dictentry.h - src/dbus_type_double.h - src/dbus_type_int16.h - src/dbus_type_int32.h - src/dbus_type_int64.h - src/dbus_type_objectpath.h - src/dbus_type_signature.h - src/dbus_type_string.h - src/dbus_type_struct.h - src/dbus_type_uint16.h - src/dbus_type_uint32.h - src/dbus_type_uint64.h - src/dbus_type_unixfd.h - src/dbus_type_variant.h - src/dbus_utils.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_asio.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_auth.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_connection.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_error.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_introspectable.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_log.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_matchrule.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_message.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageostream.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageistream.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_names.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_octetbuffer.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_platform.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_transport.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_any.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_array.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_boolean.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_byte.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_dictentry.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_double.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int16.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int32.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int64.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_objectpath.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_signature.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_string.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_struct.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint16.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint32.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint64.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_unixfd.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_variant.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_utils.h ) add_library(dbus-asio SHARED diff --git a/src/dbus_connection.h b/src/dbus_connection.h index c0f6dcf..cb51d36 100644 --- a/src/dbus_connection.h +++ b/src/dbus_connection.h @@ -19,14 +19,21 @@ #include "dbus_asio.h" #include "dbus_auth.h" +#include "dbus_matchrule.h" #include "dbus_messageprotocol.h" #include "dbus_transport.h" +#include #include +#include #include +#include +#include namespace DBus { +struct WellKnownName; + static constexpr char const *Name = "org.freedesktop.DBus"; static constexpr char const *Object = "/org/freedesktop/DBus"; static constexpr char const *Interface = "org.freedesktop.DBus"; @@ -344,7 +351,7 @@ class Connection : public std::enable_shared_from_this { } template - auto addMatch(const MatchRule& rule, CompletionToken&& token) const + auto addMatch(const MatchRule& rule, CompletionToken&& token) { return sendMethodCall({ DBus::Name, {DBus::Object, DBus::Interface, "AddMatch"}, {rule.str()} }, @@ -352,7 +359,7 @@ class Connection : public std::enable_shared_from_this { } template - auto removeMatch(const MatchRule& rule, CompletionToken&& token) const + auto removeMatch(const MatchRule& rule, CompletionToken&& token) { return sendMethodCall({ DBus::Name, {DBus::Object, DBus::Interface, "RemoveMatch"}, {rule.str()} }, diff --git a/src/dbus_log.cpp b/src/dbus_log.cpp index 227210a..e5447be 100644 --- a/src/dbus_log.cpp +++ b/src/dbus_log.cpp @@ -66,7 +66,7 @@ void DBus::Log::writeHex(std::size_t type, const std::string& prefix, for (std::size_t i = 0; i < size; ++i) { const unsigned char byte = *(first + i); oss << std::hex << std::setw(2) << std::setfill('0') - << static_cast(byte) << ' '; + << static_cast(byte) << ' '; *ascii++ = ::isprint(byte) ? byte : '.'; if (++column == maxColumns) { column = 0; diff --git a/src/dbus_message.cpp b/src/dbus_message.cpp index 55f82b0..b67049d 100644 --- a/src/dbus_message.cpp +++ b/src/dbus_message.cpp @@ -233,7 +233,7 @@ DBus::Message::Header::getSize(const OctetBuffer& message) // Add size of the header fields array const Endian endianness = Message::endianness(message); - size += correctEndianess(endianness, *(uint32_t*)(message.data() + 12)); + size += correctEndianess(endianness, *reinterpret_cast(message.data() + 12)); // Add padding to an 8 byte boundary size += (size % 8 == 0) ? 0 : 8 - (size % 8); @@ -250,7 +250,7 @@ DBus::Message::Header::getMessageSize(const OctetBuffer& message) return 0; // TODO: throw instead? const Endian endianness = Message::endianness(message); - std::size_t body_size = correctEndianess(endianness, *(uint32_t*)(message.data() + 4)); + std::size_t body_size = correctEndianess(endianness, *reinterpret_cast(message.data() + 4)); std::size_t msg_size = getSize(message) + body_size; if (msg_size > Message::MaximumSize) diff --git a/src/dbus_names.cpp b/src/dbus_names.cpp index 0509c1b..e1d1b9b 100644 --- a/src/dbus_names.cpp +++ b/src/dbus_names.cpp @@ -83,7 +83,7 @@ DBus::Name::validate(const std::string& name, Type type) const bool havePeriod = false; char prev = '.'; - for (int i = isUnique ? 1 : 0; i < name.size(); ++i) { + for (std::size_t i = isUnique ? 1 : 0; i < name.size(); ++i) { const char ch = name[i]; if (allowPeriod && ch == '.') { if (prev == '.') diff --git a/src/dbus_transport.h b/src/dbus_transport.h index 23dff8c..d2df127 100644 --- a/src/dbus_transport.h +++ b/src/dbus_transport.h @@ -93,9 +93,10 @@ class Transport : public std::enable_shared_from_this { msg.msg_iov = &iov; msg.msg_iovlen = 1; - char fdbuf[CMSG_SPACE(self->m_maxRecvUnixFds * sizeof(int))]; - msg.msg_control = fdbuf; - msg.msg_controllen = sizeof(fdbuf); + std::size_t fdbufSize = CMSG_SPACE(self->m_maxRecvUnixFds * sizeof(int)); + std::unique_ptr fdbuf(::new char[fdbufSize]); + msg.msg_control = fdbuf.get(); + msg.msg_controllen = fdbufSize; ssize_t read_total = 0; do { @@ -163,9 +164,10 @@ class Transport : public std::enable_shared_from_this { msg.msg_iovlen = 1; const size_t fdlen = payload->fds.size() * sizeof(int); - char fdbuf[CMSG_SPACE(fdlen)]; - msg.msg_control = fdbuf; - msg.msg_controllen = sizeof(fdbuf); + std::size_t fdbufSize = CMSG_SPACE(fdlen); + std::unique_ptr fdbuf(::new char[fdbufSize]); + msg.msg_control = fdbuf.get(); + msg.msg_controllen = fdbufSize; struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(fdlen); diff --git a/src/dbus_type_array.cpp b/src/dbus_type_array.cpp index 2c9fc47..b3135c7 100644 --- a/src/dbus_type_array.cpp +++ b/src/dbus_type_array.cpp @@ -60,7 +60,7 @@ void DBus::Type::Array::marshall(MessageOStream& stream) const if (contentsSize > Array::MaximumSize) throw std::out_of_range("Array " + getSignature() + ": size " + std::to_string(contentsSize) + " exceeds 64 MiB"); - stream.data.replace(sizePos, 4, (char*)&contentsSize, sizeof(uint32_t)); + stream.data.replace(sizePos, 4, reinterpret_cast(&contentsSize), sizeof(uint32_t)); } void DBus::Type::Array::unmarshall(MessageIStream& stream)