[scan] Early skip if file should be ignored

Avoids needless logging, e.g. from failed lstat(). Closes #1078.
This commit is contained in:
ejurgensen 2020-08-22 21:23:32 +02:00
parent c5df688caf
commit bb9536ef44

View File

@ -640,12 +640,12 @@ process_regular_file(const char *file, struct stat *sb, int type, int flags, int
/* Thread: scan */ /* Thread: scan */
static void static void
process_file(char *file, struct stat *sb, int type, int flags, int dir_id) process_file(char *file, struct stat *sb, enum file_type file_type, int scan_type, int flags, int dir_id)
{ {
switch (file_type_get(file)) switch (file_type)
{ {
case FILE_REGULAR: case FILE_REGULAR:
process_regular_file(file, sb, type, flags, dir_id); process_regular_file(file, sb, scan_type, flags, dir_id);
counter++; counter++;
@ -826,7 +826,8 @@ process_directory(char *path, int parent_id, int flags)
int is_link; int is_link;
int follow_symlinks; int follow_symlinks;
struct watch_info wi; struct watch_info wi;
int type; int scan_type;
enum file_type file_type;
char virtual_path[PATH_MAX]; char virtual_path[PATH_MAX];
int dir_id; int dir_id;
int ret; int ret;
@ -854,13 +855,13 @@ process_directory(char *path, int parent_id, int flags)
} }
/* Check if compilation and/or podcast directory */ /* Check if compilation and/or podcast directory */
type = 0; scan_type = 0;
if (check_speciallib(path, "compilations")) if (check_speciallib(path, "compilations"))
type |= F_SCAN_TYPE_COMPILATION; scan_type |= F_SCAN_TYPE_COMPILATION;
if (check_speciallib(path, "podcasts")) if (check_speciallib(path, "podcasts"))
type |= F_SCAN_TYPE_PODCAST; scan_type |= F_SCAN_TYPE_PODCAST;
if (check_speciallib(path, "audiobooks")) if (check_speciallib(path, "audiobooks"))
type |= F_SCAN_TYPE_AUDIOBOOK; scan_type |= F_SCAN_TYPE_AUDIOBOOK;
follow_symlinks = cfg_getbool(cfg_getsec(cfg, "library"), "follow_symlinks"); follow_symlinks = cfg_getbool(cfg_getsec(cfg, "library"), "follow_symlinks");
@ -892,6 +893,10 @@ process_directory(char *path, int parent_id, int flags)
continue; continue;
} }
file_type = file_type_get(entry);
if (file_type == FILE_IGNORE)
continue;
ret = read_attributes(resolved_path, entry, &sb, &is_link); ret = read_attributes(resolved_path, entry, &sb, &is_link);
if (ret < 0) if (ret < 0)
{ {
@ -913,7 +918,7 @@ process_directory(char *path, int parent_id, int flags)
else if (!(flags & F_SCAN_FAST)) else if (!(flags & F_SCAN_FAST))
{ {
if (S_ISREG(sb.st_mode) || S_ISFIFO(sb.st_mode)) if (S_ISREG(sb.st_mode) || S_ISFIFO(sb.st_mode))
process_file(resolved_path, &sb, type, flags, dir_id); process_file(resolved_path, &sb, file_type, scan_type, flags, dir_id);
else else
DPRINTF(E_LOG, L_SCAN, "Skipping %s, not a directory, symlink, pipe nor regular file\n", entry); DPRINTF(E_LOG, L_SCAN, "Skipping %s, not a directory, symlink, pipe nor regular file\n", entry);
} }
@ -1245,7 +1250,7 @@ process_inotify_dir(struct watch_info *wi, char *path, struct inotify_event *ie)
} }
else if (ret < 0) else if (ret < 0)
{ {
DPRINTF(E_LOG, L_SCAN, "Directory access to '%s' achieved\n", path); DPRINTF(E_INFO, L_SCAN, "Directory access to '%s' achieved\n", path);
ie->mask |= IN_CREATE; ie->mask |= IN_CREATE;
} }
@ -1278,7 +1283,8 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
char *file = path; char *file = path;
char resolved_path[PATH_MAX]; char resolved_path[PATH_MAX];
char dir_vpath[PATH_MAX]; char dir_vpath[PATH_MAX];
int type; enum file_type file_type;
int scan_type;
int i; int i;
int dir_id; int dir_id;
int fd; int fd;
@ -1287,6 +1293,10 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
DPRINTF(E_DBG, L_SCAN, "File event: 0x%x, cookie 0x%x, wd %d\n", ie->mask, ie->cookie, wi->wd); DPRINTF(E_DBG, L_SCAN, "File event: 0x%x, cookie 0x%x, wd %d\n", ie->mask, ie->cookie, wi->wd);
file_type = file_type_get(path);
if (file_type == FILE_IGNORE)
return;
path_hash = djb_hash(path, strlen(path)); path_hash = djb_hash(path, strlen(path));
if (ie->mask & IN_DELETE) if (ie->mask & IN_DELETE)
@ -1423,13 +1433,13 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
return; return;
} }
type = 0; scan_type = 0;
if (check_speciallib(path, "compilations")) if (check_speciallib(path, "compilations"))
type |= F_SCAN_TYPE_COMPILATION; scan_type |= F_SCAN_TYPE_COMPILATION;
if (check_speciallib(path, "podcasts")) if (check_speciallib(path, "podcasts"))
type |= F_SCAN_TYPE_PODCAST; scan_type |= F_SCAN_TYPE_PODCAST;
if (check_speciallib(path, "audiobooks")) if (check_speciallib(path, "audiobooks"))
type |= F_SCAN_TYPE_AUDIOBOOK; scan_type |= F_SCAN_TYPE_AUDIOBOOK;
dir_id = get_parent_dir_id(file); dir_id = get_parent_dir_id(file);
@ -1441,7 +1451,7 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
} }
else if (S_ISREG(sb.st_mode) || S_ISFIFO(sb.st_mode)) else if (S_ISREG(sb.st_mode) || S_ISFIFO(sb.st_mode))
{ {
process_file(resolved_path, &sb, type, 0, dir_id); process_file(resolved_path, &sb, file_type, scan_type, 0, dir_id);
} }
else else
DPRINTF(E_LOG, L_SCAN, "Skipping %s, not a directory, symlink, pipe nor regular file\n", resolved_path); DPRINTF(E_LOG, L_SCAN, "Skipping %s, not a directory, symlink, pipe nor regular file\n", resolved_path);