Add a feature to return the directories and files that are being monitored (#374)
* Add a feature to return the directories and files that are being monitored
* add WatchList() method for bsd and windows platforms
* preallocate space for the array to be returned
diff --git a/inotify.go b/inotify.go
index eb87699..a6d0e0e 100644
--- a/inotify.go
+++ b/inotify.go
@@ -163,6 +163,19 @@
return nil
}
+// WatchList returns the directories and files that are being monitered.
+func (w *Watcher) WatchList() []string {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ entries := make([]string, 0, len(w.watches))
+ for pathname := range w.watches {
+ entries = append(entries, pathname)
+ }
+
+ return entries
+}
+
type watch struct {
wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
diff --git a/inotify_test.go b/inotify_test.go
index f121c01..bb6db09 100644
--- a/inotify_test.go
+++ b/inotify_test.go
@@ -459,3 +459,40 @@
numDirs*numFiles, creates)
}
}
+
+func TestInotifyWatchList(t *testing.T) {
+ testDir := tempMkdir(t)
+ defer os.RemoveAll(testDir)
+ testFile := filepath.Join(testDir, "testfile")
+
+ handle, err := os.Create(testFile)
+ if err != nil {
+ t.Fatalf("Create failed: %v", err)
+ }
+ handle.Close()
+
+ w, err := NewWatcher()
+ if err != nil {
+ t.Fatalf("Failed to create watcher: %v", err)
+ }
+ defer w.Close()
+
+ err = w.Add(testFile)
+ if err != nil {
+ t.Fatalf("Failed to add testFile: %v", err)
+ }
+ err = w.Add(testDir)
+ if err != nil {
+ t.Fatalf("Failed to add testDir: %v", err)
+ }
+
+ value := w.WatchList()
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ for _, entry := range value {
+ if _, ok := w.watches[entry]; !ok {
+ t.Fatal("return value of WatchList is not same as the expected")
+ }
+ }
+}
diff --git a/kqueue.go b/kqueue.go
index 368f5b7..6fb8d85 100644
--- a/kqueue.go
+++ b/kqueue.go
@@ -148,6 +148,19 @@
return nil
}
+// WatchList returns the directories and files that are being monitered.
+func (w *Watcher) WatchList() []string {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ entries := make([]string, 0, len(w.watches))
+ for pathname := range w.watches {
+ entries = append(entries, pathname)
+ }
+
+ return entries
+}
+
// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
diff --git a/windows.go b/windows.go
index b0105ae..ddc69ef 100644
--- a/windows.go
+++ b/windows.go
@@ -97,6 +97,21 @@
return <-in.reply
}
+// WatchList returns the directories and files that are being monitered.
+func (w *Watcher) WatchList() []string {
+ w.mu.Lock()
+ w.mu.Unlock()
+
+ entries := make([]string, 0, len(w.watches))
+ for _, entry := range w.watches {
+ for _, watchEntry := range entry {
+ entries = append(entries, watchEntry.path)
+ }
+ }
+
+ return entries
+}
+
const (
// Options for AddWatch
sysFSONESHOT = 0x80000000