diff options
author | Dmitrij D. Czarkoff <czarkoff@gmail.com> | 2015-12-28 11:33:16 +0100 |
---|---|---|
committer | Dmitrij D. Czarkoff <czarkoff@gmail.com> | 2015-12-28 11:49:52 +0100 |
commit | c6096967e3d8d98f24210d4c66e4d22509bdce5c (patch) | |
tree | 6d447519cb6f20a8cf56023ef0ef2d9a17598338 /src/navigator.c | |
parent | d0b041f17c34fc36fc8121cfe23e2da2b79cf4fa (diff) | |
download | imv-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.c | 24 |
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; } } |