diff options
Diffstat (limited to 'watch.hpp')
-rw-r--r-- | watch.hpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/watch.hpp b/watch.hpp new file mode 100644 index 0000000..0e20420 --- /dev/null +++ b/watch.hpp @@ -0,0 +1,114 @@ +#pragma once + +#include "util.hpp" +#include "types.hpp" +#include "dns_updater.hpp" + +#include <systemd/sd-event.h> + +#include <sys/inotify.h> +#include <map> +#include <functional> +#include <experimental/filesystem> + +namespace phosphor +{ +namespace network +{ +namespace inotify +{ + +namespace fs = std::experimental::filesystem; + +// Auxiliary callback to be invoked on inotify events +using UserCallBack = std::function<void(const std::string&)>; + +/** @class Watch + * + * @brief Adds inotify watch on directory + * + * @details Calls back user function on matching events + */ +class Watch +{ + public: + Watch() = delete; + Watch(const Watch&) = delete; + Watch& operator=(const Watch&) = delete; + Watch(Watch&&) = delete; + Watch& operator=(Watch&&) = delete; + + /** @brief Hooks inotify watch with sd-event + * + * @param[in] eventPtr - Reference to sd_event wrapped in unique_ptr + * @param[in] path - File path to be watched + * @param[in] userFunc - User specific callback function on events + * @param[in] flags - Flags to be supplied to inotify + * @param[in] mask - Mask of events to be supplied to inotify + * @param[in] events - Events to be watched + */ + Watch(phosphor::network::EventPtr& eventPtr, + const fs::path path, + UserCallBack userFunc, + int flags = IN_NONBLOCK, + uint32_t mask = IN_CLOSE_WRITE, + uint32_t events = EPOLLIN); + + /** @brief Remove inotify watch and close fd's */ + ~Watch() + { + if ((fd() >= 0) && (wd >= 0)) + { + inotify_rm_watch(fd(), wd); + } + } + + private: + /** @brief Callback invoked when inotify event fires + * + * @details On a matching event, calls back into user supplied + * function if there is one registered + * + * @param[in] eventSource - Event source + * @param[in] fd - Inotify fd + * @param[in] retEvents - Events that matched for fd + * @param[in] userData - Pointer to Watch object + * + * @returns 0 on success, -1 on fail + */ + static int processEvents(sd_event_source* eventSource, + int fd, + uint32_t retEvents, + void* userData); + + /** @brief Initializes an inotify instance + * + * @return Descriptor on success, -1 on failure + */ + int inotifyInit(); + + /** @brief File path to be watched */ + const fs::path path; + + /** @brief User callback function */ + UserCallBack userFunc; + + /** @brief Inotify flags */ + int flags; + + /** @brief Mask of events */ + uint32_t mask; + + /** @brief Events to be watched */ + uint32_t events; + + /** @brief Watch descriptor */ + int wd = -1; + + /** @brief File descriptor manager */ + phosphor::Descriptor fd; +}; + +} // namespace inotify +} // namespace network +} // namespace phosphor |