blob: 730199433e5fcc72faea1d7a41d8998f0f5a49c5 [file] [log] [blame]
#ifndef INOTIFY_DIR_MONITOR_H_
#define INOTIFY_DIR_MONITOR_H_
#include <map>
#include <set>
#include <string>
#include <vector>
#define INOTIFY_DIR_EVENTS IN_MOVE|IN_CREATE|IN_MODIFY|IN_DELETE_SELF|IN_ONLYDIR
#define INOTIFY_FILE_EVENTS IN_MOVE|IN_CREATE|IN_MODIFY|IN_DELETE_SELF
#define MAX_EVENTS_BUF_SIZE 65536
// TODO(irinams) : this value is hardcoded for the moment, it actually should
// be read from /proc/sys/fs/inotify/max_user_watches
#define MAX_USER_WATCHES 8192
class DirMonitor {
public:
DirMonitor(int argc, char *argv[]);
~DirMonitor();
void StartMonitoring();
int AddWatch(const std::string &dir_path, int root_dir_wd, int events);
int AddWatchRecursively(const std::string &dir_path, int root_dir_wd);
void HandleDirectoryCreate(const char *name, int wd);
void HandleFileCreate(const char *name, int wd);
void HandleFileModify(const char *name, int wd);
void HandleMoveFrom(const char *name, int wd);
void HandleMoveTo(const char *name, int wd);
void HandleDeleteSelf(int wd);
private:
// Disabling no arguments constructor and copy-constructor
DirMonitor();
DirMonitor(const DirMonitor &monitor);
void StorePair(const std::string &path, int wd);
void RemovePair(const std::string &path, int wd);
void AddToParentList(int pwd, int wd);
void RemoveFromParentList(const std::string &path, int wd);
void RemoveFromParentList(int pwd, int wd);
void GetFullDirPath(const char *dir_name, int pwd, std::string *path) const;
void GetDirPath(int dir_wd, std::string *path) const;
std::string GetFullDirPath(const char *dir_name, int pwd) const;
std::string GetDirPath(int dir_wd) const;
int GetWatchDescriptor(const std::string &dir_path) const;
int GetParentWatchDescriptor(int dir_wd) const;
int GetParentWatchDescriptor(const std::string &path, int dir_wd) const;
typedef std::map<std::string, int> Path2WDMap;
typedef std::map<int, std::string> WD2PathMap;
typedef std::vector<std::set<int> > WDChildrenList;
Path2WDMap p2wd_map_; // path to watch descriptor map
WD2PathMap wd2p_map_; // watch descriptor to path map
WDChildrenList wds_;
int inotify_fd_;
};
#endif // INOTIFY_DIR_MONITOR_H_