#pragma once #include #include #include #include namespace sdeventplus { namespace source { namespace detail { class ChildData; } // namespace detail /** @class Child * @brief A wrapper around the sd_event_source child type * See sd_event_add_child(3) for more information */ class Child : public Base { public: using Callback = fu2::unique_function; /** @brief Adds a new child source handler to the Event * This type of source defaults to Enabled::Oneshot, and needs to be * reconfigured upon each callback. * * @param[in] event - The event to attach the handler * @param[in] pid - The pid of the child to monitor * @param[in] options - An OR-ed mask that determines triggers * See waitid(2) for further information * @param[in] callback - The function executed on event dispatch */ Child(const Event& event, pid_t pid, int options, Callback&& callback); /** @brief Constructs a non-owning child source handler * Does not own the passed reference to the source because * this is meant to be used only as a reference inside an event * source. * @internal * * @param[in] other - The source wrapper to copy * @param[in] - Signifies that this new copy is non-owning */ Child(const Child& other, sdeventplus::internal::NoOwn); /** @brief Sets the callback * * @param[in] callback - The function executed on event dispatch */ void set_callback(Callback&& callback); /** @brief Gets the pid of the child process being watched * * @return The child pid * @throws SdEventError for underlying sd_event errors */ pid_t get_pid() const; private: /** @brief Returns a reference to the source owned child * * @return A reference to the child */ detail::ChildData& get_userdata() const; /** @brief Returns a reference to the callback executed for this source * * @return A reference to the callback */ Callback& get_callback(); /** @brief Creates a new child source attached to the Event * * @param[in] event - The event to attach the handler * @param[in] pid - The pid of the child to monitor * @param[in] options - An OR-ed mask that determines triggers * @throws SdEventError for underlying sd_event errors * @return A new sd_event_source */ static sd_event_source* create_source(const Event& event, pid_t pid, int options); /** @brief A wrapper around the callback that can be called from sd-event * * @param[in] source - The sd_event_source associated with the call * @param[in] userdata - The provided userdata for the source * @return 0 on success or a negative errno otherwise */ static int childCallback(sd_event_source* source, const siginfo_t* si, void* userdata); }; namespace detail { class ChildData : public Child, public BaseData { private: Child::Callback callback; public: ChildData(const Child& base, Child::Callback&& callback); friend Child; }; } // namespace detail } // namespace source } // namespace sdeventplus