diff --git a/monitor.c b/monitor.c index edbe308..b5757d9 100644 --- a/monitor.c +++ b/monitor.c @@ -366,21 +366,13 @@ monitor_insert_directory(int fd, char *name, const char * path) } int -monitor_remove_directory(int fd, const char * path) +monitor_remove_tree(const char * path) { char * sql; char **result; int64_t detailID = 0; int rows, i, ret = 1; - /* Invalidate the scanner cache so we don't insert files into non-existent containers */ - valid_cache = 0; -#ifdef HAVE_WATCH - if( fd > 0 ) - { - monitor_remove_watch(fd, path); - } -#endif sql = sqlite3_mprintf("SELECT ID from DETAILS where (PATH > '%q/' and PATH <= '%q/%c')" " or PATH = '%q'", path, path, 0xFF, path); if( (sql_get_table(db, sql, &result, &rows, NULL) == SQLITE_OK) ) @@ -403,3 +395,17 @@ monitor_remove_directory(int fd, const char * path) return ret; } + +int +monitor_remove_directory(int fd, const char * path) +{ + /* Invalidate the scanner cache so we don't insert files into non-existent containers */ + valid_cache = 0; +#ifdef HAVE_WATCH + if( fd > 0 ) + { + monitor_remove_watch(fd, path); + } +#endif + return monitor_remove_tree(path); +} diff --git a/monitor.h b/monitor.h index 1040df5..e74a425 100644 --- a/monitor.h +++ b/monitor.h @@ -1,6 +1,7 @@ int monitor_insert_file(const char *name, const char *path); int monitor_insert_directory(int fd, char *name, const char * path); int monitor_remove_file(const char * path); +int monitor_remove_tree(const char * path); int monitor_remove_directory(int fd, const char * path); #if defined(HAVE_INOTIFY) || defined(HAVE_KQUEUE) diff --git a/monitor_inotify.c b/monitor_inotify.c index 6e4276c..365b3fe 100644 --- a/monitor_inotify.c +++ b/monitor_inotify.c @@ -366,7 +366,16 @@ inotify_thread(void *arg) if ( event->mask & IN_ISDIR ) monitor_remove_directory(pollfds[0].fd, path_buf); else + { monitor_remove_file(path_buf); + /* + * When a symlink to a directory is deleted + * we cannot tell it from a regular file deletion + * to prevent its children from becoming orphans + * we delete the whole tree when it exists + */ + monitor_remove_tree(path_buf); + } } free(esc_name); }