[scan] partial scan ensure's watchers removed/readded for scanned dir
This commit is contained in:
parent
de3268eddf
commit
9999fbff7d
|
@ -1126,6 +1126,59 @@ watches_clear(uint32_t wd, char *path)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
watches_clear_bypath(char *path)
|
||||||
|
{
|
||||||
|
struct watch_info wi;
|
||||||
|
struct watch_enum we;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(&wi, 0, sizeof(struct watch_info));
|
||||||
|
|
||||||
|
wi.path = path;
|
||||||
|
db_watch_get_bypath(&wi, path);
|
||||||
|
watches_clear(wi.wd, path);
|
||||||
|
free(wi.path);
|
||||||
|
|
||||||
|
memset(&we, 0, sizeof(struct watch_enum));
|
||||||
|
we.match = ""; // get everything
|
||||||
|
|
||||||
|
ret = db_watch_enum_start(&we);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memset(&wi, 0, sizeof(struct watch_info));
|
||||||
|
wi.path = malloc(PATH_MAX);
|
||||||
|
while (db_watch_enum_fetch(&we, &wi) == 0 && wi.wd)
|
||||||
|
{
|
||||||
|
inotify_rm_watch(inofd, wi.wd);
|
||||||
|
db_watch_delete_bypath(wi.path);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
wi.wd = inotify_add_watch(inofd, wi.path, IN_ATTRIB | IN_CREATE | IN_DELETE | IN_CLOSE_WRITE | IN_MOVE | IN_DELETE | IN_MOVE_SELF);
|
||||||
|
#else
|
||||||
|
wi.wd = inotify_add_watch(inofd, wi.path, IN_CREATE | IN_DELETE | IN_MOVE);
|
||||||
|
#endif
|
||||||
|
if (wi.wd < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_SCAN, "Failed to obtain watch: '%s' - %s\n", wi.path, strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wi.cookie = 0;
|
||||||
|
db_watch_add(&wi);
|
||||||
|
}
|
||||||
|
|
||||||
|
wi.wd = 0;
|
||||||
|
wi.path[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
db_watch_enum_end(&we);
|
||||||
|
|
||||||
|
free(wi.path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Thread: scan */
|
/* Thread: scan */
|
||||||
static void
|
static void
|
||||||
process_inotify_dir(struct watch_info *wi, char *path, struct inotify_event *ie)
|
process_inotify_dir(struct watch_info *wi, char *path, struct inotify_event *ie)
|
||||||
|
@ -1711,8 +1764,11 @@ filescanner_rescan_path(const char *path)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_SCAN, "rescan triggered for '%s'\n", path);
|
DPRINTF(E_LOG, L_SCAN, "rescan triggered for '%s'\n", path);
|
||||||
|
|
||||||
db_watch_delete_bypath((char*)path);
|
inofd_event_unset(); // Clears all inotify watches, closing hdl
|
||||||
db_watch_delete_bymatch((char*)path);
|
inofd_event_set(); // and get a new inotify hdl
|
||||||
|
|
||||||
|
// readd watchers but exclude path and let the bulk_scan to readd
|
||||||
|
watches_clear_bypath((char*)path);
|
||||||
bulk_scan(path, F_SCAN_BULK | F_SCAN_RESCAN);
|
bulk_scan(path, F_SCAN_BULK | F_SCAN_RESCAN);
|
||||||
|
|
||||||
if (!library_is_exiting())
|
if (!library_is_exiting())
|
||||||
|
|
Loading…
Reference in New Issue