diff options
author | Arun Prakash Jana <engineerarun@gmail.com> | 2017-08-21 22:03:26 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-21 22:03:26 +0530 |
commit | 96e9028226dcb0713f5a362642f152d6fe2b9b48 (patch) | |
tree | 91209747a31756241f627e81b387d355e95b47f4 | |
parent | e4596db30abaa3baa82bcbf9e8e97157d774ca25 (diff) | |
download | nnn-96e9028226dcb0713f5a362642f152d6fe2b9b48.tar.gz |
Implement BSD, Apple dir watch (#35)
-rw-r--r-- | nnn.c | 39 |
1 files changed, 38 insertions, 1 deletions
@@ -9,6 +9,9 @@ #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ || defined(__APPLE__) # include <sys/types.h> +#include <sys/event.h> +#include <sys/time.h> +#define BSD_KQUEUE #else # include <sys/sysmacros.h> #endif @@ -131,6 +134,9 @@ disabledbg() #ifdef LINUX_INOTIFY #define EVENT_SIZE (sizeof(struct inotify_event)) #define EVENT_BUF_LEN (1024 * (EVENT_SIZE + 16)) +#elif defined(BSD_KQUEUE) +#define NUM_EVENT_SLOTS 1 +#define NUM_EVENT_FDS 1 #endif typedef unsigned long ulong; @@ -198,6 +204,11 @@ static uchar color = 4; #ifdef LINUX_INOTIFY static int inotify_fd, inotify_wd = -1; static uint INOTIFY_MASK = IN_ATTRIB | IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MODIFY | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO; +#elif defined(BSD_KQUEUE) +static int kq, event_fd = -1; +static struct kevent events_to_monitor[NUM_EVENT_FDS]; +static uint KQUEUE_FFLAGS = NOTE_DELETE | NOTE_EXTEND | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE | NOTE_WRITE; +static struct timespec gtimeout; #endif /* Utilities to open files, run actions */ @@ -768,6 +779,8 @@ nextsel(char **run, char **env, int *presel) static uint len = LEN(bindings); #ifdef LINUX_INOTIFY static char inotify_buf[EVENT_BUF_LEN]; +#elif defined(BSD_KQUEUE) + static struct kevent event_data[NUM_EVENT_SLOTS]; #endif c = *presel; @@ -786,8 +799,11 @@ nextsel(char **run, char **env, int *presel) */ if (!cfg.blkorder && inotify_wd >= 0 && idle & 1) if (read(inotify_fd, inotify_buf, EVENT_BUF_LEN) > 0) - c = CONTROL('L'); +#elif defined(BSD_KQUEUE) + if (!cfg.blkorder && event_fd >= 0 && idle & 1) + if (kevent(kq, events_to_monitor, NUM_EVENT_SLOTS, event_data, NUM_EVENT_FDS, >imeout) > 0) #endif + c = CONTROL('L'); } else idle = 0; @@ -1945,6 +1961,9 @@ begin: #ifdef LINUX_INOTIFY if (inotify_wd >= 0) inotify_rm_watch(inotify_fd, inotify_wd); +#elif defined(BSD_KQUEUE) + if (event_fd >= 0) + close(event_fd); #endif if (populate(path, oldpath, fltr) == -1) { @@ -1954,6 +1973,10 @@ begin: #ifdef LINUX_INOTIFY inotify_wd = inotify_add_watch(inotify_fd, path, INOTIFY_MASK); +#elif defined(BSD_KQUEUE) + event_fd = open(path, O_EVTONLY); + if (event_fd >= 0) + EV_SET(&events_to_monitor[0], event_fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, KQUEUE_FFLAGS, 0, path); #endif for (;;) { @@ -2627,6 +2650,15 @@ main(int argc, char *argv[]) fprintf(stderr, "Cannot initialize inotify: %s\n", strerror(errno)); exit(1); } +#elif defined(BSD_KQUEUE) + kq = kqueue(); + if (kq < 0) { + fprintf(stderr, "Cannot initialize kqueue: %s\n", strerror(errno)); + exit(1); + } + + gtimeout.tv_sec = 0; + gtimeout.tv_nsec = 50; /* 50 ns delay */ #endif /* Parse bookmarks string, if available */ @@ -2679,7 +2711,12 @@ main(int argc, char *argv[]) if (inotify_wd >= 0) inotify_rm_watch(inotify_fd, inotify_wd); close(inotify_fd); +#elif defined(BSD_KQUEUE) + if (event_fd >= 0) + close(event_fd); + close(kq); #endif + #ifdef DEBUGMODE disabledbg(); #endif |