| #pragma once |
| |
| #include <experimental/filesystem> |
| #include <functional> |
| #include <systemd/sd-event.h> |
| #include <sys/inotify.h> |
| #include <map> |
| |
| #include "dump_utils.hpp" |
| |
| namespace phosphor |
| { |
| namespace dump |
| { |
| namespace inotify |
| { |
| |
| namespace fs = std::experimental::filesystem; |
| |
| //User specific call back function input map(path:event) type. |
| using UserMap = std::map<fs::path, uint32_t>; |
| |
| //User specific callback function wrapper type. |
| using UserType = std::function<void(const UserMap&)>; |
| |
| /** @class Watch |
| * |
| * @brief Adds inotify watch on directory. |
| * |
| * The inotify watch is hooked up with sd-event, so that on call back, |
| * appropriate actions are taken to collect files from the directory |
| * initialized by the object. |
| */ |
| class Watch |
| { |
| public: |
| /** @brief ctor - hook inotify watch with sd-event |
| * |
| * @param[in] eventObj - Event loop object |
| * @param[in] flags - inotify flags |
| * @param[in] mask - Mask of events |
| * @param[in] events - Events to be watched |
| * @param[in] path - File path to be watched |
| * @param[in] userFunc - User specific callback fnction wrapper. |
| * |
| */ |
| Watch(const EventPtr& eventObj, |
| int flags, |
| uint32_t mask, |
| uint32_t events, |
| const fs::path& path, |
| UserType userFunc); |
| |
| Watch(const Watch&) = delete; |
| Watch& operator=(const Watch&) = delete; |
| Watch(Watch&&) = default; |
| Watch& operator=(Watch&&) = default; |
| |
| /* @brief dtor - remove inotify watch and close fd's */ |
| ~Watch(); |
| |
| private: |
| /** @brief sd-event callback. |
| * @details Collects the files and event info and call the |
| * appropriate user function for further action. |
| * |
| * @param[in] s - event source, floating (unused) in our case |
| * @param[in] fd - inotify fd |
| * @param[in] revents - events that matched for fd |
| * @param[in] userdata - pointer to Watch object |
| * |
| * @returns 0 on success, -1 on fail |
| */ |
| static int callback(sd_event_source* s, |
| int fd, |
| uint32_t revents, |
| void* userdata); |
| |
| /** initialize an inotify instance and returns file descriptor */ |
| int inotifyInit(); |
| |
| /** @brief inotify flags */ |
| int flags; |
| |
| /** @brief Mask of events */ |
| uint32_t mask; |
| |
| /** @brief Events to be watched */ |
| uint32_t events; |
| |
| /** @brief File path to be watched */ |
| fs::path path; |
| |
| /** @brief dump file directory watch descriptor */ |
| int wd = -1; |
| |
| /** @brief file descriptor manager */ |
| CustomFd fd; |
| |
| /** @brief The user level callback function wrapper */ |
| UserType userFunc; |
| }; |
| |
| } // namespace inotify |
| } // namespace dump |
| } // namespace phosphor |