diff options
| -rw-r--r-- | docs/interface.md | 1 | ||||
| -rw-r--r-- | sdbusplus/message/append.hpp | 20 | ||||
| -rw-r--r-- | sdbusplus/message/native_types.hpp | 11 | ||||
| -rw-r--r-- | sdbusplus/message/read.hpp | 22 | ||||
| -rw-r--r-- | sdbusplus/message/types.hpp | 4 | ||||
| -rw-r--r-- | tools/sdbusplus/property.py | 1 |
6 files changed, 59 insertions, 0 deletions
diff --git a/docs/interface.md b/docs/interface.md index f32bd3b..f813e31 100644 --- a/docs/interface.md +++ b/docs/interface.md @@ -78,6 +78,7 @@ but listed using lowercases: `int64` instead of `INT64` or C++ `int64_t`. * ... * uint64 * double +* unixfd * string * object_path * signature diff --git a/sdbusplus/message/append.hpp b/sdbusplus/message/append.hpp index 1a414d2..32d4b46 100644 --- a/sdbusplus/message/append.hpp +++ b/sdbusplus/message/append.hpp @@ -52,6 +52,11 @@ template <typename T, typename Enable = void> struct can_append_multiple : std::true_type { }; +// unix_fd's int needs to be wrapped. +template <> +struct can_append_multiple<unix_fd> : std::false_type +{ +}; // std::string needs a c_str() call. template <> struct can_append_multiple<std::string> : std::false_type @@ -166,6 +171,21 @@ struct append_single template <typename T> using append_single_t = append_single<types::details::type_id_downcast_t<T>>; +/** @brief Specialization of append_single for details::unix_fd. */ +template <> +struct append_single<details::unix_fd_type> +{ + template <typename T> + static void op(sdbusplus::SdBusInterface* intf, sd_bus_message* m, T&& s) + { + constexpr auto dbusType = std::get<0>(types::type_id<T>()); + intf->sd_bus_message_append_basic(m, dbusType, &s.fd); + + // sd-bus now owns the file descriptor + s.fd = -1; + } +}; + /** @brief Specialization of append_single for std::strings. */ template <> struct append_single<std::string> diff --git a/sdbusplus/message/native_types.hpp b/sdbusplus/message/native_types.hpp index b67c7e1..efa0d3f 100644 --- a/sdbusplus/message/native_types.hpp +++ b/sdbusplus/message/native_types.hpp @@ -80,6 +80,16 @@ struct object_path_type struct signature_type { }; +/** Typename for sdbus UNIX_FD types. */ +struct unix_fd_type +{ + int fd; + + operator int() const + { + return fd; + } +}; } // namespace details @@ -87,6 +97,7 @@ struct signature_type using object_path = details::string_wrapper<details::object_path_type>; /** std::string wrapper for SIGNATURE. */ using signature = details::string_wrapper<details::signature_type>; +using unix_fd = details::unix_fd_type; } // namespace message } // namespace sdbusplus diff --git a/sdbusplus/message/read.hpp b/sdbusplus/message/read.hpp index 2035d30..7a99570 100644 --- a/sdbusplus/message/read.hpp +++ b/sdbusplus/message/read.hpp @@ -51,6 +51,11 @@ template <typename T, typename Enable = void> struct can_read_multiple : std::true_type { }; +// unix_fd's int needs to be wrapped +template <> +struct can_read_multiple<unix_fd> : std::false_type +{ +}; // std::string needs a char* conversion. template <> struct can_read_multiple<std::string> : std::false_type @@ -150,6 +155,23 @@ struct read_single template <typename T> using read_single_t = read_single<types::details::type_id_downcast_t<T>>; +/** @brief Specialization of read_single for details::unix_fd. */ +template <> +struct read_single<details::unix_fd_type> +{ + template <typename T> + static void op(sdbusplus::SdBusInterface* intf, sd_bus_message* m, T&& s) + { + constexpr auto dbusType = std::get<0>(types::type_id<T>()); + int r = intf->sd_bus_message_read_basic(m, dbusType, &s.fd); + if (r < 0) + { + throw exception::SdBusError(-r, + "sd_bus_message_read_basic unix_fd"); + } + } +}; + /** @brief Specialization of read_single for std::strings. */ template <> struct read_single<std::string> diff --git a/sdbusplus/message/types.hpp b/sdbusplus/message/types.hpp index 141c656..eb7407f 100644 --- a/sdbusplus/message/types.hpp +++ b/sdbusplus/message/types.hpp @@ -219,6 +219,10 @@ struct type_id<char*> : tuple_type_id<SD_BUS_TYPE_STRING> { }; template <> +struct type_id<unix_fd> : tuple_type_id<SD_BUS_TYPE_UNIX_FD> +{ +}; +template <> struct type_id<std::string> : tuple_type_id<SD_BUS_TYPE_STRING> { }; diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py index 33c7e25..fb774b6 100644 --- a/tools/sdbusplus/property.py +++ b/tools/sdbusplus/property.py @@ -114,6 +114,7 @@ class Property(NamedElement, Renderer): 'int64': {'cppName': 'int64_t', 'params': 0}, 'uint64': {'cppName': 'uint64_t', 'params': 0}, 'double': {'cppName': 'double', 'params': 0}, + 'unixfd': {'cppName': 'sdbusplus::message::unix_fd', 'params': 0}, 'string': {'cppName': 'std::string', 'params': 0}, 'path': {'cppName': 'sdbusplus::message::object_path', 'params': 0}, |

