| #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 |