diff options
-rw-r--r-- | doc/mpd.conf.5 | 4 | ||||
-rw-r--r-- | doc/mpdconf.example | 6 | ||||
-rw-r--r-- | src/conf.c | 1 | ||||
-rw-r--r-- | src/conf.h | 1 | ||||
-rw-r--r-- | src/inotify_update.c | 33 | ||||
-rw-r--r-- | src/inotify_update.h | 4 | ||||
-rw-r--r-- | src/main.c | 3 |
7 files changed, 44 insertions, 8 deletions
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5 index 48b276d55..e0a30449e 100644 --- a/doc/mpd.conf.5 +++ b/doc/mpd.conf.5 @@ -253,6 +253,10 @@ comments. This specifies the wheter to support automatic update of music database when files are changed in music_directory. The default is to disable autoupdate of database. +.TP +.B auto_update_depth <N> +Limit the depth of the directories being watched, 0 means only watch +the music directory itself. There is no limit by default. .SH REQUIRED AUDIO OUTPUT PARAMETERS .TP .B type <type> diff --git a/doc/mpdconf.example b/doc/mpdconf.example index 1a0547094..3b69e9bb3 100644 --- a/doc/mpdconf.example +++ b/doc/mpdconf.example @@ -118,6 +118,12 @@ # music_directory are changed. # #auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# ############################################################################### diff --git a/src/conf.c b/src/conf.c index bb59373af..ab7be10a7 100644 --- a/src/conf.c +++ b/src/conf.c @@ -94,6 +94,7 @@ static struct config_entry config_entries[] = { { .name = CONF_GAPLESS_MP3_PLAYBACK, false, false }, { .name = CONF_PLAYLIST_PLUGIN, true, true }, { .name = CONF_AUTO_UPDATE, false, false }, + { .name = CONF_AUTO_UPDATE_DEPTH, false, false }, { .name = "filter", true, true }, }; diff --git a/src/conf.h b/src/conf.h index 16360feee..d79a673cc 100644 --- a/src/conf.h +++ b/src/conf.h @@ -70,6 +70,7 @@ #define CONF_GAPLESS_MP3_PLAYBACK "gapless_mp3_playback" #define CONF_PLAYLIST_PLUGIN "playlist_plugin" #define CONF_AUTO_UPDATE "auto_update" +#define CONF_AUTO_UPDATE_DEPTH "auto_update_depth" #define DEFAULT_PLAYLIST_MAX_LENGTH (1024*16) #define DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS false diff --git a/src/inotify_update.c b/src/inotify_update.c index 00600dfb1..1148ebe31 100644 --- a/src/inotify_update.c +++ b/src/inotify_update.c @@ -56,6 +56,7 @@ struct watch_directory { static struct mpd_inotify_source *inotify_source; +static unsigned inotify_max_depth; static struct watch_directory inotify_root; static GTree *inotify_directories; @@ -140,15 +141,21 @@ static bool skip_path(const char *path) static void recursive_watch_subdirectories(struct watch_directory *directory, - const char *path_fs) + const char *path_fs, unsigned depth) { GError *error = NULL; DIR *dir; struct dirent *ent; assert(directory != NULL); + assert(depth <= inotify_max_depth); assert(path_fs != NULL); + ++depth; + + if (depth > inotify_max_depth) + return; + dir = opendir(path_fs); if (dir == NULL) { g_warning("Failed to open directory %s: %s", @@ -209,13 +216,26 @@ recursive_watch_subdirectories(struct watch_directory *directory, tree_add_watch_directory(child); - recursive_watch_subdirectories(child, child_path_fs); + recursive_watch_subdirectories(child, child_path_fs, depth); g_free(child_path_fs); } closedir(dir); } +G_GNUC_PURE +static unsigned +watch_directory_depth(const struct watch_directory *d) +{ + assert(d != NULL); + + unsigned depth = 0; + while ((d = d->parent) != NULL) + ++depth; + + return depth; +} + static void mpd_inotify_callback(int wd, unsigned mask, G_GNUC_UNUSED const char *name, G_GNUC_UNUSED void *ctx) @@ -250,7 +270,8 @@ mpd_inotify_callback(int wd, unsigned mask, } else path_fs = root; - recursive_watch_subdirectories(directory, path_fs); + recursive_watch_subdirectories(directory, path_fs, + watch_directory_depth(directory)); g_free(path_fs); } @@ -271,7 +292,7 @@ mpd_inotify_callback(int wd, unsigned mask, } void -mpd_inotify_init(void) +mpd_inotify_init(unsigned max_depth) { struct directory *root; char *path; @@ -300,6 +321,8 @@ mpd_inotify_init(void) return; } + inotify_max_depth = max_depth; + inotify_root.name = path; inotify_root.descriptor = mpd_inotify_source_add(inotify_source, path, IN_MASK, &error); @@ -315,7 +338,7 @@ mpd_inotify_init(void) inotify_directories = g_tree_new(compare); tree_add_watch_directory(&inotify_root); - recursive_watch_subdirectories(&inotify_root, path); + recursive_watch_subdirectories(&inotify_root, path, 0); mpd_inotify_queue_init(); diff --git a/src/inotify_update.h b/src/inotify_update.h index ee6fbcfd8..92b4e0cc6 100644 --- a/src/inotify_update.h +++ b/src/inotify_update.h @@ -25,7 +25,7 @@ #ifdef HAVE_INOTIFY_INIT void -mpd_inotify_init(void); +mpd_inotify_init(unsigned max_depth); void mpd_inotify_finish(void); @@ -33,7 +33,7 @@ mpd_inotify_finish(void); #else /* !HAVE_INOTIFY_INIT */ static inline void -mpd_inotify_init(void) +mpd_inotify_init(G_GNUC_UNUSED unsigned max_depth) { } diff --git a/src/main.c b/src/main.c index 80102968e..c93a3f615 100644 --- a/src/main.c +++ b/src/main.c @@ -379,7 +379,8 @@ int main(int argc, char *argv[]) success = config_get_bool(CONF_AUTO_UPDATE, false); #ifdef ENABLE_INOTIFY if (success && mapper_has_music_directory()) - mpd_inotify_init(); + mpd_inotify_init(config_get_unsigned(CONF_AUTO_UPDATE_DEPTH, + G_MAXUINT)); #else if (success) g_warning("inotify: auto_update was disabled. enable during compilation phase"); |