* Detect new or changed symlinks in addition to regular files.

This commit is contained in:
Justin Maggard 2010-12-21 00:17:27 +00:00
parent 5fbe9d10da
commit 17ec930fa1

View File

@ -189,11 +189,10 @@ inotify_create_watches(int fd)
"Hopefully it is enough to cover %u current directories plus any new ones added.\n", num_watches); "Hopefully it is enough to cover %u current directories plus any new ones added.\n", num_watches);
} }
media_path = media_dirs; for( media_path = media_dirs; media_path != NULL; media_path = media_path->next )
while( media_path )
{ {
DPRINTF(E_DEBUG, L_INOTIFY, "Add watch to %s\n", result[i]);
add_watch(fd, media_path->path); add_watch(fd, media_path->path);
media_path = media_path->next;
} }
sql_get_table(db, "SELECT PATH from DETAILS where SIZE is NULL and PATH is not NULL", &result, &rows, NULL); sql_get_table(db, "SELECT PATH from DETAILS where SIZE is NULL and PATH is not NULL", &result, &rows, NULL);
for( i=1; i <= rows; i++ ) for( i=1; i <= rows; i++ )
@ -645,9 +644,8 @@ start_inotify()
pollfds[0].fd = inotify_init(); pollfds[0].fd = inotify_init();
pollfds[0].events = POLLIN; pollfds[0].events = POLLIN;
if ( pollfds[0].fd < 0 ) { if ( pollfds[0].fd < 0 )
DPRINTF(E_ERROR, L_INOTIFY, "inotify_init() failed!\n"); DPRINTF(E_ERROR, L_INOTIFY, "inotify_init() failed!\n");
}
while( scanning ) while( scanning )
{ {
@ -696,37 +694,42 @@ start_inotify()
} }
esc_name = modifyString(strdup(event->name), "&", "&amp;amp;", 0); esc_name = modifyString(strdup(event->name), "&", "&amp;amp;", 0);
sprintf(path_buf, "%s/%s", get_path_from_wd(event->wd), event->name); sprintf(path_buf, "%s/%s", get_path_from_wd(event->wd), event->name);
if ( (event->mask & IN_CREATE && event->mask & IN_ISDIR) || if ( event->mask & IN_ISDIR && (event->mask & (IN_CREATE|IN_MOVED_TO)) )
(event->mask & IN_MOVED_TO && event->mask & IN_ISDIR) )
{ {
DPRINTF(E_DEBUG, L_INOTIFY, "The directory %s was %s.\n", path_buf, (event->mask & IN_MOVED_TO ? "moved here" : "created")); DPRINTF(E_DEBUG, L_INOTIFY, "The directory %s was %s.\n",
path_buf, (event->mask & IN_MOVED_TO ? "moved here" : "created"));
inotify_insert_directory(pollfds[0].fd, esc_name, path_buf); inotify_insert_directory(pollfds[0].fd, esc_name, path_buf);
} }
else if ( event->mask & IN_CLOSE_WRITE || event->mask & IN_MOVED_TO ) else if ( (event->mask & (IN_CLOSE_WRITE|IN_MOVED_TO|IN_CREATE)) &&
(lstat(path_buf, &st) == 0) )
{ {
if( stat(path_buf, &st) == 0 && st.st_size > 0 ) if( S_ISLNK(st.st_mode) )
{
DPRINTF(E_DEBUG, L_INOTIFY, "The symbolic link %s was %s.\n",
path_buf, (event->mask & IN_MOVED_TO ? "moved here" : "created"));
inotify_insert_file(esc_name, path_buf);
}
else if( event->mask & (IN_CLOSE_WRITE|IN_MOVED_TO) && st.st_size > 0 )
{ {
if( (event->mask & IN_MOVED_TO) || if( (event->mask & IN_MOVED_TO) ||
(sql_get_int_field(db, "SELECT TIMESTAMP from DETAILS where PATH = '%q'", path_buf) != st.st_mtime) ) (sql_get_int_field(db, "SELECT TIMESTAMP from DETAILS where PATH = '%q'", path_buf) != st.st_mtime) )
{ {
DPRINTF(E_DEBUG, L_INOTIFY, "The file %s was %s.\n", path_buf, (event->mask & IN_MOVED_TO ? "moved here" : "changed")); DPRINTF(E_DEBUG, L_INOTIFY, "The file %s was %s.\n",
path_buf, (event->mask & IN_MOVED_TO ? "moved here" : "changed"));
inotify_insert_file(esc_name, path_buf); inotify_insert_file(esc_name, path_buf);
} }
} }
} }
else if ( event->mask & IN_DELETE || event->mask & IN_MOVED_FROM ) else if ( event->mask & (IN_DELETE|IN_MOVED_FROM) )
{ {
DPRINTF(E_DEBUG, L_INOTIFY, "The %s %s was %s.\n",
(event->mask & IN_ISDIR ? "directory" : "file"),
path_buf, (event->mask & IN_MOVED_FROM ? "moved away" : "deleted"));
if ( event->mask & IN_ISDIR ) if ( event->mask & IN_ISDIR )
{
DPRINTF(E_DEBUG, L_INOTIFY, "The directory %s was %s.\n", path_buf, (event->mask & IN_MOVED_FROM ? "moved away" : "deleted"));
inotify_remove_directory(pollfds[0].fd, path_buf); inotify_remove_directory(pollfds[0].fd, path_buf);
}
else else
{
DPRINTF(E_DEBUG, L_INOTIFY, "The file %s was %s.\n", path_buf, (event->mask & IN_MOVED_FROM ? "moved away" : "deleted"));
inotify_remove_file(path_buf); inotify_remove_file(path_buf);
} }
}
free(esc_name); free(esc_name);
} }
i += EVENT_SIZE + event->len; i += EVENT_SIZE + event->len;