| @ -0,0 +1,58 @@ | |||||
| #include <sys/inotify.h> | |||||
| #include <inotifytools/inotifytools.h> | |||||
| #include <cerrno> | |||||
| #include <poll.h> | |||||
| #include "project.h" | |||||
| #define MAX_WDS 16 | |||||
| typedef void (Project::*ProjectReloadFn)(); | |||||
| class NotifyService { | |||||
| public: | |||||
| NotifyService() { | |||||
| this->inotify_fd = inotify_init1(IN_NONBLOCK); | |||||
| if (inotify_fd == -1) { | |||||
| perror("inotify_init1"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| std::cout << "inotify fd: " << inotify_fd << '\n'; | |||||
| this->poll_fd = {.fd = inotify_fd, .events = POLLIN, 0}; | |||||
| } | |||||
| void watch(Project &project) { | |||||
| int wd = inotify_add_watch(this->inotify_fd, project.basepath.str().c_str(), | |||||
| IN_MODIFY); | |||||
| if (wd == -1) { | |||||
| std::cerr << "Failed to watch project base directory: " << project.basepath.str().c_str() << '\n'; | |||||
| perror("inotify_add_watch"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| std::cerr << "Watching " << project.basepath << " with wd: " << wd << '\n'; | |||||
| this->watch_ids.push_back(wd); | |||||
| } | |||||
| void _poll() { | |||||
| int rc = poll(&this->poll_fd, 1, 0); | |||||
| std::cout << "poll() -> " << rc << '\n'; | |||||
| if (rc == -1) { | |||||
| if (errno == EINTR) | |||||
| return; | |||||
| perror("poll"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| if (rc > 0) { | |||||
| std::cout << "poll data available!\n"; | |||||
| } | |||||
| } | |||||
| private: | |||||
| int inotify_fd; | |||||
| struct pollfd poll_fd; | |||||
| std::vector<int> watch_ids; | |||||
| }; | |||||