diff --git a/src/directory.h b/src/directory.h index 7ffb87d5e..9321e9530 100644 --- a/src/directory.h +++ b/src/directory.h @@ -33,6 +33,7 @@ struct directory { struct dirvec children; struct songvec songs; struct directory *parent; + time_t mtime; ino_t inode; dev_t device; unsigned stat; /* not needed if ino_t == dev_t == 0 is impossible */ diff --git a/src/directory_save.c b/src/directory_save.c index 7b2668bc7..b009b1ef5 100644 --- a/src/directory_save.c +++ b/src/directory_save.c @@ -28,7 +28,7 @@ #include #include -#define DIRECTORY_MTIME "mtime: " /* DEPRECATED, noop-read-only */ +#define DIRECTORY_MTIME "mtime: " #define DIRECTORY_BEGIN "begin: " #define DIRECTORY_END "end: " @@ -41,6 +41,9 @@ directory_save(FILE *fp, struct directory *directory) int retv; if (!directory_is_root(directory)) { + fprintf(fp, DIRECTORY_MTIME "%lu\n", + (unsigned long)directory->mtime); + retv = fprintf(fp, "%s%s\n", DIRECTORY_BEGIN, directory_get_path(directory)); if (retv < 0) @@ -84,8 +87,12 @@ directory_load(FILE *fp, struct directory *directory) strcpy(key, &(buffer[strlen(DIRECTORY_DIR)])); if (!fgets(buffer, sizeof(buffer), fp)) FATAL("Error reading db, fgets\n"); - /* for compatibility with db's prior to 0.11 */ + if (g_str_has_prefix(buffer, DIRECTORY_MTIME)) { + directory->mtime = + g_ascii_strtoull(buffer + sizeof(DIRECTORY_MTIME) - 1, + NULL, 10); + if (!fgets(buffer, sizeof(buffer), fp)) FATAL("Error reading db, fgets\n"); } diff --git a/src/update.c b/src/update.c index d03fc7cb4..78929f7d2 100644 --- a/src/update.c +++ b/src/update.c @@ -360,10 +360,12 @@ update_archive_tree(struct directory *directory, char *name) * * @param parent the parent directory the archive file resides in * @param name the UTF-8 encoded base name of the archive file + * @param st stat() information on the archive file * @param plugin the archive plugin which fits this archive type */ static void update_archive_file(struct directory *parent, const char *name, + const struct stat *st, const struct archive_plugin *plugin) { char *path_fs; @@ -393,6 +395,8 @@ update_archive_file(struct directory *parent, const char *name, directory->device = DEVICE_INARCHIVE; } + directory->mtime = st->st_mtime; + plugin->scan_reset(file); while ((filepath = plugin->scan_next(file)) != NULL) { @@ -438,7 +442,7 @@ update_regular_file(struct directory *directory, } #ifdef ENABLE_ARCHIVE } else if ((archive = archive_plugin_from_suffix(suffix))) { - update_archive_file(directory, name, archive); + update_archive_file(directory, name, st, archive); #endif } } @@ -593,6 +597,8 @@ updateDirectory(struct directory *directory, const struct stat *st) closedir(dir); + directory->mtime = st->st_mtime; + return true; }