From b072d1bec4f8c5ee2de13722a4af63ba4350d7c7 Mon Sep 17 00:00:00 2001 From: Adriana Kobylak Date: Tue, 24 Apr 2018 11:37:21 -0500 Subject: sync_manager: Create sync watch class Create a watch class to monitor the files and directories specified in the synclist file. Store the file descriptors and file names in a map to be able to know the full path of the file that triggered the event. The watch descriptor number does not change so it can be a single variable. Change-Id: I211225ddc012af85d9be39ae5d40b8258d73435d Signed-off-by: Adriana Kobylak --- sync_watch.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 sync_watch.cpp (limited to 'sync_watch.cpp') diff --git a/sync_watch.cpp b/sync_watch.cpp new file mode 100644 index 0000000..0fc61d8 --- /dev/null +++ b/sync_watch.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include "config.h" +#include "sync_watch.hpp" + +namespace phosphor +{ +namespace software +{ +namespace manager +{ + +using namespace phosphor::logging; +namespace fs = std::experimental::filesystem; + +SyncWatch::SyncWatch(sd_event& loop, + std::function syncCallback) : + syncCallback(syncCallback) +{ + auto syncfile = fs::path(SYNC_LIST_DIR_PATH) / SYNC_LIST_FILE_NAME; + if (fs::exists(syncfile)) + { + std::string line; + std::ifstream file(syncfile.c_str()); + while (std::getline(file, line)) + { + auto fd = inotify_init1(IN_NONBLOCK); + if (-1 == fd) + { + log("inotify_init1 failed", + entry("ERRNO=%d", errno), + entry("FILENAME=%s", line.c_str()), + entry("SYNCFILE=%s", syncfile.c_str())); + continue; + } + + auto wd = inotify_add_watch(fd, line.c_str(), IN_CLOSE_WRITE); + if (-1 == wd) + { + log("inotify_add_watch failed", + entry("ERRNO=%d", errno), + entry("FILENAME=%s", line.c_str()), + entry("SYNCFILE=%s", syncfile.c_str())); + close(fd); + continue; + } + + auto rc = + sd_event_add_io(&loop, nullptr, fd, EPOLLIN, callback, this); + if (0 > rc) + { + log("failed to add to event loop", + entry("RC=%d", rc), + entry("FILENAME=%s", line.c_str()), + entry("SYNCFILE=%s", syncfile.c_str())); + inotify_rm_watch(fd, wd); + close(fd); + continue; + } + + fileMap[fd].insert(std::make_pair(wd, fs::path(line))); + } + } +} + +SyncWatch::~SyncWatch() +{ + for (const auto& fd : fileMap) + { + for (const auto& wd : fd.second) + { + inotify_rm_watch(fd.first, wd.first); + } + close(fd.first); + } +} + +int SyncWatch::callback(sd_event_source* s, int fd, uint32_t revents, + void* userdata) +{ + return 0; +} + +} // namespace manager +} // namespace software +} // namespace phosphor -- cgit v1.2.3