libfswatch  1.9.3
inotify_monitor.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014-2015 Enrico M. Crisostomo
3  *
4  * This program is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU General Public License as published by the Free Software
6  * Foundation; either version 3, or (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
11  * details.
12  *
13  * You should have received a copy of the GNU General Public License along with
14  * this program. If not, see <http://www.gnu.org/licenses/>.
15  */
26 #ifndef FSW_INOTIFY_MONITOR_H
27 # define FSW_INOTIFY_MONITOR_H
28 
29 # include "monitor.hpp"
30 # include <sys/inotify.h>
31 # include <string>
32 # include <vector>
33 # include <sys/stat.h>
34 
35 namespace fsw
36 {
41  struct inotify_monitor_impl;
42 
49  class inotify_monitor : public monitor
50  {
51  REGISTER_MONITOR(inotify_monitor, inotify_monitor_type);
52 
53  public:
57  inotify_monitor(std::vector<std::string> paths,
59  void *context = nullptr);
60 
64  virtual ~inotify_monitor();
65 
66  protected:
74  void run();
75 
76  private:
77  inotify_monitor(const inotify_monitor& orig) = delete;
78  inotify_monitor& operator=(const inotify_monitor& that) = delete;
79 
80  void scan_root_paths();
81  bool is_watched(const std::string& path) const;
82  void preprocess_dir_event(struct inotify_event *event);
83  void preprocess_event(struct inotify_event *event);
84  void preprocess_node_event(struct inotify_event *event);
85  void scan(const std::string& path, const bool accept_non_dirs = true);
86  bool add_watch(const std::string& path,
87  const struct stat& fd_stat);
88  void process_pending_events();
89  void remove_watch(int fd);
90 
92  };
93 }
94 
95 #endif /* FSW_INOTIFY_MONITOR_H */
void run()
Executes the monitor loop.
Definition: inotify_monitor.cpp:385
Solaris/Illumos monitor.
Definition: inotify_monitor.hpp:49
void * context
Pointer to context data that will be passed to the monitor::callback.
Definition: monitor.hpp:553
Base class of all monitors.
Definition: monitor.hpp:146
Main namespace of libfswatch.
Definition: event.cpp:23
Type representing a file change event.
Definition: event.hpp:47
Definition: inotify_monitor.cpp:44
inotify_monitor(std::vector< std::string > paths, FSW_EVENT_CALLBACK *callback, void *context=nullptr)
Constructs an instance of this class.
virtual ~inotify_monitor()
Destroys an instance of this class.
Definition: inotify_monitor.cpp:93
Header of the fsw::monitor class.
Definition: cmonitor.h:48
std::vector< std::string > paths
List of paths to watch.
Definition: monitor.hpp:533
FSW_EVENT_CALLBACK * callback
Callback to which change events should be notified.
Definition: monitor.hpp:548
void FSW_EVENT_CALLBACK(const std::vector< event > &, void *)
Function definition of an event callback.
Definition: monitor.hpp:60