aboutsummaryrefslogtreecommitdiff
path: root/src/navigator.c
diff options
context:
space:
mode:
authorDmitrij D. Czarkoff <czarkoff@gmail.com>2015-12-28 11:33:16 +0100
committerDmitrij D. Czarkoff <czarkoff@gmail.com>2015-12-28 11:49:52 +0100
commitc6096967e3d8d98f24210d4c66e4d22509bdce5c (patch)
tree6d447519cb6f20a8cf56023ef0ef2d9a17598338 /src/navigator.c
parentd0b041f17c34fc36fc8121cfe23e2da2b79cf4fa (diff)
downloadimv-c6096967e3d8d98f24210d4c66e4d22509bdce5c.tar.gz
Use stat(2) to monitor file changes
Makes file monitoring in imv completely POSIX.
Diffstat (limited to 'src/navigator.c')
-rw-r--r--src/navigator.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/navigator.c b/src/navigator.c
index fcaa93a..bd049c5 100644
--- a/src/navigator.c
+++ b/src/navigator.c
@@ -27,6 +27,7 @@ void imv_navigator_init(struct imv_navigator *nav)
{
nav->buf_size = 512;
nav->paths = malloc(sizeof(char*) * nav->buf_size);
+ nav->mtimes = malloc(sizeof(time_t) * nav->buf_size);
nav->num_paths = 0;
nav->cur_path = 0;
nav->last_move_direction = 1;
@@ -38,25 +39,33 @@ void imv_navigator_destroy(struct imv_navigator *nav)
if(nav->buf_size > 0) {
free(nav->paths);
nav->paths = NULL;
+ free(nav->mtimes);
+ nav->mtimes = NULL;
nav->buf_size = 0;
}
nav->num_paths = 0;
}
-static void add_item(struct imv_navigator *nav, const char *path)
+static void add_item(struct imv_navigator *nav, const char *path,
+ time_t mtime)
{
if(nav->buf_size == nav->num_paths) {
char **new_paths;
+ time_t *new_mtimes;
nav->buf_size *= 2;
new_paths = realloc(nav->paths, sizeof(char*) * nav->buf_size);
- if (new_paths == NULL) {
+ new_mtimes = realloc(nav->mtimes, sizeof(time_t) * nav->buf_size);
+ if (new_paths == NULL || new_mtimes == NULL) {
perror("add_item");
free(nav->paths);
+ free(nav->mtimes);
exit(1);
}
nav->paths = new_paths;
+ nav->mtimes = new_mtimes;
}
nav->paths[nav->num_paths] = strdup(path);
+ nav->mtimes[nav->num_paths] = mtime;
nav->num_paths += 1;
if(nav->num_paths == 1) {
nav->changed = 1;
@@ -82,13 +91,13 @@ void imv_navigator_add(struct imv_navigator *nav, const char *path,
if(recursive) {
imv_navigator_add(nav, path_buf, recursive);
} else {
- add_item(nav, path_buf);
+ add_item(nav, path_buf, path_info.st_mtim.tv_sec);
}
}
closedir(d);
}
} else {
- add_item(nav, path);
+ add_item(nav, path, path_info.st_mtim.tv_sec);
}
}
@@ -198,6 +207,13 @@ int imv_navigator_poll_changed(struct imv_navigator *nav)
nav->changed = 0;
return 1;
} else {
+ struct stat file_info;
+ if (stat(nav->paths[nav->cur_path], &file_info) == -1)
+ return 0;
+ if (nav->mtimes[nav->cur_path] != file_info.st_mtim.tv_sec) {
+ nav->mtimes[nav->cur_path] = file_info.st_mtim.tv_sec;
+ return 1;
+ }
return 0;
}
}