aboutsummaryrefslogtreecommitdiff
path: root/src/reload.c
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2015-12-10 17:56:25 +0000
committerHarry Jeffery <harry@exec64.co.uk>2015-12-10 17:56:25 +0000
commitedad12139bd984eb856bb7248b09b2c2f363cecd (patch)
tree0a092e10447e2580fba174654992aa4b58d58231 /src/reload.c
parentc2871c53235b57e90b666fe1ebea6f7b99225357 (diff)
parent8684b7654d4f78f72f76de88b3f60ee146388d5b (diff)
downloadimv-edad12139bd984eb856bb7248b09b2c2f363cecd.tar.gz
Merge pull request #51 from eXeC64/imv_reload
Add support for reloading files
Diffstat (limited to 'src/reload.c')
-rw-r--r--src/reload.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/reload.c b/src/reload.c
new file mode 100644
index 0000000..a307d45
--- /dev/null
+++ b/src/reload.c
@@ -0,0 +1,49 @@
+#include <sys/inotify.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "reload.h"
+
+void imv_init_reload(struct imv_reload *rld)
+{
+ rld->fd = inotify_init1(IN_NONBLOCK);
+ if(rld->fd == -1) {
+ perror("imv_init_reload");
+ }
+
+ rld->wd = 0;
+}
+
+void imv_reload_watch(struct imv_reload *rld, const char *path)
+{
+ if(rld->wd != 0) {
+ inotify_rm_watch(rld->fd, rld->wd);
+ }
+
+ rld->wd = inotify_add_watch(rld->fd, path, IN_CLOSE_WRITE);
+ if(rld->wd == -1) {
+ perror("imv_reload_watch");
+ }
+}
+
+int imv_reload_changed(struct imv_reload *rld)
+{
+ struct inotify_event ev;
+ ssize_t len = read(rld->fd, &ev, sizeof(ev));
+
+ if(len < 0) {
+ if(errno != EAGAIN) {
+ perror("imv_reload_changed");
+ }
+ } else if(ev.mask & IN_CLOSE_WRITE) {
+ return 1;
+ }
+
+ return 0;
+}
+
+void imv_destroy_reload(struct imv_reload *rld)
+{
+ close(rld->fd);
+}